Cloud Load Balancing으로 App Engine 커스텀 도메인 마이그레이션

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

이 가이드에서는 Cloud Load Balancing을 사용하여 App Engine 앱의 새 공개 엔드포인트를 설정하는 방법을 설명합니다.

Cloud Load Balancing을 사용하면 커스텀 도메인 엔드포인트를 프런트엔드 서비스로 구성하고 서버리스 네트워크 엔드포인트 그룹(NEG)을 사용하여 App Engine 앱을 백엔드 서비스로 구성할 수 있습니다. Cloud Load Balancing 프런트엔드 서비스의 엔드포인트에 대한 트래픽은 앱의 dispatch.yaml 파일에 정의한 모든 라우팅 규칙을 포함하여 이전과 동일한 방식으로 라우팅됩니다.

다음 다이어그램은 앱 변경사항을 설명합니다.

App Engine 커스텀 도메인을 가져와서 수신되는 요청을 백엔드 App Engine 서비스에 배포하는 Cloud Load Balancing 프런트엔드 서비스로 전환합니다.

Cloud Load Balancing으로 마이그레이션하면 Cloud Storage에서 정적 콘텐츠를 제공하거나 Cloud Run 및 Google Kubernetes Engine과 같은 다른 컴퓨팅 플랫폼에서 실행되는 서비스를 추가하는 등 도메인에 도달할 때 트래픽을 처리하는 방식에서 훨씬 유연성을 높일 수 있습니다.

또한 App Engine에서 사용할 수 없는 다음과 같은 주요 Google Cloud 기능에 액세스할 수 있습니다.

  • Google Cloud Armor: 고급 DDoS 보호, IP 기반 및 지역 기반 액세스 제어, 웹 애플리케이션 방화벽 규칙 등으로 보안 강화
  • Cloud CDN: 캐시된 콘텐츠 전송
  • SSL 정책: 앱에서 허용하는 SSL 기능 및 TLS 버전 관리

이 가이드에서는 수신되는 요청을 커스텀 도메인을 사용하는 App Engine 서비스에서 Cloud Load Balancing 프런트엔드 서비스로 전환하는 설정에 대해 설명합니다.

  1. 필수 권한이 있는지 확인
  2. Google 관리형 인증서 만들기
  3. Cloud Load Balancing 구성
  4. 부하 분산기 테스트
  5. 부하 분산기에 도메인 연결
  6. App Engine 커스텀 도메인 매핑 삭제
  7. Cloud Load Balancing을 통한 액세스만 허용하도록 인그레스 제어 설정

시작하기 전에

App Engine 설정에 커스텀 도메인이 구성된 App Engine 앱이 있어야 합니다.

권한 구성

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

작업 필요한 역할
인증서 관리자를 사용하여 Google 관리형 SSL 인증서 만들기 인증서 관리자 소유자 또는 인증서 관리자 편집자Compute 부하 분산기 관리자
커스텀 도메인의 DNS 레코드 업데이트 Cloud DNS를 DNS 솔루션으로 사용하는 경우 Cloud DNS 관리자.

다른 DNS 제공업체를 사용하는 경우 커스텀 도메인의 DNS 레코드를 추가하고 업데이트할 수 있는 권한이 필요합니다.
부하 분산기 및 네트워킹 구성요소 만들기 Compute 네트워크 관리자
NEG 생성 및 수정 Compute 인스턴스 관리자
SSL 인증서 생성 및 수정 Compute 보안 관리자
App Engine 설정에서 커스텀 도메인 삭제 App Engine 관리자 역할 또는 appengine.applications.update 권한이 포함된 역할

Google 관리형 SSL 인증서 만들기

Google 관리형 SSL 인증서(문서에서는 TLS 인증서라고도 함)를 사용하면 Google Cloud에서 자동으로 인증서를 가져오고 관리하며 갱신할 수 있습니다. 기존 App Engine 서비스에 다운타임을 일으키지 않고 Cloud Load Balancing 프런트엔드로 마이그레이션하려면 인증서 관리자를 사용하여 DNS 승인 및 Google 관리형 인증서를 만들어야 합니다.

Cloud Load Balancing 문서에는 Google 관리형 SSL 인증서 만들기에 대한 유사한 안내가 나와 있지만, 해당 안내에서는 로드 밸런서 승인을 사용하므로 App Engine 서비스의 다운타임이 최대 몇 시간까지 지속될 수 있습니다. 자세한 내용은 Google 관리형 인증서의 도메인 승인을 참조하세요.

앱의 다운타임을 방지하려면 이 페이지의 단계를 따르세요.

DNS 승인 만들기

  1. 다음 명령어를 실행하여 인증서 관리자에서 DNS 승인을 만듭니다.

    gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
        --domain="DOMAIN_NAME"
    gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
    

    다음을 바꿉니다.

    • AUTHORIZATION_NAME은 이 DNS 승인을 설명하는 고유한 이름입니다.
    • DOMAIN_NAME은 이 DNS 승인을 만들 App Engine 커스텀 도메인 이름입니다.
  2. gcloud 명령어에서 반환된 CNAME를 확인합니다. 다음 단계에서 DNS 레코드를 업데이트하는 데 사용해야 합니다.

DNS 구성에 CNAME 레코드 추가

Cloud DNS 또는 타사 DNS 솔루션을 사용하는지에 따라 사용 사례에 적합한 안내를 따르세요.

Cloud DNS

DNS 승인을 만들면 gcloud 명령어가 해당 CNAME 레코드를 반환합니다. 다음과 같이 대상 도메인의 DNS 영역에 있는 DNS 구성에 이 CNAME 레코드를 추가해야 합니다.

  1. DNS 레코드 트랜잭션을 시작합니다.

    gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
    

    DNS_ZONE_NAME을 공개 DNS 영역의 이름으로 바꿉니다. Google Cloud를 사용하여 도메인을 관리하고 해당 도메인에 대한 트래픽을 수신하는 경우 공개 DNS 영역을 이미 만든 것입니다. 공개 DNS 영역을 보려면 관리형 영역 나열 및 설명을 참조하세요.

  2. 대상 DNS 영역에 CNAME 레코드를 추가합니다.

    gcloud dns record-sets transaction add CNAME_RECORD \
      --name="_acme-challenge.DOMAIN_NAME." \
      --ttl="30" \
      --type="CNAME" \
      --zone="DNS_ZONE_NAME"
    

    다음을 바꿉니다.

    • CNAME_RECORD해당 DNS 승인을 만든 gcloud 명령어가 반환하는 CNAME 레코드의 전체 값입니다.
    • DOMAIN_NAME은 App Engine 커스텀 도메인 이름입니다. 대상 도메인 이름 뒤에 후행 마침표를 포함해야 합니다.
    • DNS_ZONE_NAME은 이전의 대상 DNS 영역의 이름입니다.
  3. DNS 레코드 트랜잭션을 실행하여 변경사항을 저장합니다.

    gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
    

    DNS_ZONE_NAME을 이전의 대상 DNS 영역의 이름으로 바꿉니다.

기타 DNS 솔루션

이전 섹션의 (호스트) 이름(_acme-challenge.DOMAIN_NAME) 및 데이터 필드를 사용하여 CNAME 레코드를 도메인의 DNS 구성에 추가합니다. 타사 DNS 솔루션 문서를 참조하세요.

DNS 승인을 참조하는 Google 관리형 인증서 만들기

이전 단계에서 만든 DNS 승인을 참조하는 Google 관리형 인증서를 만들려면 다음 명령어를 실행합니다.

  1. Google 관리형 인증서를 만듭니다.

    gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains=DOMAIN_NAME --dns-authorizations=AUTHORIZATION_NAME
    

    다음을 바꿉니다.

    • CERTIFICATE_NAME은 인증서를 설명하는 고유한 이름입니다.
    • DOMAIN_NAME은 App Engine 커스텀 도메인 이름입니다.
    • AUTHORIZATION_NAME은 이전에 만든 DNS 승인의 이름입니다.
  2. 인증서가 활성 상태인지 확인합니다.

    다음 명령어를 사용하여 부하 분산기에 배포하기 전에 인증서 자체가 활성 상태인지 확인합니다. 인증서 상태가 ACTIVE 상태로 변경되기까지 최대 몇 시간이 걸릴 수 있습니다.

    gcloud certificate-manager certificates describe CERTIFICATE_NAME
    

    CERTIFICATE_NAME을 이전에 만든 Google 관리형 인증서의 이름으로 바꿉니다.

    gcloud 도구는 다음과 유사한 출력을 반환합니다.

    certificatePem: myPEM
    createTime: '2021-10-20T12:19:53.370778666Z'
    expireTime: '2022-05-07T05:03:49Z'
    managed:
      authorizationAttemptInfo:
      - domain: example.com
        state: AUTHORIZED
      dnsAuthorizations:
      - projects/my-project/locations/global/dnsAuthorizations/myAuth
      domains:
      - example.com
      state: ACTIVE
    name: projects/myProject/locations/global/certificates/myCert
    scope: myScope
    sanDnsnames:
    - example.com
    updateTime: '2021-10-20T12:19:55.083385630Z'
    

    gcloud 도구가 다른 출력을 반환하는 경우 인증서 관리자 문제 해결을 참조하세요.

인증서 맵 만들기

  1. 인증서 맵을 만듭니다.

    gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
    

    CERTIFICATE_MAP_NAME을 인증서 맵을 설명하는 고유한 이름으로 바꿉니다.

  2. 인증서 맵 항목을 만들고 이전의 인증서 및 인증서 맵과 연결합니다.

    gcloud certificate-manager maps entries create CERTIFICATE_MAP_ENTRY_NAME \
        --map=CERTIFICATE_MAP_NAME \
        --certificates=CERTIFICATE_NAME \
        --set-primary
    

    다음을 바꿉니다.

    • CERTIFICATE_MAP_ENTRY_NAME은 이 인증서 맵 항목을 설명하는 고유한 이름입니다.
    • CERTIFICATE_MAP_NAME은 이 인증서 맵 항목이 연결된 인증서 맵의 이름입니다.
    • CERTIFICATE_NAME은 이 인증서 맵 항목과 연결할 인증서의 이름입니다.

    도메인 이름이 지정되지 않은 경우 인증서가 기본 인증서로 사용되도록 --set-primary 플래그를 추가할 수 있습니다.

  3. 인증서 맵이 활성 상태인지 확인합니다.

    다음 명령어를 사용하여 해당 인증서 맵을 대상 프록시에 연결하기 전에 인증서 맵 항목이 활성 상태인지 확인합니다.

    gcloud certificate-manager maps entries describe CERTIFICATE_MAP_ENTRY_NAME \
        --map=CERTIFICATE_MAP_NAME
    

    다음을 바꿉니다.

    • CERTIFICATE_MAP_ENTRY_NAME은 이전의 인증서 맵 항목 이름입니다.
    • CERTIFICATE_MAP_NAME은 이 인증서 맵 항목이 연결되는 인증서 맵 이름입니다.

    gcloud 도구는 다음과 유사한 출력을 반환합니다.

    createTime: '2021-09-06T10:01:56.229472109Z'
    name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry
    state: ACTIVE
    updateTime: '2021-09-06T10:01:58.277031787Z'
    

인증서 관리자 사용에 대한 자세한 내용은 인증서 관리자 작동 방식을 참조하세요.

Cloud Load Balancing 구성

Google 관리형 인증서가 있으면 App Engine 커스텀 도메인을 Cloud Load Balancing 프런트엔드 서비스로 바꿀 수 있습니다.

다음 다이어그램은 단일 백엔드 서비스와 서버리스 NEG가 있는 HTTPS 부하 분산기를 보여줍니다.

App Engine 앱에 트래픽 분산

전달 규칙은 외부 IP 주소에서 수신되는 요청을 라우팅하고 대상 HTTPS 프록시로 요청을 전달합니다. HTTPS 부하 분산기는 URL 맵을 사용하여 App Engine 서비스의 서버리스 NEG가 포함된 백엔드 서비스로 요청을 전달합니다.

외부 IP 주소 예약

Cloud Load Balancing을 구성하기 전에 사용자가 부하 분산기에 도달할 수 있도록 전역 고정 외부 IP 주소를 설정해야 합니다.

콘솔

  1. Google Cloud 콘솔의 외부 IP 주소 페이지로 이동합니다.

    외부 IP 주소로 이동

  2. 고정 주소 예약을 클릭하여 IPv4 주소를 예약합니다.

  3. 고정 주소의 이름을 할당합니다(예: appengine-external-ip).

  4. 네트워크 등급을 프리미엄으로 설정합니다.

  5. IP 버전IPv4로 설정합니다.

  6. 유형전역으로 설정합니다.

  7. 예약을 클릭합니다.

gcloud

  1. 외부 IP 주소 예약을 만듭니다.

    gcloud compute addresses create EXTERNAL_IP \
        --network-tier=PREMIUM \
        --ip-version=IPV4 \
        --global
    

    EXTERNAL_IP는 만들려는 주소의 이름입니다.

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

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

App Engine의 백엔드 서비스 구성

네트워크 엔드포인트 그룹(NEG)은 부하 분산기의 백엔드 엔드포인트 그룹을 지정하는 데 사용됩니다. App Engine 서비스를 가리키는 백엔드를 지정하려면 서버리스 NEG를 구성한 다음 Cloud Load Balancing에서 백엔드 서비스, 라우팅 규칙, 프런트엔드 서비스를 구성합니다.

  1. App Engine 앱의 서버리스 NEG를 만듭니다.

    gcloud compute network-endpoint-groups create APP_ENGINE_NEG \
    --network-endpoint-type=serverless \
    --app-engine-app \
    --region=APP_ENGINE_REGION
    

    다음을 바꿉니다.

    • APP_ENGINE_NEG는 네트워크 엔드포인트 그룹의 이름입니다.
    • APP_ENGINE_REGION은 App Engine에 설정된 리전입니다.

    위의 --app-engine-app 플래그를 추가하여 특정 App Engine 서비스로 전달하는 대신 기본 라우팅을 사용할 수 있습니다. 기본 라우팅을 사용하면 요청이 기본 서비스(https://PROJECT_ID.REGION_ID.r.appspot.com)로 전송되고 그렇지 않은 경우 dispatch.yaml 파일에서 정의하는 모든 라우팅 규칙을 따릅니다. 이 동작은 App Engine을 사용하여 구성된 커스텀 도메인과 동일합니다.

  2. 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create APP_ENGINE_BACKEND \
      --global \
      --load-balancing-scheme=EXTERNAL_MANAGED
    

    APP_ENGINE_BACKEND를 만들려는 백엔드 서비스의 이름으로 바꿉니다.

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

    gcloud compute backend-services add-backend APP_ENGINE_BACKEND \
    --global --network-endpoint-group=APP_ENGINE_NEG \
    --network-endpoint-group-region=APP_ENGINE_REGION
    

    다음을 바꿉니다.

    • APP_ENGINE_BACKEND는 이전의 백엔드 서비스의 이름입니다.
    • APP_ENGINE_NEG는 네트워크 엔드포인트 그룹의 이름입니다.
    • APP_ENGINE_REGION은 App Engine에 설정된 리전입니다.
  4. 수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵을 만듭니다.

    gcloud compute url-maps create URL_MAP_NAME \
          --default-service APP_ENGINE_BACKEND
    

    다음을 바꿉니다.

    • URL_MAP_NAME은 백엔드 서비스에 대한 URL 매핑을 정의하는 URL 맵 리소스의 고유한 이름입니다.
    • APP_ENGINE_BACKEND는 이전의 백엔드 서비스의 이름입니다.
  5. 대상 HTTPS 프록시를 만들어 요청을 URL 맵으로 라우팅합니다.

    gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
          --certificate-map=CERTIFICATE_MAP_NAME \
          --url-map=URL_MAP_NAME
    

    다음을 바꿉니다.

    • TARGET_HTTPS_PROXY_NAME은 HTTPS 프록시를 설명하도록 선택한 고유한 이름입니다.
    • CERTIFICATE_MAP_NAME은 인증서 맵 항목과 관련 인증서를 참조하는 인증서 맵의 이름입니다.
    • URL_MAP_NAME은 이전의 URL 맵의 이름입니다.
  6. 수신되는 요청을 프록시로 라우팅하는 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
          --load-balancing-scheme=EXTERNAL_MANAGED \
          --network-tier=PREMIUM \
          --address=EXTERNAL_IP \
          --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
          --global \
          --ports=443
    

    다음을 바꿉니다.

    • HTTPS_FORWARDING_RULE_NAME은 네트워크 트래픽을 HTTPS 프록시로 전달하는 전달 규칙을 설명하는 고유한 이름입니다.
    • TARGET_HTTPS_PROXY_NAME은 이전의 HTTPS 프록시의 이름입니다.
    • EXTERNAL_IP이전에 만든 IPv4 주소의 이름입니다.

부하 분산기 테스트

부하 분산기를 구성했으므로 도메인을 마이그레이션하기 전에 테스트를 위해 부하 분산기의 IP 주소로 트래픽을 전송할 수 있습니다.

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

    • 그래도 문제가 해결되지 않고 Google 관리형 인증서를 사용 중인 경우 인증서가 ACTIVE 상태이고 인증서 맵이 ACTIVE 상태인지 확인합니다.
    • 자체 서명 인증서를 테스트에 사용하면 브라우저에 경고가 표시됩니다. 브라우저가 자체 서명 인증서를 수락하도록 명시적으로 지시해야 합니다. 실제 페이지를 보려면 경고를 클릭하세요.

    추가 구성 옵션은 서버리스 플랫폼으로 전역 외부 HTTP(S) 부하 분산기 설정을 참조하세요.

부하 분산기에 도메인 연결

부하 분산기를 만든 후 부하 분산기와 연결된 IP 주소를 확인합니다(예: 30.90.80.100). 도메인이 부하 분산기를 가리키도록 하려면 도메인 등록 서비스를 사용하여 A 레코드를 만듭니다. SSL 인증서에 여러 도메인을 추가했다면 모두 부하 분산기의 IP 주소를 가리키는 A 레코드를 도메인마다 추가해야 합니다. 예를 들어 www.example.comexample.comA 레코드를 만들려면 다음을 사용합니다.

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

Cloud DNS를 DNS 제공업체로 사용하는 경우 레코드 추가, 수정, 삭제를 참조하세요.

App Engine 커스텀 도메인 매핑 삭제

Google Cloud 콘솔 사용

  1. App Engine 설정 페이지의 커스텀 도메인 탭으로 이동합니다.

    커스텀 도메인으로 이동

  2. 커스텀 도메인 이름을 선택하고 삭제를 클릭합니다.

또는 gcloud 명령어 또는 Admin API를 사용하여 커스텀 도메인을 삭제할 수 있습니다.

Cloud Load Balancing을 통한 액세스만 허용하도록 인그레스 제어 설정

부하 분산기를 테스트한 후에는 Cloud Load Balancing의 트래픽만 허용하도록 App Engine 앱을 업데이트하는 것이 좋습니다. internal-and-cloud-load-balancing 인그레스 제어를 구성하는 방법은 인그레스 설정을 참조하세요.