您可以啟用 App Engine 服務,使用直連虛擬私有雲輸出功能,將流量傳送至共用虛擬私有雲網路,不需使用無伺服器虛擬私有雲存取連接器。直連虛擬私有雲輸出支援 虛擬私有雲流量記錄和 Cloud NAT (Public NAT 和 Private NAT)。
本頁面說明如何設定 App Engine 的 IAM 權限,以便使用 Shared VPC 虛擬私有雲網路的子網路,然後將服務放在共用子網路上。
事前準備
請參閱「IP 位址分配」一節,瞭解如何從子網路分配 IP 位址。
限制
IP 位址消耗:服務的 IP 位址用量會直接隨著執行中的執行個體數量而調整,而擴充能力則受限於所選子網路中可用的 IP 位址數量。
維護事件:在網路基礎架構維護事件期間,服務可能會短暫中斷連線。建議您使用用戶端程式庫處理偶爾發生的連線重設。
冷啟動:初始冷啟動時間取決於區域和特定用途。在極少數情況下,冷啟動可能需要一分鐘。
直連虛擬私有雲輸入:App Engine 不支援直連虛擬私有雲輸入。
執行個體數量:根據預設,每個 App Engine 版本最多只能設定 100 個執行個體,使用直連虛擬私有雲輸出。如果工作負載需要更多執行個體,您可以申請提高配額。
虛擬私有雲流量記錄:不會在記錄檔中顯示 App Engine 服務版本。服務名稱會顯示在
AppEngineServiceDetails欄位中。適用區域:直連虛擬私有雲輸出功能僅在特定區域開放,且須受邀才能使用。如要在這些區域要求存取權,請與支援團隊聯絡。
設定 IAM 權限
共用虛擬私有雲服務專案中的 App Engine 必須先確認 App Engine 服務代理具備足夠的子網路使用權限,才能存取共用虛擬私有雲網路。
App Engine 服務代理角色:如要存取 Shared VPC 虛擬私有雲網路,請新增下列其中一個角色,將足夠的權限授予 App Engine 服務代理:
Shared VPC 主機專案的 Compute 網路使用者 (
roles/compute.networkUser)。如果子網路具有外部 IPv6,則也需要運算公開 IP 管理員 (roles/compute.publicIpAdmin) 角色。例如,如要授予 Compute 網路使用者角色,請執行下列指令:
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \ --role "roles/compute.networkUser"
更改下列內容:
- HOST_PROJECT_ID:Shared VPC 主機專案的 ID。
- SERVICE_PROJECT_NUMBER:部署 App Engine 服務的 Shared VPC 服務專案編號。
共用虛擬私有雲主專案的Compute 網路檢視者 (
roles/compute.networkViewer) 角色,以及共用虛擬私有雲子網路的Compute 網路使用者 (roles/compute.networkUser) 角色。如果子網路具有外部 IPv6,則也需要運算公開 IP 管理員 (roles/compute.publicIpAdmin) 角色。舉例來說,如要授予主專案的 Compute 網路檢視者角色,以及子網路的 Compute 網路使用者角色,請執行下列指令:
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \ --role "roles/compute.networkViewer" gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \ --region REGION \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \ --role "roles/compute.networkUser" \ --project HOST_PROJECT_ID
更改下列內容:
- HOST_PROJECT_ID:Shared VPC 主機專案的 ID。
- SERVICE_PROJECT_NUMBER:部署 App Engine 服務的 Shared VPC 服務專案編號。
- SUBNET_NAME:要執行 App Engine 服務的子網路名稱。
- REGION:App Engine 服務的區域,必須與子網路的區域相符。
自訂權限:如要更精細地控管,請在專案中授予 App Engine 服務代理下列額外權限:
- Shared VPC 主專案的
compute.networks.get - 主專案或特定子網路的
compute.subnetworks.get - 主專案或特定子網路的
compute.subnetworks.use - Shared VPC 服務專案的
compute.addresses.get - Shared VPC 服務專案的
compute.addresses.list - Shared VPC 服務專案的
compute.addresses.create - Shared VPC 服務專案的
compute.addresses.delete - Shared VPC 服務專案的
compute.addresses.createInternal - Shared VPC 服務專案的
compute.addresses.deleteInternal - Shared VPC 服務專案的
compute.regionOperations.get
- Shared VPC 主專案的
IP 位址分配
如要將 App Engine 服務放在虛擬私有雲網路,請指定虛擬私有雲網路或子網路,或兩者皆指定。如果只指定網路,子網路會使用與網路相同的名稱。App Engine 會從子網路分配 IP 位址。
IP 位址是暫時性的,因此請勿根據個別 IP 建立政策。如要根據 IP 建立政策 (例如防火牆規則),則必須使用整個子網路的 IP 位址範圍。
如要變更服務使用的網路或子網路,請部署使用新網路和子網路值的新版本。
擴充及縮減
為了在流量激增時更快擴充,App Engine 會一次保留 16 個 IP 位址 (28 子網路遮罩)。為確保您有足夠的 IPv4 位址可用於 App Engine,子網路的 IPv4 位址範圍必須為 /26 或更大。
為提高 IP 分配效率並簡化管理作業,請將多項資源放在同一個子網路上。如果 IPv4 位址空間有限,請參閱「支援的 IPv4 範圍」一節,瞭解其他選項。
如要刪除子網路,請先刪除或重新部署 App Engine 服務,停止使用子網路,然後等待 1 到 2 小時。
Service 的 IP 位址用量
在穩定狀態下,App Engine 使用的 IP 位址數量是執行個體數量的 2 倍。當版本縮減時,App Engine 最多會保留其 IP 位址 20 分鐘。總共至少保留 2 倍的 IP 位址數量,再加上緩衝區,以因應版本更新。
舉例來說,如果您升級版本,使 version 1 從 100 個執行個體縮減至零,而 version 2 從零擴充至 100 個,App Engine 會在縮減後保留 version 1 IP 位址最多 20 分鐘。在 20 分鐘的保留期間內,您必須保留至少 400 個 IP 位址 ((100 + 100) * 2)。
支援的 IPv4 範圍
App Engine 支援下列子網路 IPv4 範圍:
部署 App Engine 服務
透過直連虛擬私有雲輸出,App Engine 服務可以將流量傳送至 Shared VPC 網路,不需使用無伺服器 VPC 存取連接器。您可以將網路標記指派給特定版本的 App Engine 服務,以便更精細地控管網路安全,例如套用虛擬私有雲防火牆規則。
如要將服務放在共用子網路上,請指定 Shared VPC 虛擬私有雲網路和子網路的完整資源名稱。
您可以使用 YAML 或 Terraform,為 App Engine 服務設定直連虛擬私有雲輸出。如要啟用或中斷直連虛擬私有雲輸出,請部署新版本並將流量遷移至該版本。您也可以先刪除已部署的版本,而不是覆寫現有的版本 ID。
YAML
更新
app.yaml檔案,加入vpc_access區段: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:Shared VPC 專案的 ID。
- VPC_NETWORK:Shared VPC 網路名稱。
- REGION:App Engine 服務的區域,必須與子網路的區域相符。
- SUBNET_NAME:子網路名稱。
- 選用:NETWORK_TAGS 會列出要與 App Engine 服務執行個體建立關聯的網路標記,以便用於防火牆規則和路由政策。
選用:EGRESS_SETTING 可控管傳出流量的轉送方式。這個欄位支援下列設定:
all-traffic:透過 Shared VPC 網路傳送所有傳出流量。private-ranges-only(預設):僅透過 Shared VPC 虛擬私有雲網路將流量傳送至內部位址。
執行下列指令來部署服務:
gcloud app deploy
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
在 Terraform 設定中,將下列
vpc_access區塊新增至google_app_engine_standard_app_version資源:vpc_access { vpc_egress = "EGRESS_SETTING" network_interfaces { network = "projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK" subnetwork = "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME" tags = ["TAG_1", "TAG_2"] } }
更改下列內容:
- HOST_PROJECT_ID:Shared VPC 主機專案的 ID。
- VPC_NETWORK:Shared VPC 網路名稱。
- REGION:App Engine 服務的區域,必須與子網路的區域相符。
- SUBNET_NAME:子網路名稱。
- 選用:TAG_1、TAG_2 列出要與 App Engine 服務執行個體建立關聯的網路標記,以便用於防火牆規則和路由政策。
- 選用:EGRESS_SETTING 可控管傳出流量的轉送方式。這個欄位支援下列設定:
ALL_TRAFFIC:透過 Shared VPC 網路傳送所有傳出流量。PRIVATE_IP_RANGES(預設):僅透過 Shared VPC 虛擬私有雲網路將流量傳送至內部位址。
如果版本已部署,但未啟用直連虛擬私有雲輸出功能,請將
version_id欄位更新為新值。您無法在現有版本上啟用直連虛擬私有雲輸出。套用設定:
terraform apply
取消連結服務
如要從 Shared VPC 虛擬私有雲網路移除服務,請使用 YAML 或 Terraform:
YAML
- 從
app.yaml檔案中移除vpc_access區段。 重新部署服務:
gcloud app deploy
Terraform
- 從 Terraform 設定中的
google_app_engine_standard_app_version資源移除vpc_access區塊。 - 將
version_id欄位更新為新值。您無法停用現有版本的直連虛擬私有雲輸出。 套用設定:
terraform apply
疑難排解
本節說明搭配 Shared VPC 網路使用直連虛擬私有雲輸出時,可能遇到的常見錯誤,並提供解決方法。
無法刪除子網路
如要刪除子網路,必須先刪除所有使用該子網路的資源。如果 App Engine 使用子網路,您必須先中斷連線或移至其他子網路,才能刪除子網路。
刪除或移動 App Engine 資源後,請等待 1 到 2 小時,讓 App Engine 釋出 IP,再刪除子網路。
部署失敗
如果部署失敗,Google Cloud CLI 會顯示錯誤訊息,指出根本原因。常見問題包括:
虛擬私有雲網路中繼資料不正確,例如
app.yaml檔案中的網路或子網路名稱拼寫錯誤。如要修正潛在錯誤,請查看app.yaml檔案中的虛擬私有雲網路設定。IAM 權限不足。請務必將必要權限授予 App Engine 服務代理 (
service-SERVICE_PROJECT_NUMBER@gcp-gae-service.)。如果在部署期間發生權限錯誤,請務必將下列額外角色授予部署服務帳戶:- Cloud Build 服務帳戶 (
roles/cloudbuild.builds.builder) - 服務帳戶權杖建立者 (
roles/iam.serviceAccountTokenCreator)
- Cloud Build 服務帳戶 (
無法卸離 Shared VPC 網路
如要卸載主專案中的共用虛擬私有雲網路,請按照取消佈建共用虛擬私有雲的步驟操作,並務必中斷任何 App Engine 服務與共用虛擬私有雲網路的連線。
如要查看哪些 App Engine 資源使用 Shared VPC 網路,請執行下列指令:
gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID
將 HOST_PROJECT_ID 替換為 Shared VPC 主專案的 ID。
直連虛擬私有雲輸出子網路的 IPv4 位址用盡
如果虛擬私有雲網路的子網路用盡 IPv4 位址,App Engine 就無法啟動任何服務執行個體。
如要解決這個問題,請考慮改用可用 IP 位址較多的子網路,或擴大子網路範圍。
查看已分配的 IP 位址
如要查看 App Engine 分配的 IP 位址,請前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面,或透過 Google Cloud CLI 執行下列指令:
gcloud compute addresses list