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

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

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

事前準備

請參閱「IP 位址分配」一節,瞭解如何從子網路分配 IP 位址。

限制

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

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

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

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

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

  • 虛擬私有雲流量記錄:不會在記錄中顯示 App Engine 服務版本。服務名稱會顯示在 AppEngineServiceDetails 欄位中。

設定 IAM 權限

共用虛擬私有雲服務專案中的 App Engine 必須先具備足夠的權限,才能使用子網路,進而存取共用虛擬私有雲網路。

  • App Engine 服務代理角色:如要存取共用 VPC 網路,請新增下列任一角色,為 App Engine 服務代理授予足夠的權限:

    • Compute 網路使用者 (roles/compute.networkUser) 在 Shared VPC 主專案中。具有外部 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 管理員 (roles/compute.publicIpAdmin) 角色。

      舉例來說,如要在子網路上授予 Compute Network User 角色,請執行下列指令:

      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
    • 共用 VPC 服務專案的 compute.addresses.get
    • 共用 VPC 服務專案的 compute.addresses.list
    • 共用 VPC 服務專案的 compute.addresses.create
    • Shared VPC 服務專案的 compute.addresses.delete
    • Shared VPC 服務專案的 compute.addresses.createInternal
    • Shared VPC 服務專案的 compute.addresses.deleteInternal
    • Shared VPC 服務專案的 compute.regionOperations.get

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 分鐘。總共保留至少 2 倍的 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 服務可將流量傳送至 Shared VPC 虛擬私有雲網路,無需無伺服器 VPC 存取連接器。您可以將網路標記指派給特定版本的 App Engine 服務,以實現更精細的網路安全性,例如套用 VPC 防火牆規則。

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

  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

疑難排解

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

無法刪除子網路

如要刪除子網路,請先刪除使用該子網路的所有資源。如果 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