直接虛擬私有雲輸出

直連虛擬私有雲輸出功能可為 App Engine 服務提供高效能的網路解決方案,將流量傳送至虛擬私有雲網路。直連虛擬私有雲輸出功能可讓工作負載順暢存取虛擬私有雲網路資源,無須設定無伺服器 VPC 存取連接器。

主要優點

  • 簡化管理:免除管理連接器執行個體、機器類型和調度設定的作業負擔。App Engine 會直接在服務的 app.yaml 檔案中處理設定。
  • 成本效益:使用直連虛擬私有雲輸出功能時,無須支付額外費用,也不必支付連接器 VM 的固定月費。
  • 提升效能和可靠性:直連虛擬私有雲輸出功能不需要使用連接器,因此能以更快速可靠的方式連線至虛擬私有雲網路資源。這項服務的擴充速度與 App Engine 服務相同,且可避免維護期間連接器可能發生的連線中斷問題。
  • 精細的安全防護:您可以將網路標記直接套用至 App Engine 服務版本,啟用精確的服務專屬防火牆規則和網路政策。

限制

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

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

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

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

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

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

事前準備

  1. 請確認專案中已有虛擬私有雲網路和子網路。如果沒有現有的虛擬私有雲網路,請按照「建立虛擬私有雲網路」中的操作說明建立一個。

  2. 啟用 Compute Engine API 和 Cloud Build API:

    啟用 API

  3. 如要使用直連虛擬私有雲來處理輸出流量,請務必執行最新版本的 Google Cloud CLI:

    gcloud components update

必要的角色

請將下列角色授予部署服務帳戶,確保 App Engine 有權存取虛擬私有雲網路:

  • App Engine 服務代理人角色:根據預設,App Engine 服務代理人具有「App Engine 服務代理人」角色 (roles/appengine.serviceAgent),其中包含必要權限。

  • 自訂權限:如要更精細地控管,請在專案中授予 App Engine 服務代理下列額外權限:

    • compute.networks.get
    • compute.subnetworks.get
    • 專案或特定子網路的 compute.subnetworks.use 權限
    • compute.addresses.get
    • compute.addresses.list
    • compute.addresses.create
    • compute.addresses.delete
    • compute.addresses.createInternal
    • compute.addresses.deleteInternal
    • compute.regionOperations.get
  • Compute 網路使用者角色:如果您未使用預設的 App Engine 服務代理程式角色或自訂權限,請在 App Engine 服務代理程式服務帳戶中,授予Compute 網路使用者角色 (roles/compute.networkUser)。如果子網路有外部 IPv6,也需要 Compute Public IP 管理員角色 (roles/compute.publicIpAdmin)

    舉例來說,如要授予 Compute 網路使用者角色,請執行下列指令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:service-PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"

    更改下列內容:

    • PROJECT_ID:專案的 ID。
    • PROJECT_NUMBER:您部署 App Engine 服務的專案編號。

設定具有直連虛擬私有雲輸出流量的 App Engine 服務

如要讓新的或現有的 App Engine 服務直接連線至虛擬私有雲網路,請按照下列步驟操作:

  1. app.yaml 檔案中新增下列 vpc_access 設定:

    vpc_access:
      network_interface:
        network: NETWORK
        subnet: SUBNET
        tags:
            - NETWORK_TAGS
      vpc_egress: EGRESS_SETTING

    更改下列內容:

    • NETWORK:應用程式執行個體連線的現有網路名稱,例如 default。請指定虛擬私有雲網路或子網路,或兩者都指定。如果只指定網路,子網路會使用與網路相同的名稱。

    • SUBNET:應用程式執行個體連線的現有子網路名稱,例如 default。請指定虛擬私有雲網路或子網路,或兩者都指定。如果只指定網路,子網路會使用與網路相同的名稱。

    • 選用:NETWORK_TAGS:要與 App Engine 服務執行個體建立關聯的網路標記清單,用於防火牆規則和路由政策。

    • 選用:EGRESS_SETTING:控管傳出流量的轉送方式。這個欄位支援下列設定:

      • all-traffic:所有輸出要求都會透過虛擬私有雲網路轉送。
      • private-ranges-only (預設):只有前往內部 IP 位址的流量會透過虛擬私有雲網路傳輸。網際網路流量會使用預設的 App Engine 路徑。
  2. 執行下列指令,將應用程式部署至 App Engine:

    gcloud beta app deploy

取消連結服務

如要中斷服務與虛擬私有雲網路的連線,請按照下列步驟操作:

  1. app.yaml 檔案中移除 vpc_access 區段。

  2. 重新部署服務:

    gcloud beta app deploy

IP 管理最佳做法

由於服務的每個執行個體都會耗用子網路的 IP 位址,因此您必須管理 IP 位址。請使用下列策略管理 IP 位址:

  • 建議使用的 IP 範圍:為確保最佳相容性,建議從 RFC 6598 (100.64.0.0/10) 範圍開始。

  • 替代 IP 範圍:如果您已使用建議的 IP 範圍 100.64.0.0/10,可以在子網路中使用非 RFC 1918 範圍,例如 E 類 (240.0.0.0/4)。

  • 子網路大小:請確保子網路的 IPv4 位址範圍為 /26 或更大,以便提供足夠的位址供擴充使用。

  • 超額佈建 IP:建議您超額佈建子網路中可用的 IP 數量,以免 IP 耗盡。與 Cloud Run 服務類似,您通常應使用四倍的 IP (穩定狀態為 2 倍,部署期間額外 2 倍),以利順暢擴縮及更新。

疑難排解

本節說明使用直連虛擬私有雲輸出功能部署 App Engine 服務時,可能會遇到的常見錯誤。

無法刪除子網路

如要刪除子網路,請先刪除或重新部署使用該子網路的所有資源。如果 App Engine 使用子網路,請先將 App Engine 服務從虛擬私有雲網路中斷連線,或移至其他子網路,再刪除子網路。

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

部署失敗

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

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

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

IP 位址耗盡

如果子網路的可用 IP 位址用盡,App Engine 就無法啟動新執行個體,並記錄錯誤。如要解決這個問題,請擴大子網路的 IP 範圍,或將服務移至較大的子網路。

IP 位址洩漏

IP 位址洩漏可能會導致 IP 位址用盡。在標準作業期間,IP 位址不太可能洩漏,但可能因下列原因而發生:

  • 您的部署服務帳戶只有保留地址的權限 (createcreateInternal),沒有釋出地址的權限 (deletedeleteInternal)。
  • 您刪除服務帳戶時,其他 Google Cloud 地址預訂仍處於有效狀態。
  • 在無伺服器位址預留項目處於啟用狀態時,Cloud Billing 帳戶已從專案中移除,隨後又重新啟用。
  • 您的 Google Cloud 專案已刪除,但後來在無伺服器位址預留項目仍存在時還原。

如要解決這個問題,請按照下列步驟操作:

  1. Logs Explorer 中查詢下列記錄,找出外洩的地址:

    protoPayload.authorizationInfo.permission=~"compute.addresses.delete.*"
    protoPayload.authorizationInfo.resourceAttributes.type="compute.addresses"
    protoPayload.resourceName=~"projects/.*/regions/.*/addresses/serverless-.*"
    severity>=WARNING
    

    如果這項查詢未傳回結果,表示沒有 IP 位址洩漏, 無須採取進一步行動。

  2. 如果查詢傳回結果,請確認部署服務帳戶包含 App Engine 服務代理角色 (roles/appengine.serviceAgent)。如果無法使用這個角色,請確保您在部署服務帳戶中授予其他必要角色和權限

  3. 使用 Google Cloud 控制台或 Google Cloud CLI 手動刪除洩漏的 IP 位址:

    控制台

    1. 前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面:

      前往「IP addresses」(IP 位址) 頁面

    2. 選取您在上一個步驟中執行查詢時發現的洩漏 IP 位址。

    3. 按一下「Release static address」(釋放靜態位址),移除洩漏的位址。

    gcloud

    執行 gcloud compute addresses delete 指令:

    gcloud compute addresses delete ADDRESS_NAME --region=REGION

    更改下列內容:

    • ADDRESS_NAME:遭洩漏 IP 位址的名稱。
    • REGION:洩漏 IP 位址的區域。