使用共用虛擬私有雲網路的直接虛擬私有雲輸出

您可以啟用 App Engine 服務,透過直接 VPC 輸出功能將流量傳送至共用 VPC 網路,不需使用無伺服器 VPC 存取連接器。

本頁說明如何設定 App Engine 的 IAM 權限,以使用共用虛擬私有雲網路的子網路,然後將服務放在共用子網路上。

事前準備

如需從子網路分配 IP 位址的相關指引,請參閱「IP 位址分配」一節。

限制

  • IP 位址消耗量:服務的 IP 位址用量會直接隨著執行個體數量擴充,而擴充能力會受到所選子網路中可用 IP 位址數量的限制。

  • 維護事件:在網路基礎架構維護事件期間,服務可能會短暫中斷連線。建議您使用用戶端程式庫處理偶爾發生的連線重設問題。

  • 冷啟動:初始冷啟動時間取決於區域和特定用途。在極少數情況下,冷啟動可能需要一分鐘。

  • 直連虛擬私有雲連入:App Engine 不支援直連虛擬私有雲連入。

  • 執行個體數量:每個 App Engine 版本最多只能設定 100 個執行個體,使用直連虛擬私有雲輸出。

設定 IAM 權限

服務專案中的 App Engine 必須先取得足夠的子網路使用權限,才能存取共用虛擬私有雲網路。請確認 App Engine 服務代理程式具備足夠的子網路使用權限。

  • App Engine 服務代理人角色:如要存取共用虛擬私有雲端網路,請新增下列任一角色,將足夠的權限授予 App Engine 服務代理人

    • 共用虛擬私有雲主專案的 Compute Network User (roles/compute.networkUser)。具有外部 IPv6 的子網路也需要 Compute Public 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:Shared VPC 主機專案的 ID。
      • SERVICE_PROJECT_NUMBER:您部署 App Engine 服務的 Shared VPC 服務專案編號。
    • 共用虛擬私有雲主專案的「Compute Network Viewer」(compute.networkViewer),以及共用虛擬私有雲子網路的「Compute Network User」(compute.networkUser) 角色。具有外部 IPv6 的子網路也需要「Compute Public IP Admin」(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 服務的 Shared VPC 服務專案編號。
      • HOST_PROJECT_ID:Shared VPC 主機專案的 ID。
  • 自訂權限:如要更精細地控管,請在專案中授予 App Engine 服務代理下列額外權限:

    • Shared VPC 主專案的 compute.networks.get
    • 主專案或特定子網路的 compute.subnetworks.get 權限
    • 主專案或特定子網路的 compute.subnetworks.use 權限
    • 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 小時。

服務的 IP 位址耗用量

在穩定狀態下,App Engine 使用的 IP 位址數量是執行個體數量的 2 倍 (2X)。當版本縮減時,App Engine 最多會保留 IP 位址 20 分鐘。因此,請預留至少 2X 的 IP 位址數量,再加上緩衝區,以因應版本更新。

舉例來說,如果您升級版本,讓 version 1 從 100 個執行個體縮減至零,而 version 2 從零擴增至 100 個,App Engine 會在縮減後保留 version 1 IP 位址最多 20 分鐘。在 20 分鐘的保留時間內,您必須保留至少 400 個 IP 位址 ((100 + 100) * 2)。

支援的 IPv4 範圍

App Engine 支援下列子網路 IPv4 範圍:

  • RFC 1918
    • 10.0.0.0/8
    • 172.16.0.0/12
    • 192.168.0.0/16
  • RFC 6598
    • 100.64.0.0/10
  • E 級
    • 240.0.0.0/4

部署 App Engine 服務

有了直接虛擬私有雲輸出,App Engine 服務就能將流量傳送至共用虛擬私有雲網路,不必使用無伺服器虛擬私有雲存取連接器。您可以為特定版本的 App Engine 服務指派網路標記,進一步提升網路安全性,例如套用 VPC 防火牆規則

如要將服務放在共用子網路中,請在 app.yaml 檔案中指定共用虛擬私有雲網路和子網路的完整資源名稱。

  1. 更新 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:共用虛擬私有雲網路的名稱。
    • REGION:App Engine 服務的區域,必須與子網路的區域相符。
    • SUBNET_NAME:子網路的完整資源名稱。
    • 選用:NETWORK_TAGS:要與 App Engine 服務執行個體建立關聯的網路標記清單,用於防火牆規則和路由政策。
    • 選用:EGRESS_SETTING:控管傳出流量的轉送方式。這個欄位支援下列設定:

      • all-traffic:透過 Shared VPC 網路傳送所有輸出流量。
      • private-ranges-only (預設):只透過共用虛擬私有雲網路將流量傳送至內部位址。
  2. 執行下列指令來部署服務:

    gcloud beta app deploy

取消連結服務

如要從共用虛擬私有雲網路移除服務,請按照下列步驟操作:

  1. app.yaml 檔案中移除 vpc_access 區段。
  2. 重新部署服務:

    gcloud beta app deploy

疑難排解

本節說明透過共用虛擬私有雲網路使用 Direct VPC 輸出時,可能遇到的常見錯誤,並提供解決方法。

無法刪除子網路

如要刪除子網路,請先刪除使用該子網路的所有資源。如果 App Engine 使用子網路,您必須先中斷連線或將其移至其他子網路,才能刪除子網路。

刪除或移動 App Engine 資源後,請等待 1 到 2 小時,讓 App Engine 釋出 IP 位址,再刪除子網路。

部署失敗

如果部署失敗,Google Cloud CLI 會顯示錯誤訊息,指出根本原因。常見問題包括:

  • 虛擬私有雲網路中繼資料有誤,例如 app.yaml 檔案中的網路或子網路名稱拼錯。如要修正潛在錯誤,請檢查 app.yaml 檔案中的虛擬私有雲網路設定。

  • IAM 權限不足。請務必在部署服務帳戶中授予必要權限。如果在部署期間遇到權限錯誤,請務必將下列額外角色授予服務帳戶:

無法分離共用虛擬私有雲網路

如要卸離主專案中的共用虛擬私有雲網路,請按照「取消佈建共用虛擬私有雲」的步驟操作,並務必從共用虛擬私有雲網路中斷所有 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」頁面,或從 Google Cloud CLI 執行下列指令:

gcloud compute addresses list