[GCP]DNS 부터 하나씩 해보는 Google cloud 로 서비스 해보기 — 3탄 Cloud CDN

이정운 (Jungwoon Lee)
10 min readAug 10, 2019

--

안녕하세요 이정운 입니다.

지난 시간까지 Cloud DNS 와 Google Cloud Load Balancing(GCLB) 를 간단하게 살펴봤으며 이번에는 해당 이야기에 이어서 좀 더 정적인 서비스를 빠르고 효율적으로 하기 위한 Cloud CDN 까지 살펴보는 시간을 가지도록 하겠습니다.

Cloud CDN 은 이름 그대로 Google cloud 에서 제공하는 CDN(Content Delivery Network) 솔루션으로서 세계 각지에 접속 지점을 보유한 Google 의 네트워크 망을 활용하여, Google Compute Engine(GCE) 과 Google Cloud Storage(GCS) 를 기반으로 하는 웹사이트와 애플리케이션에 대한 콘텐츠 전송을 가속화 할 수 있는 기능을 제공합니다. Cloud CDN 을 활용하게 되면 이미지와 같은 정적 컨텐츠에 대해서 네트워크 지연 시간을 줄이고 원본에 걸리는 부하를 분산하거나 제공 비용을 절감할 수 있습니다.

https://cloud.google.com/cdn/?hl=ko

특히나, GCLB 이야기에서도 잠깐 언급했었는데 HTTP(S) 부하 분산을 설정할 때 백엔드 서비스나 버킷을 생성해야 하는데 이때 해당 설정의 체크박스에 클릭만 하면 아주 간단하게 Cloud CDN 을 사용할 수 있다는 장점을 가지고 있습니다.

그럼 지금부터 하나씩 하나씩 실제 테스트를 해보면서 살펴볼까요?

#1) Cloud CDN 을 위한 백엔드 버킷 추가 하기

Cloud CDN 을 사용하려면 GCLB 를 통해서 서비스가 수행되어야 하는 조건이 있는데 이를 다시 조금 더 쉽게 설명하자면 백엔드 서비스나 백엔드 버킷의 컨텐츠만이 Cloud CDN 의 대상이 될 수 있다라는 이야기 입니다. 일반적으로는 GCS 에 이미지와 같은 정적 컨텐츠등을 두고 서비스 하는 형태인 백엔드 버킷이 많이 활용되므로 이번 이야기도 이를 기준으로 진행하도록 하겠습니다.

지난 시간에 사용한 설정 그대로에서 Cloud CDN 테스트를 위한 백엔드 버컷을 추가해 보도록 하겠습니다. HTTP(s) 부하 분산기를 수정하게 되면 하단과 같이 “백엔드 구성” 메뉴에서 백엔드 버킷을 추가할 수 있습니다.

백엔드 버컷은 이름 그대로 GCS 버킷을 의미하므로 정적 컨텐츠가 보관될 GCS 버킷의 위치를 명시하고 Cloud CDN 사용 설정 여부만 체크하면 됩니다.

다음으로 “호스트 및 경로 규칙” 메뉴에서 새로운 호스트 및 경로 규칙을 추가하며 그 백엔드로 지금 생성한 백엔드 버킷을 추가 합니다. 이때 해당 GCLB 로 들어오는 모든 호스트를 의미하는 “*” 설정과 경로 부분에 “/images/*” 를 추가합니다.

위의 설정이 추가되면 호스트로 들어오는 /images/* 경로의 요청은 모두 백엔드 버킷으로 라우팅한다는 의미 입니다. 이를 조금 더 쉽게 설명 드려보면 “https://www.freejava.co.kr/images/test.jpg” 라는 요청이 들어온다면 이 요청은 백엔드 버킷에서 해당 “test.jpg” 라는 정적 컨텐츠가 있는지 확인하고 있으며 이를 반환해주겠다는 의미입니다.

이때 주의할 점이 있는데 /images/* 경로를 지정할때 이게 GCS 버킷 구조여야 한다는 점입니다. 예를 들어 /images/test.jpg 라는 요청이 들어왔을때 지정된 GCS 버킷에서 test.jpg 를 찾는 것이 아니라 경로 그대로 /images/test.jpg 를 찾는 다는 것은 유념해 두시면 좋을듯 합니다.

마지막으로 설정 부분 변경이 잘 반영 되었는지 확인합니다.

#2) Cloud CDN 을 위한 백엔드 버킷 설정

이전 파트에서 연동한 백엔드 버킷을 이용해서 실제 Cloud CDN 서비스를 수행하려면 하단과 같은 조건을 충족할 수 있어야 합니다.

https://cloud.google.com/cdn/docs/caching

그냥 읽어보면 조건이 복잡한 것처럼 보이지만 백엔드 버킷의 경우에는 크게 공개적 표시와 Cache-Control 헤더 추가를 수행하면 됩니다.

우선 가장 먼저 다양한 사람들이 공개적으로 접근할 수 있도록 해야 합니다. 이를 위해서 GCS 버킷을 생성한 폴더에서 해당 버킷을 선택하고 우측에 햄버거 메뉴에서 ‘버킷 권한 수정’ 메뉴를 클릭하여 구성원 추가를 수행합니다. 다시말해서 ‘allUsers’ 를 새 구성원으로 넣어주고 역할은 ‘저장소 개체 뷰어’를 선택하여 해당 역할을 GCS 버킷 자체에 추가합니다.

정상적으로 수정되었으면 하단과 같이 해당 GCS 버킷이 ‘공개’로 변경된 것을 확인할 수 있습니다.

다음으로 images 폴더안에 CDN 에서 사용될 다양한 이미지 파일을 업로드 합니다. (기 언급한 것처럼 GCLB 에 ‘ /images/*’ 경로를 사용했기 때문에 images 폴더를 두고 그 안에 이미지를 업로드 해야 합니다.)

그리고 실제 해당 이미지 파일을 CDN 에서 사용하려면 이미지 파일을 다시 공개로 해주어야 합니다.(이전에는 폴더 권한이고 이번에는 오브젝트 권한) GCS 버킷에서 수행한 방식과 동일하게 해당 이미지 파일의 우측 햄버그 메뉴에서 ‘권한 수정’을 클릭한 후 하단과 같이 항목에 ‘사용자’, 이름에 ‘allUsers’, 액세스에 ‘리더’ 를 선택하여 추가하면 됩니다.

이렇게 다양한 사용자가 해당 오브젝트에 접근 가능하게 한 후에 메타 데이터에 “Cache-Control:public” 헤더를 추가합니다. 수작업을 통해서 하나씩 해도 되며 하단과 같이 gsutil 명령어를 이용해서 한번에 수행해도 됩니다.

gsutil -m setmeta -h "Cache-Control:public" gs://cdn-test01/images/*

이렇게 사전 작업을 수행한 후에 DNS 에 지정한 도메인으로 ‘ /images/’ 경로를 가지고 이미지 파일을 호출하면 하단과 같이 정상적으로 이미지를 반환하는 것을 확인할 수 있습니다.

https://www.freejava.co.kr/images/IMG_1976.JPG

특히, Stackdriver logging 을 통해서 Cloud CDN 사용 여부를 확인할 수 있는데 Stackdriver logging 메뉴로 가서 Cloud HTTP 부하 분산기 > 생성한 forwarding rule 이름 > 생성한 url map 이름을 하단과 같이 선택하시면 됩니다.

그러면 Cloud CDN 로그를 확인하실 수 있으며 제일 처음 호출은 200 정상 코드를 반환하는 것을 확인할 수 있습니다.

그 이후에 연달아서 호출을 해보면 CDN 에 캐시되어 있는 것을 그대로 반환하기 때문에 304 Not modified 코드를 확인 가능합니다. 또한, 로그의 상세 내역을 확인하시면 “cacheHit: true” 가 포함된 것을 보실 수 있습니다.

#3) Cloud CDN 테스트 해보기

CDN 이 정상 동작하는 것을 확인했으니 실제 서비스에 연동하는 것을 확인하기 위해 간단하게 Nginx 의 기본 페이지를 수정해보도록 하겠습니다. Nginx 가 설치된 GCE 로 가서 기본 페이지가 있는 폴더로 이동 합니다.

그 후 기본 html 페이지에 간단하게 이미지를 표시해주는 부분을 하단과 같이 추가합니다. 이때 경로는 상대경로로 지정하고 상단에서 라우팅 경로에 넣어주었던 ‘/images’ 가 포함된 형태로 지정하시면 됩니다.

수정 후에 “https://www.freejava.co.kr” 을 브라우저로 호출하면 하단과 같이 기본 Nginx 페이지에 이미지가 같이 나오는 것을 확인 가능합니다.

추가적으로 이전 파트에서도 확인했지만 Stackdriver logging 에서 하단과 같은 로그를 확인 가능합니다.

Tip #1) CDN 에 캐시되어 있는 이미지를 ‘캐시 무효화’ 기능을 통해서 무효화 가능하며 경로를 선택하거나 해당 이미지를 직접 지정 가능합니다.

캐시 무효화의 경우에는 일정 시간이 필요하오니 참고하시기 바라겠습니다. (테스트 시에는 약 10분 정도 소요가 되었습니다.)

Tip #2) Cloud CDN 이 정상 동작되면 하단과 같이 모니터링 화면을 통해서 CDN 에 얼마나 많은 이미지가 캐시되었고 사용되었는지 확인이 가능합니다.

여기까지 잘 따라오셨다면 맨 처음에 언급한 것처럼 Cloud DNS 와 GCLB 에 이어서 정적인 서비스를 빠르고 효율적으로 하기 위한 Cloud CDN 까지 잘 살펴보신 것입니다. 해보시면 아시겠지만 그리 어렵지 않게 Cloud CDN 을 설정하고 바로 사용해보실 수 있습니다. 이번 이야기는 여기서 마무리 하도록 하겠으며 다음 이야기로 곧 찾아 뵙겠습니다. 그럼 이만 휘리릭~~~

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

참고 자료 #1

Cloud CDN 문서
https://cloud.google.com/cdn/docs/?hl=ko

캐시 세부정보
https://cloud.google.com/cdn/docs/caching?hl=ko

Cloud CDN: Delighting Users with Low Latency, Intelligent Media and Web Delivery
https://www.youtube.com/watch?v=Bnt3S9F2k3I

--

--

이정운 (Jungwoon Lee)

Technical engineer who dreams better future. (These thoughts are my own personal opinions, and do not reflect or represent Google’s opinions or plans.)