리전 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
파일에 정의한 모든 라우팅 규칙을 포함하여 이전과 동일한 방식으로 라우팅됩니다.
다음 다이어그램은 앱 변경사항을 설명합니다.
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 프런트엔드 서비스로 전환하는 설정에 대해 설명합니다.
- 필수 권한이 있는지 확인
- Google 관리형 인증서 만들기
- Cloud Load Balancing 구성
- 부하 분산기 테스트
- 부하 분산기에 도메인 연결
- App Engine 커스텀 도메인 매핑 삭제
- 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 승인 만들기
다음 명령어를 실행하여 인증서 관리자에서 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 커스텀 도메인 이름입니다.
gcloud
명령어에서 반환된 CNAME를 확인합니다. 다음 단계에서 DNS 레코드를 업데이트하는 데 사용해야 합니다.
DNS 구성에 CNAME 레코드 추가
Cloud DNS 또는 타사 DNS 솔루션을 사용하는지에 따라 사용 사례에 적합한 안내를 따르세요.
Cloud DNS
DNS 승인을 만들면 gcloud
명령어가 해당 CNAME 레코드를 반환합니다. 다음과 같이 대상 도메인의 DNS 영역에 있는 DNS 구성에 이 CNAME 레코드를 추가해야 합니다.
DNS 레코드 트랜잭션을 시작합니다.
gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
DNS_ZONE_NAME
을 공개 DNS 영역의 이름으로 바꿉니다. Google Cloud를 사용하여 도메인을 관리하고 해당 도메인에 대한 트래픽을 수신하는 경우 공개 DNS 영역을 이미 만든 것입니다. 공개 DNS 영역을 보려면 관리형 영역 나열 및 설명을 참조하세요.대상 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 영역의 이름입니다.
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 관리형 인증서를 만들려면 다음 명령어를 실행합니다.
Google 관리형 인증서를 만듭니다.
gcloud certificate-manager certificates create CERTIFICATE_NAME \ --domains=DOMAIN_NAME --dns-authorizations=AUTHORIZATION_NAME
다음을 바꿉니다.
CERTIFICATE_NAME
은 인증서를 설명하는 고유한 이름입니다.DOMAIN_NAME
은 App Engine 커스텀 도메인 이름입니다.AUTHORIZATION_NAME
은 이전에 만든 DNS 승인의 이름입니다.
인증서가 활성 상태인지 확인합니다.
다음 명령어를 사용하여 부하 분산기에 배포하기 전에 인증서 자체가 활성 상태인지 확인합니다. 인증서 상태가
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
도구가 다른 출력을 반환하는 경우 인증서 관리자 문제 해결을 참조하세요.
인증서 맵 만들기
인증서 맵을 만듭니다.
gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
CERTIFICATE_MAP_NAME
을 인증서 맵을 설명하는 고유한 이름으로 바꿉니다.인증서 맵 항목을 만들고 이전의 인증서 및 인증서 맵과 연결합니다.
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
플래그를 추가할 수 있습니다.인증서 맵이 활성 상태인지 확인합니다.
다음 명령어를 사용하여 해당 인증서 맵을 대상 프록시에 연결하기 전에 인증서 맵 항목이 활성 상태인지 확인합니다.
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 부하 분산기를 보여줍니다.
전달 규칙은 외부 IP 주소에서 수신되는 요청을 라우팅하고 대상 HTTPS 프록시로 요청을 전달합니다. HTTPS 부하 분산기는 URL 맵을 사용하여 App Engine 서비스의 서버리스 NEG가 포함된 백엔드 서비스로 요청을 전달합니다.
외부 IP 주소 예약
Cloud Load Balancing을 구성하기 전에 사용자가 부하 분산기에 도달할 수 있도록 전역 고정 외부 IP 주소를 설정해야 합니다.
콘솔
Google Cloud 콘솔의 외부 IP 주소 페이지로 이동합니다.
고정 주소 예약을 클릭하여 IPv4 주소를 예약합니다.
고정 주소의 이름을 할당합니다(예:
appengine-external-ip
).네트워크 등급을 프리미엄으로 설정합니다.
IP 버전을 IPv4로 설정합니다.
유형을 전역으로 설정합니다.
예약을 클릭합니다.
gcloud
외부 IP 주소 예약을 만듭니다.
gcloud compute addresses create EXTERNAL_IP \ --network-tier=PREMIUM \ --ip-version=IPV4 \ --global
EXTERNAL_IP
는 만들려는 주소의 이름입니다.예약된 IPv4 주소를 확인합니다.
gcloud compute addresses describe EXTERNAL_IP \ --format="get(address)" \ --global
App Engine의 백엔드 서비스 구성
네트워크 엔드포인트 그룹(NEG)은 부하 분산기의 백엔드 엔드포인트 그룹을 지정하는 데 사용됩니다. App Engine 서비스를 가리키는 백엔드를 지정하려면 서버리스 NEG를 구성한 다음 Cloud Load Balancing에서 백엔드 서비스, 라우팅 규칙, 프런트엔드 서비스를 구성합니다.
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을 사용하여 구성된 커스텀 도메인과 동일합니다.백엔드 서비스를 만듭니다.
gcloud compute backend-services create APP_ENGINE_BACKEND \ --global \ --load-balancing-scheme=EXTERNAL_MANAGED
APP_ENGINE_BACKEND
를 만들려는 백엔드 서비스의 이름으로 바꿉니다.서버리스 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에 설정된 리전입니다.
수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵을 만듭니다.
gcloud compute url-maps create URL_MAP_NAME \ --default-service APP_ENGINE_BACKEND
다음을 바꿉니다.
URL_MAP_NAME
은 백엔드 서비스에 대한 URL 매핑을 정의하는 URL 맵 리소스의 고유한 이름입니다.APP_ENGINE_BACKEND
는 이전의 백엔드 서비스의 이름입니다.
대상 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 맵의 이름입니다.
수신되는 요청을 프록시로 라우팅하는 전달 규칙을 만듭니다.
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 주소로 트래픽을 전송할 수 있습니다.
- Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.
부하 분산으로 이동 - 방금 만든 부하 분산기를 클릭합니다.
- 부하 분산기의 IP 주소를 확인합니다.
HTTPS 부하 분산기의 경우
https://IP_ADDRESS
로 이동하여 웹브라우저를 사용해서 부하 분산기를 테스트할 수 있습니다.IP_ADDRESS
를 부하 분산기의 IP 주소(예:30.90.80.100
)로 바꿉니다.- 그래도 문제가 해결되지 않고 Google 관리형 인증서를 사용 중인 경우 인증서가
ACTIVE
상태이고 인증서 맵이ACTIVE
상태인지 확인합니다. - 자체 서명 인증서를 테스트에 사용하면 브라우저에 경고가 표시됩니다. 브라우저가 자체 서명 인증서를 수락하도록 명시적으로 지시해야 합니다. 실제 페이지를 보려면 경고를 클릭하세요.
추가 구성 옵션은 서버리스 플랫폼으로 전역 외부 HTTP(S) 부하 분산기 설정을 참조하세요.
- 그래도 문제가 해결되지 않고 Google 관리형 인증서를 사용 중인 경우 인증서가
부하 분산기에 도메인 연결
부하 분산기를 만든 후 부하 분산기와 연결된 IP 주소를 확인합니다(예: 30.90.80.100
). 도메인이 부하 분산기를 가리키도록 하려면 도메인 등록 서비스를 사용하여 A
레코드를 만듭니다. SSL 인증서에 여러 도메인을 추가했다면 모두 부하 분산기의 IP 주소를 가리키는 A
레코드를 도메인마다 추가해야 합니다. 예를 들어 www.example.com
및 example.com
의 A
레코드를 만들려면 다음을 사용합니다.
NAME TYPE DATA www A 30.90.80.100 @ A 30.90.80.100
Cloud DNS를 DNS 제공업체로 사용하는 경우 레코드 추가, 수정, 삭제를 참조하세요.
App Engine 커스텀 도메인 매핑 삭제
Google Cloud 콘솔 사용
App Engine 설정 페이지의 커스텀 도메인 탭으로 이동합니다.
커스텀 도메인 이름을 선택하고 삭제를 클릭합니다.
또는 gcloud 명령어 또는 Admin API를 사용하여 커스텀 도메인을 삭제할 수 있습니다.
Cloud Load Balancing을 통한 액세스만 허용하도록 인그레스 제어 설정
부하 분산기를 테스트한 후에는 Cloud Load Balancing의 트래픽만 허용하도록 App Engine 앱을 업데이트하는 것이 좋습니다. internal-and-cloud-load-balancing
인그레스 제어를 구성하는 방법은 인그레스 설정을 참조하세요.