直接虛擬私有雲輸出

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

主要優點

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

  • 支援虛擬私有雲流量記錄:您可以在子網路上啟用虛擬私有雲流量記錄,記錄 App Engine 服務的輸出流量。

限制

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

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

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

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

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

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

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

事前準備

  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 服務代理角色或自訂權限,請將 Compute 網路使用者角色 (roles/compute.networkUser) 授予 App Engine 服務代理服務帳戶。如果子網路具有外部 IPv6,則也需要 Compute 公開 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 數量,以免用盡。與 Cloud Run 服務類似,您通常應使用四倍於執行中執行個體數量的 IP (兩倍用於穩定狀態,另外兩倍用於部署期間),以利順利擴充及更新。

隔離傳出至網際網路的流量

根據預設,如果 vpc_egress 設為 private-ranges-only,App Engine 會透過無伺服器工作負載共用的動態 IP 位址區域集區,傳送傳出網路流量。如果工作負載仰賴 IP 信譽,或會產生大量探測流量,請勿使用這個預設共用集區。

在下列情況下,請改為設定 vpc_egress: all-traffic,並透過 Cloud NAT 轉送傳出流量,同時使用專屬的靜態傳出 IP 位址:

  • 您的服務會連線至信譽敏感的外部端點,例如第三方網頁應用程式防火牆 (WAF) 後方的 Payment Gateway、代管資料庫或合作夥伴 API。專屬靜態 IP 位址可防止共用集區中其他租戶的雜訊流量觸發外部 WAF 封鎖或 HTTP 403 錯誤。
  • 您的服務會執行授權網路掃描、通訊埠列舉、主機指紋辨識、安全漏洞探測、網路抓取或負載測試。透過預設共用 IP 集區執行這些工作負載會降低 IP 信譽,可能中斷其他客戶的服務,違反Google Cloud 使用限制政策,並可能導致 Google 限制或暫停您的工作負載。

透過 Cloud NAT 執行授權掃描或高連線工作負載時,請分配足夠的靜態 IP 位址,並設定通訊埠保留,以免通訊埠耗盡。

疑難排解

本節說明使用直連虛擬私有雲輸出功能部署 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 位址不太可能外洩,但可能因下列原因而發生:

  • 部署服務帳戶只有保留位址的權限 (create、createInternal),沒有釋出位址的權限 (delete、deleteInternal)。
  • 其他 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. 按一下「釋出靜態位址」,移除外洩的位址。

    gcloud

    執行 gcloud compute addresses delete 指令:

    gcloud compute addresses delete ADDRESS_NAME --region=REGION

    更改下列內容:

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