서버리스 VPC 액세스 커넥터가 필요 없는 직접 VPC 이그레스를 사용하여 App Engine 서비스가 공유 VPC 네트워크로 트래픽을 전송하도록 사용 설정할 수 있습니다.
이 페이지에서는 공유 VPC 네트워크의 서브넷을 사용하도록 App Engine의 IAM 권한을 구성한 다음 서비스를 공유 서브넷에 배치하는 방법을 설명합니다.
시작하기 전에
서브넷에서 IP 주소 할당에 관한 안내는 IP 주소 할당 섹션을 참고하세요.
제한사항
IP 주소 사용량: 서비스의 IP 주소 사용량은 실행 중인 인스턴스 수에 따라 직접 확장되며, 선택한 서브넷에서 사용 가능한 IP 주소 수에 따라 확장 기능이 제한됩니다.
유지보수 이벤트: 네트워킹 인프라 유지보수 이벤트 중에 서비스에서 일시적인 연결 중단이 발생할 수 있습니다. 비정기적인 연결 재설정을 처리할 수 있는 클라이언트 라이브러리를 사용하는 것이 좋습니다.
콜드 스타트: 초기 콜드 스타트 시간은 지역과 특정 사용 사례에 따라 달라집니다. 드문 경우 콜드 스타트가 최대 1분까지 지속될 수 있습니다.
직접 VPC 인그레스: App Engine은 직접 VPC 인그레스를 지원하지 않습니다.
인스턴스 수: App Engine 버전당 최대 100개의 인스턴스만 Direct VPC 이그레스를 사용하도록 구성할 수 있습니다.
IAM 권한 설정
공유 VPC 서비스 프로젝트의 App Engine이 공유 VPC 네트워크에 액세스하려면 먼저 App Engine 서비스 에이전트에 서브넷을 사용할 수 있는 충분한 권한이 있는지 확인해야 합니다.
App Engine 서비스 에이전트 역할: 공유 VPC 네트워크에 액세스하려면 다음 역할 중 하나를 추가하여 App Engine 서비스 에이전트에 충분한 권한을 부여합니다.
공유 VPC 호스트 프로젝트의 Compute 네트워크 사용자(
roles/compute.networkUser) 역할 외부 IPv6가 있는 서브넷에는 Compute 공개 IP 관리자 (roles/compute.publicIpAdmin) 역할도 필요합니다.예를 들어 Compute 네트워크 사용자 역할을 부여하려면 다음 명령어를 실행합니다.
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
다음을 바꿉니다.
- HOST_PROJECT_ID: 공유 VPC 호스트 프로젝트의 ID
- SERVICE_PROJECT_NUMBER: App Engine 서비스를 배포하는 공유 VPC 서비스 프로젝트 번호
공유 VPC 호스트 프로젝트의 Compute 네트워크 뷰어(
compute.networkViewer) 및 공유 VPC 서브넷의 Compute 네트워크 사용자(compute.networkUser) 역할 외부 IPv6가 있는 서브넷에는 Compute 공용 IP 관리자 (roles/compute.publicIpAdmin) 역할도 필요합니다.예를 들어 서브넷에 Compute 네트워크 사용자 역할을 부여하려면 다음 명령어를 실행합니다.
gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \ --region REGION \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \ --role "roles/compute.networkUser" \ --project HOST_PROJECT_ID
다음을 바꿉니다.
- SUBNET_NAME: App Engine 서비스를 실행하려는 서브넷의 정규화된 리소스 이름
- REGION: App Engine 서비스의 리전으로, 서브넷 리전과 일치해야 합니다.
- SERVICE_PROJECT_NUMBER: App Engine 서비스를 배포하는 공유 VPC 서비스 프로젝트 번호
- HOST_PROJECT_ID: 공유 VPC 호스트 프로젝트의 ID
커스텀 권한: 보다 세부적으로 제어할 수 있도록 프로젝트에 대한 다음 추가 권한을 App Engine 서비스 에이전트에 부여합니다.
- 공유 VPC 호스트 프로젝트에 대한
compute.networks.get권한 - 호스트 프로젝트 또는 특정 서브넷에 대한
compute.subnetworks.get권한 - 호스트 프로젝트 또는 특정 서브넷에 대한
compute.subnetworks.use권한 - 공유 VPC 서비스 프로젝트에 대한
compute.addresses.get권한 - 공유 VPC 서비스 프로젝트에 대한
compute.addresses.list권한 - 공유 VPC 서비스 프로젝트에 대한
compute.addresses.create권한 - 공유 VPC 서비스 프로젝트에 대한
compute.addresses.delete권한 - 공유 VPC 서비스 프로젝트에 대한
compute.addresses.createInternal권한 - 공유 VPC 서비스 프로젝트에 대한
compute.addresses.deleteInternal권한 - 공유 VPC 서비스 프로젝트에 대한
compute.regionOperations.get권한
- 공유 VPC 호스트 프로젝트에 대한
IP 주소 할당
App Engine 서비스를 VPC 네트워크에 배치하려면 VPC 네트워크 또는 서브넷을 지정하거나 둘 다 지정합니다. 네트워크만 지정하면 서브넷은 네트워크와 동일한 이름을 사용합니다. App Engine은 서브넷에서 IP 주소를 할당합니다.
IP 주소는 임시 주소이므로 개별 IP에 따라 정책을 만들지 마세요. 방화벽 규칙과 같이 IP를 기반으로 정책을 만들어야 하는 경우 전체 서브넷의 IP 주소 범위를 사용해야 합니다.
서비스에서 사용하는 네트워크 또는 서브넷을 변경하려면 새 네트워크 및 서브넷 값을 사용하는 새 버전을 배포하세요.
수직 확장 및 축소
트래픽이 급증할 때 더 빠르게 수직 확장할 수 있도록 App Engine에서는 한 번에 16개 (28 서브넷 마스크)의 블록으로 IP 주소를 예약합니다.
App Engine에서 사용할 수 있는 IPv4 주소가 충분한지 확인하려면 서브넷의 IPv4 주소 범위가 /26 이상이어야 합니다.
IP 할당 효율성과 관리 편의성을 위해 동일한 서브넷에 여러 리소스를 배치합니다. IPv4 주소 공간이 제한된 경우 지원되는 IPv4 범위를 참조하여 더 많은 옵션을 확인하세요.
서브넷을 삭제하려면 먼저 App Engine 서비스를 삭제하거나 재배포하여 서브넷 사용을 중지한 후 1~2시간 정도 기다려야 합니다.
서비스의 IP 주소 소비
안정적인 상태에서 App Engine은 인스턴스 수의 2배 (2X)만큼의 IP 주소를 사용합니다. 버전이 축소되면 App Engine은 최대 20분 동안 IP 주소를 보관합니다. 합해서 2배 이상의 IP 주소와 버전 업데이트를 고려한 버퍼를 예약하세요.
예를 들어 version 1이 인스턴스 100개에서 0으로 축소되고 version 2가 0에서 최대 100개로 확장되도록 버전을 업그레이드하면 App Engine은 축소 후 최대 20분 동안 version 1 IP 주소를 유지합니다. 20분의 보관 기간 동안 IP 주소((100 + 100) * 2)를 최소 400개 이상 예약해야 합니다.
지원되는 IPv4 범위
App Engine은 서브넷에 대해 다음 IPv4 범위를 지원합니다.
App Engine 서비스 배포
직접 VPC 이그레스를 사용하면 App Engine 서비스가 서버리스 VPC 액세스 커넥터 없이 공유 VPC 네트워크로 트래픽을 전송할 수 있습니다. VPC 방화벽 규칙을 적용하는 것과 같이 App Engine 서비스의 특정 버전에 네트워크 태그를 할당하여 네트워크 보안을 더욱 세분화할 수 있습니다.
공유 서브넷에 서비스를 배치하려면 app.yaml 파일에서 공유 VPC 네트워크 및 서브넷에 대해 정규화된 리소스 이름을 지정합니다.
vpc_access섹션을 포함하도록app.yaml파일을 업데이트합니다.vpc_access: network_interface: network: projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK subnet: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME tags: - NETWORK_TAGS vpc_egress: EGRESS_SETTING
다음을 바꿉니다.
- HOST_PROJECT_ID: 공유 VPC 프로젝트의 ID입니다.
- VPC_NETWORK: 공유 VPC 네트워크 이름입니다.
- REGION: App Engine 서비스의 리전으로, 서브넷 리전과 일치해야 합니다.
- SUBNET_NAME: 서브넷의 정규화된 리소스 이름
- 선택사항: NETWORK_TAGS: 방화벽 규칙 및 라우팅 정책에 사용할 App Engine 서비스의 인스턴스와 연결할 네트워크 태그 목록입니다.
선택사항: EGRESS_SETTING: 아웃바운드 트래픽이 라우팅되는 방식을 제어합니다. 이 필드는 다음 구성 설정을 지원합니다.
all-traffic: 모든 아웃바운드 트래픽을 공유 VPC 네트워크를 통해 전송합니다.private-ranges-only(기본값): 공유 VPC 네트워크를 통해 내부 주소로만 트래픽을 전송합니다.
다음 명령어를 실행하여 서비스를 배포합니다.
gcloud beta app deploy
서비스 연결 해제
공유 VPC 네트워크에서 서비스를 삭제하려면 다음 안내를 따르세요.
app.yaml파일에서vpc_access섹션을 삭제합니다.서비스를 다시 배포합니다.
gcloud beta app deploy
문제 해결
이 섹션에서는 공유 VPC 네트워크에서 직접 VPC 이그레스를 사용할 때 발생할 수 있는 일반적인 오류를 설명하고 이러한 오류를 해결하는 방법을 안내합니다.
서브넷을 삭제할 수 없음
서브넷을 삭제하려면 먼저 서브넷을 사용하는 모든 리소스를 삭제해야 합니다. App Engine이 서브넷을 사용하는 경우 서브넷을 삭제하기 전에 App Engine을 연결 해제하거나 다른 서브넷으로 이동해야 합니다.
App Engine 리소스를 삭제하거나 이동한 후 서브넷을 삭제하기 전에 App Engine에서 IP를 해제할 때까지 1~2시간 기다립니다.
배포 실패
배포가 실패하면 Google Cloud CLI에 근본 원인을 나타내는 오류 메시지가 표시됩니다. 일반적인 문제에는 다음이 포함됩니다.
app.yaml파일의 네트워크 또는 서브넷 이름 철자 오류와 같은 잘못된 VPC 네트워크 메타데이터. 잠재적인 오류를 수정하려면app.yaml파일의 VPC 네트워크 구성을 검토하세요.IAM 권한이 부족합니다. 배포 서비스 계정에 필요한 권한을 부여해야 합니다. 배포 중에 권한 오류가 발생하면 서비스 계정에 다음 추가 역할을 부여해야 합니다.
- Cloud Build 서비스 계정(
roles/cloudbuild.builds.builder) - 서비스 계정 토큰 생성자 (
roles/iam.serviceAccountTokenCreator)
- Cloud Build 서비스 계정(
공유 VPC 네트워크를 분리할 수 없음
호스트 프로젝트에서 공유 VPC 네트워크를 분리하려면 공유 VPC 프로비저닝 해제 단계를 수행하고 공유 VPC 네트워크에서 모든 App Engine 서비스의 연결을 해제해야 합니다.
공유 VPC 네트워크를 사용하는 App Engine 리소스를 확인하려면 다음 명령어를 실행합니다.
gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID
HOST_PROJECT_ID를 공유 VPC 호스트 프로젝트의 ID로 바꿉니다.
직접 VPC 이그레스 서브넷에 IPv4 주소 부족
VPC 네트워크의 서브넷에 IPv4 주소가 부족하면 App Engine에서 더 이상 서비스 인스턴스를 시작할 수 없습니다.
이 문제를 해결하려면 사용 가능한 IP 주소가 더 많은 서브네트워크로 이동하거나 서브넷 범위를 확장하는 것이 좋습니다.
할당된 IP 주소 보기
App Engine이 할당한 IP 주소를 확인하려면 Google Cloud 콘솔의 IP 주소 페이지로 이동하거나 Google Cloud CLI에서 다음 명령어를 실행합니다.
gcloud compute addresses list