Cloud Run, Cloud Functions 또는 App Engine으로 Cloud CDN 설정

이 페이지에서는 서버리스 백엔드로 요청을 라우팅하는 외부 HTTP(S) 부하 분산기를 만드는 방법을 보여줍니다. 여기서 서버리스라는 용어는 서버리스 컴퓨팅 제품인 App Engine, Cloud Functions, Cloud Run을 의미합니다.

서버리스 NEG를 사용하면 외부 HTTP(S) 부하 분산과 함께 Google Cloud 서버리스 앱을 사용할 수 있습니다. 서버리스 NEG 백엔드로 부하 분산기를 구성하면 부하 분산기에 대한 요청이 서버리스 앱 백엔드로 라우팅됩니다.

서버리스 NEG에 대해 자세히 알아보려면 서버리스 NEG 개요를 참조하세요.

시작하기 전에

  1. App Engine, Cloud Functions 또는 Cloud Run 서비스를 배포합니다.
  2. Google Cloud SDK를 아직 설치하지 않았으면 설치합니다.
  3. 권한 구성
  4. SSL 인증서 리소스 추가

App Engine, Cloud Functions 또는 Cloud Run 서비스 배포

이 페이지의 안내에서는 이미 Cloud Run, Cloud Functions 또는 App Engine 서비스가 실행 중이라고 가정합니다.

이 페이지의 예시에서는 Cloud Run Python 빠른 시작을 사용하여 us-central1 리전에 Cloud Run 서비스를 배포했습니다. 이 페이지의 나머지 부분에서는 서버리스 NEG 백엔드를 사용하여 요청을 이 서비스로 라우팅하는 외부 HTTP(S) 부하 분산기를 설정하는 방법을 보여줍니다.

아직 서버리스 앱을 배포하지 않았거나 샘플 앱으로 서버리스 NEG를 사용해 보려면 다음 빠른 시작 중 하나를 사용하세요. 모든 리전에서 서버리스 앱을 만들 수 있지만 나중에 동일한 리전을 사용하여 서버리스 NEG 및 부하 분산기를 만들어야 합니다.

Cloud Run

간단한 Hello World 애플리케이션을 만들고 컨테이너 이미지에 패키징한 다음 컨테이너 이미지를 Cloud Run에 배포하려면 빠른 시작: 빌드 및 배포를 참조하세요.

Container Registry에 이미 업로드된 샘플 컨테이너가 있는 경우 빠른 시작: 사전 빌드된 샘플 컨테이너 배포를 참조하세요.

Cloud Functions

Cloud Functions: Python 빠른 시작을 참조하세요.

App Engine

Python 3용 App Engine 빠른 시작 가이드를 참조하세요.

Google Cloud SDK 설치

gcloud 명령줄 도구를 설치합니다. 도구에 대한 개념 및 설치 정보는 gcloud 개요를 참조하세요.

이전에 gcloud 명령줄 도구를 실행한 적이 없다면 먼저 gcloud init를 실행하여 gcloud 디렉터리를 초기화합니다.

권한 구성

이 가이드를 따르려면 서버리스 NEG를 만들고 프로젝트에 외부 HTTP(S) 부하 분산기를 만들어야 합니다. 이렇게 하려면 프로젝트 소유자 또는 편집자이거나 다음 Compute Engine IAM 역할을 보유해야 합니다.

태스크 필요한 역할
부하 분산기 및 네트워킹 구성요소 만들기 네트워크 관리자
NEG 생성 및 수정 Compute 인스턴스 관리자
SSL 인증서 생성 및 수정 보안 관리자

외부 IP 주소 예약

서비스가 준비되어 실행 중이므로 고객이 부하 분산기에 연결하는 데 사용하는 전역 고정 외부 IP 주소를 설정합니다.

Console

  1. Google Cloud Console의 외부 IP 주소 페이지로 이동합니다.
    외부 IP 주소 페이지로 이동
  2. 고정 주소 예약을 클릭하여 IPv4 주소를 예약합니다.
  3. example-ip이름을 할당합니다.
  4. 네트워크 등급을 프리미엄으로 설정합니다.
  5. IP 버전IPv4로 설정합니다.
  6. 유형전역으로 설정합니다.
  7. 예약을 클릭합니다.

gcloud

gcloud compute addresses create example-ip \
    --ip-version=IPV4 \
    --global

예약된 IPv4 주소를 확인합니다.

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

SSL 인증서 리소스 만들기

HTTPS 부하 분산기를 만들려면 부하 분산기의 프런트엔드에 SSL 인증서 리소스를 추가해야 합니다. Google 관리형 SSL 인증서 또는 자체 관리형 SSL 인증서를 사용하여 SSL 인증서 리소스를 만듭니다.

  • Google 관리형 인증서. Google Cloud는 이러한 인증서를 자동으로 가져오고 관리하며 갱신하므로 Google 관리형 인증서를 사용하는 것이 좋습니다. Google 관리형 인증서를 만들려면 인증서를 프로비저닝할 수 있도록 도메인과 해당 도메인에 대한 DNS 레코드가 있어야 합니다. 도메인이 없으면 Google Domains에서 얻을 수 있습니다. 또한 이전 단게에서 만든 부하 분산기의 IP 주소를 가리키도록 도메인의 DNS A 레코드를 업데이트해야 합니다(example-ip). 자세한 내용은 Google 관리형 인증서 사용을 참조하세요.

  • 자체 서명 인증서. 지금 도메인을 설정하지 않으려면 자체 서명된 SSL 인증서를 사용하여 테스트할 수 있습니다.

이 예시에서는 사용자가 이미 SSL 인증서 리소스를 만들었다고 가정합니다.

SSL 인증서 리소스(또는 Google에서 관리하는 인증서에서 요구하는 도메인)를 만들지 않고 이 프로세스를 테스트하려는 경우에도 이 페이지의 안내에 따라 HTTP 로드를 설정할 수 있습니다.

외부 HTTP(S) 부하 분산기 만들기

다음 다이어그램에서 부하 분산기는 서버리스 NEG 백엔드를 사용하여 서버리스 Cloud Run 서비스로 요청을 전달합니다. 이 예시에서는 Cloud Run Python 빠른 시작을 사용하여 Cloud Run 서비스를 배포했습니다.

Cloud Run 앱의 HTTPS 부하 분산(확대하려면 클릭)
Cloud Run 앱의 HTTPS 부하 분산

서버리스 NEG 백엔드가 있는 백엔드 서비스에는 상태 확인이 지원되지 않으므로 부하 분산기에 서버리스 NEG 백엔드만 있는 경우 상태 확인을 허용하는 방화벽 규칙을 만들 필요가 없습니다.

Console

부하 분산기 이름 지정

  1. Google Cloud Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. HTTP(S) 부하 분산 아래에서 구성 시작을 클릭합니다.
  3. 인터넷 연결 또는 내부 전용 아래에서 인터넷 트래픽을 VM으로 분산을 선택합니다.
  4. 계속을 클릭합니다.
  5. 부하 분산기 이름serverless-lb을 입력합니다.
  6. 계속하려면 창을 열어둡니다.

백엔드 서비스 구성

  1. 백엔드 구성을 클릭합니다.
  2. 백엔드 서비스 만들기 또는 선택 드롭다운 메뉴에서 백엔드 서비스 위로 마우스 포인터를 가져간 후 백엔드 서비스 만들기를 선택합니다.
  3. 이름을 입력합니다.
  4. 백엔드 유형에서 서버리스 네트워크 엔드포인트 그룹을 선택합니다.
  5. 프로토콜은 그대로 둡니다. 이 매개변수는 무시됩니다.
  6. 백엔드새 백엔드 창에서 서버리스 네트워크 엔드포인트 그룹 만들기를 선택합니다.
  7. 이름을 입력합니다.
  8. 리전에서 us-central1을 선택합니다. 그런 후 Cloud Run을 선택합니다.
  9. 서비스 이름 선택을 선택합니다.
  10. 서비스 드롭다운에서 부하 분산기를 만들 Cloud Run 서비스를 선택합니다.
  11. 만들기를 클릭합니다.
  12. 새 백엔드 창에서 완료를 클릭합니다.
  13. Cloud CDN 사용 설정을 선택합니다. 기본 캐시 모드 설정과 TTL 설정을 유지합니다.
  14. 만들기를 클릭합니다.

호스트 규칙 및 경로 일치자 구성

호스트 규칙 및 경로 일치자는 외부 HTTP(S) 부하 분산기의 URL 맵 구성요소입니다.

  1. 호스트 및 경로 규칙을 클릭합니다.
  2. 기본 호스트 및 경로를 유지합니다. 이 예시에서는 모든 요청이 이전 단계에서 생성된 백엔드 서비스로 이동합니다.

프런트엔드 구성

  1. 프런트엔드 구성을 클릭합니다.
  2. 이름을 입력합니다.
  3. HTTPS 부하 분산기를 만들려면 SSL 인증서(gcloud compute ssl-certificates list)가 있어야 합니다. 이전에 설명된 대로 Google 관리형 인증서를 사용하는 것이 좋습니다. 외부 HTTP(S) 부하 분산기를 구성하려면 다음과 같이 필드를 채웁니다.

    다음 옵션이 이러한 값으로 구성되었는지 확인합니다.

    속성 값(값 입력 또는 지정된 옵션 선택)
    프로토콜 HTTPS
    네트워크 서비스 계층 프리미엄
    IP 버전 IPv4
    IP 주소 example-ip
    포트 443
    인증서 기존 SSL 인증서를 선택하거나 새 인증서를 만듭니다.

    HTTPS 부하 분산기를 만들려면 HTTPS 프록시에서 사용할 SSL 인증서 리소스가 있어야 합니다. Google 관리형 SSL 인증서 또는 자체 관리형 SSL 인증서를 사용하여 SSL 인증서 리소스를 만들 수 있습니다.
    Google 관리형 인증서를 만들려면 도메인이 있어야 합니다. 도메인의 A 레코드는 부하 분산기의 IP 주소(이 예시에서는 example-ip)로 확인되어야 합니다. Google Cloud는 이러한 인증서를 자동으로 가져오고 관리 및 갱신하므로 Google 관리형 인증서를 사용하는 것이 좋습니다. 도메인이 없는 경우 자체 서명 SSL 인증서를 사용하여 테스트할 수 있습니다.

  4. 완료를 클릭합니다.

구성 검토

  1. 검토 및 완료를 클릭합니다.
  2. 백엔드, 호스트 및 경로 규칙프런트엔드를 검토합니다.
  3. 만들기를 클릭합니다.
  4. 부하 분산기가 생성될 때까지 기다립니다.
  5. 부하 분산기의 이름을 클릭합니다(serverless-lb).
  6. 다음 작업을 위해 부하 분산기의 IP 주소를 기록합니다. 이를 IP_ADDRESS라고 합니다.

gcloud

  1. 서버리스 앱을 위한 서버리스 NEG를 만듭니다. Cloud Run 서비스로 서버리스 NEG를 만들려면 다음 안내를 따르세요.

    gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
        --region=us-central1 \
        --network-endpoint-type=serverless  \
        --cloud-run-service=CLOUD_RUN_SERVICE_NAME
    
    다른 옵션을 보려면 gcloud compute network-endpoint-groups creategcloud 참조 가이드를 참조하세요.
  2. 백엔드 서비스를 만듭니다.
    gcloud compute backend-services create BACKEND_SERVICE_NAME \
        --global \
        --enable-cdn \
        --cache-mode=CACHE_MODE \
        --custom-response-header='Cache-Status: {cdn_cache_status}' \
        --custom-response-header='Cache-ID: {cdn_cache_id}'
    

    CACHE_MODE를 다음 중 하나로 바꿉니다.

    • CACHE_All_STATIC(기본값): 정적 콘텐츠를 자동으로 캐시합니다. 캐시할 수 없다고 표시된 응답(Cache-Control 응답 헤더의 private, no-store 또는 no-cache 지시문)은 캐시되지 않습니다. 동적 콘텐츠를 캐시하려면 콘텐츠에 유효한 캐싱 헤더가 있어야 합니다. 이는 모든 새로운 Cloud CDN이 사용 설정된 백엔드의 기본 동작입니다.

    • USE_ORIGIN_HEADERS: 원본에서 콘텐츠를 캐시하도록 유효한 캐싱 헤더를 설정해야 합니다. 이 헤더가 없는 응답은 Google 에지에서 캐시되지 않으며 요청마다 원본으로 완전히 이동해야 하므로 성능이 영향을 받고 원본 서버의 부하가 증가합니다. 이는 모든 기존 Cloud CDN이 사용 설정된 백엔드의 기본 동작입니다.

    • FORCE_CACHE_ALL: Cache-Control 응답 헤더의 private, no-store 또는 no-cache 지시문을 무시하고 모든 콘텐츠를 캐시합니다. 이로 인해 사용자별 비공개(사용자 식별 가능) 콘텐츠를 캐시할 수 있습니다. Cloud Storage 버킷과 같이 비공개 또는 동적 콘텐츠를 제공하지 않는 백엔드에서만 이 모드를 사용 설정해야 합니다.

    Cloud CDN에서 인식하는 캐시 지시문과 Cloud CDN에서 캐시되지 않는 캐시 지시문은 캐시 가능한 콘텐츠캐시할 수 없는 콘텐츠를 참조하세요.

  3. 서버리스 NEG를 백엔드 서비스에 백엔드로 추가합니다.

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --global \
        --network-endpoint-group=SERVERLESS_NEG_NAME \
        --network-endpoint-group-region=us-central1
    
  4. 수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵을 만듭니다.
    gcloud compute url-maps create URL_MAP_NAME \
        --default-service BACKEND_SERVICE_NAME
    

    이 예시 URL 맵은 단일 서버리스 앱을 나타내는 백엔드 서비스 하나만 대상으로 지정하므로, 호스트 규칙 또는 경로 일치자를 설정할 필요가 없습니다. 백엔드 서비스가 두 개 이상인 경우 호스트 규칙을 사용하여 호스트 이름에 따라 다른 서비스로 요청을 전달하고, 경로 일치자를 설정하여 요청 경로에 따라 다른 서비스로 요청을 전달할 수 있습니다.

  5. HTTPS 부하 분산기를 만들려면 HTTPS 대상 프록시에서 사용할 SSL 인증서 리소스가 있어야 합니다. Google 관리형 SSL 인증서 또는 자체 관리형 SSL 인증서를 사용하여 SSL 인증서 리소스를 만들 수 있습니다. Google Cloud는 이러한 인증서를 자동으로 가져오고 관리하며 갱신하므로 Google 관리형 인증서를 사용하는 것이 좋습니다.

    Google 관리형 인증서를 만들려면 도메인이 있어야 합니다. 도메인이 없는 경우 자체 서명 SSL 인증서를 사용하여 테스트할 수 있습니다.

    Google 관리형 SSL 인증서 리소스를 만들려면 다음 안내를 따르세요.

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
        --domains DOMAIN
    

    자체 관리형 SSL 인증서 리소스를 만들려면 다음을 사용하세요.

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
        --certificate CRT_FILE_PATH \
        --private-key KEY_FILE_PATH
    

  6. 요청을 URL 맵으로 라우팅하기 위해 대상 HTTP(S) 프록시를 만듭니다.

    HTTPS 부하 분산기의 경우 HTTPS 대상 프록시를 만듭니다. 프록시는 HTTPS 부하 분산을 위해 SSL 인증서를 포함하는 부하 분산기의 일부분이므로 이 단계에서 인증서도 로드합니다.

    gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
        --ssl-certificates=SSL_CERTIFICATE_NAME \
        --url-map=URL_MAP_NAME
    

  7. 수신되는 요청을 프록시로 라우팅하는 전역 전달 규칙을 만듭니다.

    HTTPS 부하 분산기의 경우:

    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
        --address=example-ip \
        --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
        --global \
        --ports=443
    

부하 분산기의 IP 주소를 사용하도록 도메인의 DNS 레코드 업데이트

기존 커스텀 도메인 URL로 전송된 트래픽이 대신 부하 분산기를 통해 라우팅되도록 부하 분산기의 IP 주소를 가리키도록 도메인의 DNS A 또는 AAAA 레코드를 아직 업데이트하지 않았으면 지금 업데이트합니다.

예를 들어 example.com 커스텀 도메인이 있고 모든 서비스가 이 도메인에 매핑된 경우, example.com이 부하 분산기의 IP 주소를 가리키도록 DNS A 또는 AAAA 레코드를 업데이트해야 합니다.

DNS 레코드를 업데이트하기 전에 커스텀 도메인의 로컬 DNS 확인을 부하 분산기의 IP 주소로 강제 실행하여 구성을 로컬에서 테스트할 수 있습니다. 로컬에서 테스트하려면 로컬 머신의 /etc/hosts/ 파일을 수정하여 example.com이 부하 분산기의 IP 주소를 가리키도록 하거나 curl --resolve 플래그를 사용하여 curl이 요청에 대한 부하 분산기의 IP를 사용하도록 강제합니다.

example.com의 DNS 레코드가 HTTPS 부하 분산기의 IP 주소로 확인되면 example.com으로 전송된 요청이 부하 분산기를 통해 라우팅됩니다. 부하 분산기는 URL 맵에 따라 관련 백엔드 서비스로 요청을 전달합니다. 또한 백엔드 서비스가 URL 마스크로 구성된 경우 서버리스 NEG는 마스크를 사용하여 요청을 적절한 Cloud Run, Cloud Functions 또는 App Engine 서비스로 라우팅합니다.

Google 관리형 인증서를 사용하는 경우 기존 서비스를 외부 HTTP(S) 부하 분산기로 마이그레이션하면 보통 1시간 이하인 다운타임이 발생할 수 있습니다. 이는 부하 분산기의 IP 주소를 가리키도록 DNS 레코드를 업데이트할 때까지 외부 HTTP(S) 부하 분산기의 SSL 인증서가 프로비저닝되지 않기 때문입니다.

부하 분산기 테스트

부하 분산기를 구성했으므로 부하 분산기의 IP 주소로 트래픽을 전송할 수 있습니다. 도메인을 구성한 경우 트래픽을 도메인 이름으로도 전송할 수 있습니다. 하지만 DNS 전파는 완료하는 데 시간이 오래 걸릴 수 있으므로, IP 주소를 사용하여 테스트를 시작할 수 있습니다.

  1. Google Cloud Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. 방금 만든 부하 분산기를 클릭합니다.
  3. 부하 분산기의 IP 주소를 확인합니다.
  4. HTTPS 부하 분산기의 경우 https://IP_ADDRESS로 이동하여 웹브라우저를 사용해서 부하 분산기를 테스트할 수 있습니다. IP_ADDRESS부하 분산기의 IP 주소로 바꿉니다. helloworld 서비스 홈페이지로 이동해야 합니다.

    그래도 문제가 해결되지 않고 Google 관리형 인증서를 사용 중인 경우 인증서 리소스가 활성 상태인지 확인합니다. 자세한 내용은 Google이 관리하는 SSL 인증서 리소스 상태를 참조하세요.

    자체 서명 인증서를 테스트에 사용하면 브라우저에 경고가 표시됩니다. 브라우저가 자체 서명 인증서를 수락하도록 명시적으로 지시해야 합니다. 실제 페이지를 보려면 경고를 클릭하세요.

  5. 캐시 응답을 확인하려면 로컬 머신의 명령줄에서 curl을 사용합니다. IP_ADDRESS부하 분산기의 IPv4 주소로 바꿉니다.

    curl -v -o/dev/null https://IP_ADDRESS
    

    Google 관리형 인증서를 사용하는 경우 부하 분산기의 IP 주소를 가리키는 도메인을 테스트합니다. 예를 들면 다음과 같습니다.

    curl -v -o/dev/null -k -s 'https://DOMAIN:443' --connect-to DOMAIN:443:IP_ADDRESS:443
    

    자체 서명 인증서를 사용하는 경우 -k 플래그도 지정해야 합니다. 자체 서명 인증서가 있는 경우 curl -k 옵션을 사용하면 curl이 작동합니다. 자체 사이트를 테스트할 때는 -k 매개변수만 사용해야 합니다. 일반적인 상황에서는 유효한 인증서가 중요한 보안 수단이므로 인증서 경고를 무시하면 안 됩니다.

    출력에는 응답이 캐시에서 제공되었는지 여부를 나타내기 위해 구성한 커스텀 헤더 Cache-IDCache-Status가 포함되어야 합니다.

    HTTP/2 200
    cache-status: hit
    cache-id: SEA-b9fa975e
    

    출력에는 캐시 적중이 있음을 나타내는 응답 헤더가 포함됩니다. 이는 서버리스 앱의 정적 애셋이 Cloud CDN 에지 캐시에서 사용자에게 제공되었음을 의미합니다.

    cache-status 헤더는 Cloud CDN에 캐시되지 않은 응답에 disabled 값을 표시합니다. 캐시된 응답의 경우 cache-status 헤더 값은 hit, miss 또는 revalidated입니다.

Cloud CDN 중지

Console

단일 백엔드 서비스에 Cloud CDN 중지

  1. Google Cloud Console에서 Cloud CDN 페이지로 이동합니다.

    Cloud CDN 페이지로 이동

  2. 원본 행의 오른쪽에서 메뉴 를 클릭한 후 수정을 선택합니다.
  3. Cloud CDN 사용을 중지할 백엔드 서비스의 체크박스를 선택 취소합니다.
  4. 업데이트를 클릭합니다.

원본의 모든 백엔드 서비스에 대한 Cloud CDN 삭제

  1. Cloud Console에서 Cloud CDN 페이지로 이동합니다.

    Cloud CDN 페이지로 이동

  2. 원본 행의 오른쪽에서 메뉴 를 클릭한 후 제거를 선택합니다.
  3. 삭제를 클릭하여 확인합니다.

gcloud

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --no-enable-cdn

Cloud CDN 사용을 중지해도 캐시가 무효화되거나 삭제되지 않습니다. Cloud CDN 사용을 중지했다가 다시 사용하면 대부분 또는 모든 캐시된 콘텐츠가 여전히 캐시될 수 있습니다. 캐시가 콘텐츠를 사용하지 못하게 하려면 해당 콘텐츠를 무효화해야 합니다.

다음 단계