根據預設,App Engine 標準環境中的傳出服務 (例如網址擷取、Sockets 和 Mail API) 會使用所有無伺服器工作負載共用的動態 IP 位址區域集區。這個集區中的 IP 位址範圍會定期變更,因此來自同一個應用程式的兩次連續呼叫,可能來自不同的 IP 位址。
其他無伺服器工作負載會共用這個預設 IP 位址集區,因此如果您需要可預測的來源 IP 位址或獨立 IP 信譽,請勿依賴這個集區。在下列情況下,請改為服務設定靜態傳出 IP 位址:
- 您連線至使用 IP 位址許可清單或防火牆的外部資料庫或 API。
- 您連線至對信譽敏感的外部端點,例如付款閘道、代管資料庫,或受第三方網頁應用程式防火牆 (WAF) 保護的合作夥伴 API。預設共用 IP 集區中其他租戶的雜訊流量,可能會降低 IP 信譽,導致外部 WAF 封鎖或限制您的要求。
- 您執行授權的網路掃描、通訊埠列舉、主機指紋、安全漏洞探測、網路抓取或負載測試工作負載。
如果只需要查詢與服務預設傳出流量相關聯的 IP 位址範圍,您可以找出包含 App Engine IP 位址的目前 IP 位址範圍。
App Engine 服務的 IP 位址
您可以使用 Google 發布的兩個 JSON 檔案,找出 App Engine 服務目前的 IP 位址範圍:
Google 在 goog.json 中發布了 Google 擁有的 IP 位址清單。
另外,Google 也以 cloud.json 的格式發布了另一份清單,當中列出了客戶可以在全球和特定區域內使用的外部 IP 位址範圍,可用於 Google Cloud 資源。
從 goog.json 的範圍中移除 cloud.json 的所有範圍,會產生一組龐大的 IP 位址,供全球 Google API 和其他 Google 服務使用,包括 Google Cloud以外的客戶端產品。這些清單會經常更新。
您可以使用下列 Python 指令碼,建立 IP 位址範圍清單,其中包含 Google API 和服務使用的範圍。
如要瞭解如何執行這個指令碼,請參閱「如何執行」。
設定靜態傳出 IP 位址
如要為 App Engine 標準環境服務設定靜態 IP 位址,請使用直接虛擬私有雲輸出 (預先發布版) 或無伺服器虛擬私有雲存取,搭配 Cloud Router 和 Cloud NAT,將傳出流量轉送至虛擬私有雲網路。將 Cloud NAT 閘道新增至虛擬私有雲網路,即可透過保留的靜態 IP 位址轉送 App Engine 傳出流量。
如果服務會擴充至多個執行個體,或開啟多個並行連線 (例如在授權網路掃描期間),請為 Cloud NAT 指派多個靜態 IP 位址。您也可以增加每個執行個體的通訊埠數量下限,或啟用動態通訊埠分配功能,避免通訊埠用盡。進一步瞭解 Cloud NAT 閘道如何使用 IP 位址和通訊埠。
透過 Cloud NAT 轉送流量不會在網路堆疊中增加額外的躍點,因為 Cloud NAT 閘道和 Cloud Router 僅提供控制層,封包不會通過 Cloud NAT 閘道或 Cloud Router。
下列步驟說明如何為 App Engine 標準環境服務設定靜態傳出 IP 位址。
確認您具備 roles/compute.networkAdmin 角色,或具有相同權限的自訂角色。
在虛擬私有雲網路中,為 App Engine 流量建立子網路。這可確保虛擬私有雲網路中的其他資源無法使用靜態 IP 位址。
gcloud compute networks subnets create SUBNET_NAME \ --range=RANGE \ --network=NETWORK_NAME \ --region=REGION
在上述指令中,請替換下列項目:
- 將
SUBNET_NAME替換為您要為子網路指定的名稱。 RANGE:要指派給這個子網路的 IP 範圍,採用 CIDR 格式 (例如10.124.0.0/28)- 將
NETWORK_NAME替換為虛擬私有雲網路名稱。 REGION:App Engine 服務的區域。
- 將
將 App Engine 服務連線至子網路。
按照「連線至虛擬私有雲網路」指南操作,並指定您在上一個步驟中建立的子網路名稱,做為連接器子網路。
建立新的 Cloud Router。Cloud Router 是 Cloud NAT 的必要控制層元件。
gcloud compute routers create ROUTER_NAME \ --network=NETWORK_NAME \ --region=REGION
在上述指令中,請替換下列項目:
ROUTER_NAME:要建立的 Cloud Router 資源名稱。- 將
NETWORK_NAME替換為虛擬私有雲網路名稱。 REGION替換為要建立 NAT 閘道的區域。
預留靜態 IP 位址。
服務會使用這個位址傳送傳出流量。當與預留 IP 位址資源相關聯的資源遭到刪除並重新建立時,預留 IP 位址資源會保留基礎 IP 位址。這個 IP 位址會計入 Google Cloud 專案的靜態 IP 位址配額。
gcloud compute addresses create ORIGIN_IP_NAME \ --region=REGION
在上述指令中,請替換下列項目:
- 將
ORIGIN_IP_NAME替換為您要指派給 IP 位址資源的名稱。 - 將
REGION替換為要執行 Cloud NAT 路由器的區域。建議您選擇與 App Engine 服務相同的區域,盡可能縮短延遲時間並降低網路費用。
使用
compute addresses describe指令查看結果:gcloud compute addresses describe ORIGIN_IP_NAME
- 將
建立 Cloud NAT 閘道並指定 IP 位址。
源自子網路的流量會通過這個閘道,並使用您在上一個步驟中保留的靜態 IP 位址。
gcloud compute routers nats create NAT_NAME \ --router=ROUTER_NAME \ --region=REGION \ --nat-custom-subnet-ip-ranges=SUBNET_NAME \ --nat-external-ip-pool=ORIGIN_IP_NAME
在上述指令中,請替換下列項目:
NAT_NAME:要建立的 Cloud NAT 閘道資源名稱。ROUTER_NAME:Cloud Router 的名稱。REGION替換為要建立 NAT 閘道的區域。ORIGIN_IP_NAME:您在上一步建立的預留 IP 位址資源名稱。
將無伺服器 VPC 存取輸出設定設為
all-traffic。根據預設,使用無伺服器 VPC 存取的 App Engine 服務只會將內部流量傳送至虛擬私有雲網路。如要將目的地為外部的流量傳送至虛擬私有雲網路,使其具有您指定的靜態 IP 位址,則必須變更輸出設定。
在服務的
app.yaml檔案中指定輸出設定:vpc_access_connector: name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME egress_setting: all-traffic
更改項目:
- 將
PROJECT_ID替換為 Google Cloud 專案 ID。 - 將
REGION替換為連接器所在的區域。 - 將
CONNECTOR_NAME替換為連接器名稱。
- 將
部署服務:
gcloud app deploy