直連虛擬私有雲輸出提供高效能網路解決方案,可讓 App Engine 服務將流量傳送至虛擬私有雲 (VPC) 網路。直連虛擬私有雲輸出功能可讓工作負載順暢存取虛擬私有雲網路資源,不必設定無伺服器 VPC 存取連接器。
主要優點
- 簡化管理:免除管理連接器執行個體、機器類型和資源調度設定的作業負擔。App Engine 會直接在服務的
app.yaml檔案中處理設定。 - 成本效益:使用直連虛擬私有雲輸出功能不需額外付費,也不必支付連接器 VM 的固定月費。
- 提升效能和可靠性:直連虛擬私有雲輸出功能不需要使用連接器,因此能以更快速、更可靠的方式連線至虛擬私有雲網路資源。這項服務的擴充速度與 App Engine 服務一樣快,可避免連接器在維護期間可能發生的連線中斷問題。
精細的安全防護:您可以直接將網路標記套用至 App Engine 服務版本,啟用精確、服務專屬的防火牆規則和網路政策。
支援虛擬私有雲流量記錄:您可以在子網路上啟用虛擬私有雲流量記錄,記錄 App Engine 服務的輸出流量。
支援 Cloud NAT:您可以在子網路上設定 Cloud NAT 閘道,為 App Engine 服務的傳出流量提供 NAT 服務,例如公開 NAT 或 Private NAT。
限制
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 小時。
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 範圍:
事前準備
確認專案中已有虛擬私有雲網路和子網路。如果沒有現有的虛擬私有雲,請按照「建立虛擬私有雲網路」中的操作說明建立。
啟用 Compute Engine API 和 Cloud Build API:
如要使用直連虛擬私有雲輸出,請務必執行最新版 Google Cloud CLI:
gcloud components update
必要的角色
將下列角色授予 App Engine 服務代理,確保 App Engine 有權存取虛擬私有雲網路:
App Engine 服務代理角色:根據預設,App Engine 服務代理具有 App Engine 服務代理角色 (
roles/appengine.serviceAgent),其中包含必要權限。自訂權限:如要更精細地控管,請在專案中授予 App Engine 服務代理下列額外權限:
compute.networks.getcompute.subnetworks.get- 專案或特定子網路的
compute.subnetworks.use compute.addresses.getcompute.addresses.listcompute.addresses.createcompute.addresses.deletecompute.addresses.createInternalcompute.addresses.deleteInternalcompute.regionOperations.get
Compute 網路使用者角色:如果您不使用預設的 App Engine 服務代理角色或自訂權限,請將 Compute 網路使用者角色 (
roles/compute.networkUser) 授予 App Engine 服務代理。如果子網路具有外部 IPv6,則也需要運算公開 IP 管理員角色 (roles/compute.publicIpAdmin)。例如,如要授予 Compute 網路使用者角色,請執行下列指令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@gcp-gae-service." \ --role "roles/compute.networkUser"
更改下列內容:
- PROJECT_ID:專案 ID。
- PROJECT_NUMBER:部署 App Engine 服務的專案編號。
設定 App Engine 服務,並啟用直連虛擬私有雲輸出
您可以使用 YAML 或 Terraform,為 App Engine 服務設定直連虛擬私有雲輸出。如要啟用或中斷直連虛擬私有雲輸出,請部署新版本並遷移流量。您也可以先刪除已部署的版本,而不是覆寫現有的版本 ID。
YAML
在
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 路徑。
執行下列指令,將應用程式部署至 App Engine:
gcloud app deploy
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
在 Terraform 設定中,將下列
vpc_access區塊新增至google_app_engine_standard_app_version資源:vpc_access { vpc_egress = "EGRESS_SETTING" network_interfaces { network = "NETWORK" subnetwork = "SUBNET" tags = ["TAG_1", "TAG_2"] } }
更改下列內容:
- NETWORK:應用程式執行個體連線至的現有虛擬私有雲網路名稱,例如
default。指定虛擬私有雲網路和/或子網路。如果只指定網路,子網路會使用與網路相同的名稱。您也可以參照google_compute_network資源名稱 (例如google_compute_network.custom.name)。 - SUBNET:應用程式執行個體連線至的現有子網路名稱,例如
default。指定虛擬私有雲網路或子網路,或兩者皆指定。如果只指定網路,子網路會使用與網路相同的名稱。您也可以參照google_compute_subnetwork資源名稱 (例如google_compute_subnetwork.custom.name)。 - 選用:TAG_1、TAG_2 列出要與 App Engine 服務執行個體建立關聯的網路標記,以便用於防火牆規則和路由政策。
- 選用:EGRESS_SETTING 可控管傳出流量的轉送方式。這個欄位支援下列設定:
ALL_TRAFFIC:所有傳出要求都會透過虛擬私有雲網路轉送。PRIVATE_IP_RANGES(預設):只有傳送至內部 IP 位址的流量會透過虛擬私有雲網路轉送。網際網路流量會使用預設的 App Engine 路徑。
- NETWORK:應用程式執行個體連線至的現有虛擬私有雲網路名稱,例如
如果版本已部署,但未啟用直連虛擬私有雲輸出功能,請將
version_id欄位更新為新值。您無法在現有版本上啟用直連虛擬私有雲輸出。套用設定:
terraform apply
取消連結服務
如要中斷服務與虛擬私有雲網路的連線,請使用 YAML 或 Terraform:
YAML
從
app.yaml檔案中移除vpc_access區段。重新部署服務:
gcloud app deploy
Terraform
從 Terraform 設定中的
google_app_engine_standard_app_version資源移除vpc_access區塊。將
version_id欄位更新為新值。您無法停用現有版本的直連虛擬私有雲輸出。套用設定:
terraform apply
隔離傳出至網際網路的流量
根據預設,如果 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 權限不足。請務必將必要權限授予 App Engine 服務代理。如果在部署期間發生權限錯誤,請務必將下列額外角色授予部署服務帳戶:
- Cloud Build 服務帳戶 (
roles/cloudbuild.builds.builder) - 服務帳戶權杖建立者 (
roles/iam.serviceAccountTokenCreator)
- Cloud Build 服務帳戶 (
IP 位址耗盡
如果子網路沒有可用的 IP 位址,App Engine 就無法啟動新執行個體,並會記錄錯誤。如要解決這個問題,請擴大子網路的 IP 範圍,或將服務移至較大的子網路。
IP 位址外洩
IP 位址外洩可能會導致 IP 位址耗盡。標準作業期間不太可能發生 IP 位址外洩,但可能因下列原因而發生:
- App Engine 服務代理僅有權限保留位址 (
create、createInternal),但無權限釋出位址 (delete、deleteInternal)。 - App Engine 服務代理已刪除,但其他 Google Cloud 位址預留項目仍有效。
- 在無伺服器位址預留項目啟用期間,Cloud Billing 帳戶遭到移除,隨後又在專案中重新啟用。
- 您的 Google Cloud 專案已刪除,之後在無伺服器位址預留項目仍存在時還原。
如要解決這個問題,請按照下列步驟操作:
在記錄檔探索工具中查詢下列記錄,找出外洩的位址:
protoPayload.authorizationInfo.permission=~"compute.addresses.delete.*" protoPayload.authorizationInfo.resourceAttributes.type="compute.addresses" protoPayload.resourceName=~"projects/.*/regions/.*/addresses/serverless-.*" severity>=WARNING如果這項查詢未傳回結果,代表沒有 IP 位址外洩,您無須採取進一步行動。
如果查詢傳回結果,請確認 App Engine 服務代理具有 App Engine 服務代理角色 (
roles/appengine.serviceAgent)。如果無法使用這個角色,請務必將其他必要角色和權限授予 App Engine 服務代理。使用 Google Cloud 控制台或 Google Cloud CLI 手動刪除外洩的 IP 位址:
控制台
前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面:
執行查詢,選取在上一個步驟中找到的外洩 IP 位址。
按一下「釋出靜態位址」,移除外洩的位址。
gcloud
執行
gcloud compute addresses delete指令:gcloud compute addresses delete ADDRESS_NAME --region=REGION
更改下列內容:
- ADDRESS_NAME:外洩 IP 位址的名稱。
- REGION:外洩 IP 位址的區域。