根據預設,Cloud Run 服務會使用動態 IP 位址集區,連線至網際網路上的外部端點。如果 Cloud Run 服務連線至需要靜態 IP 位址的外部端點 (例如使用 IP 位址型防火牆的資料庫或 API),您必須設定 Cloud Run 服務,透過靜態 IP 位址傳送要求。
本頁說明如何啟用 Cloud Run 服務,以便使用靜態 IP 位址傳送要求。
建議您設定 Cloud Run,使用直接虛擬私有雲輸出將流量傳送至虛擬私有雲網路。不過,您可以選擇建立連接器。
工作總覽
如要讓 Cloud Run 服務使用靜態 IP 位址轉送要求,請設定 Cloud Run 服務的虛擬私有雲輸出流量,透過已設定靜態 IP 位址的 Cloud NAT 閘道,將所有輸出流量轉送至 VPC 網路。
在本教學課程中,您將以手動模式設定 Cloud NAT,並為其指派單一靜態 IP 位址。如果 Cloud Run 工作負載擴充至大量,您可能需要為 Cloud NAT 指派多個靜態 IP 位址。進一步瞭解 Cloud NAT 閘道如何使用 IP 位址和通訊埠。
透過 Cloud NAT 傳送流量不會在網路堆疊中造成額外的躍點,因為 Cloud NAT 閘道和 Cloud Router 只提供控制層,封包不會通過 NAT 閘道或 Cloud Router。
設定網路位址轉譯 (NAT)
如果您使用直接虛擬私有雲輸出或無伺服器虛擬私有雲存取連接器,Cloud Run 服務的要求會傳送至虛擬私有雲網路。如要使用靜態 IP 將傳出要求路由至外部端點,請設定 Cloud NAT 閘道。
gcloud
建立新的 Cloud Router,以設定 Cloud NAT 閘道:
gcloud compute routers create ROUTER_NAME \ --network=NETWORK_NAME \ --region=REGION
更改下列內容:
ROUTER_NAME
:您要建立的 Cloud Router 資源名稱。NETWORK_NAME
:您先前找到的虛擬私有雲網路名稱。REGION
:要在其中建立 Cloud NAT 閘道的區域。
保留靜態 IP 位址。如果與預留 IP 位址資源相關聯的資源遭到刪除並重新建立,該資源會保留底層 IP 位址:
gcloud compute addresses create ORIGIN_IP_NAME --region=REGION
更改下列內容:
ORIGIN_IP_NAME
:您要指派給 IP 位址資源的名稱。REGION
:將執行 Cloud NAT 路由器的區域。請使用與 Cloud Run 服務相同的區域,盡量縮短延遲時間並降低網路費用。
在這個路由器上建立 Cloud NAT 閘道設定,使用您建立的靜態 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
:要在其中建立 Cloud NAT 閘道的區域。SUBNET_NAME
:子網路名稱。ORIGIN_IP_NAME
:您在上一個步驟中建立的保留 IP 位址資源名稱。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
建立新的 Cloud Router,以設定 Cloud NAT 閘道:
將
cr-static-ip-router
替換為子網路名稱。保留靜態 IP 位址。如果與預留 IP 位址資源相關聯的資源遭到刪除並重新建立,該資源會保留底層 IP 位址:
將
cr-static-ip-addr
替換為子網路名稱。在這個路由器上建立 Cloud NAT 閘道設定,使用您建立的靜態 IP 位址,轉送來自虛擬私有雲網路的流量:
將
cr-static-nat
替換為 Cloud NAT 閘道名稱。
透過虛擬私有雲網路轉送 Cloud Run 流量
設定 Cloud NAT 後,請使用直接虛擬私有雲輸出或無伺服器虛擬私有雲存取連接器,部署或更新 Cloud Run 服務,並將虛擬私有雲輸出設定為透過虛擬私有雲網路傳送所有流量:
gcloud
直接虛擬私有雲輸出
如要部署或更新 Cloud Run 服務,以使用直接虛擬私有雲輸出,並透過該服務轉送所有輸出流量,請執行下列指令:
gcloud run deploy SERVICE_NAME
--image=IMAGE_URL
--network=NETWORK
--subnet=SUBNET
--region=REGION
--vpc-egress=all-traffic
更改下列內容:
- SERVICE_NAME:要部署的 Cloud Run 服務名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。 - NETWORK:虛擬私有雲網路的名稱。
- SUBNET:子網路名稱。
- REGION:服務的區域。
無伺服器虛擬私有雲存取連接器
如要部署或更新 Cloud Run 服務,以便使用無伺服器虛擬私有雲存取連接器,並透過該連接器路由所有輸出流量,請執行下列指令:
gcloud run deploy SERVICE_NAME
--image=IMAGE_URL
--vpc-connector=CONNECTOR_NAME
--region=REGION
--vpc-egress=all-traffic
更改下列內容:
- SERVICE_NAME:要部署的 Cloud Run 服務名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。 - CONNECTOR_NAME:無伺服器虛擬私有雲存取連接器的名稱。
- REGION:服務的區域。
YAML
直接虛擬私有雲輸出
如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
視需要更新。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]' run.googleapis.com/vpc-access-egress: all-traffic spec: containers: - image: IMAGE_URL
更改下列內容:
- SERVICE:Cloud Run 服務的名稱。
- NETWORK:虛擬私有雲網路的名稱。
- SUBNET:子網路名稱。
- IMAGE_URL:服務容器映像檔的網址。
使用下列指令建立或更新服務:
gcloud run services replace service.yaml
無伺服器虛擬私有雲存取連接器
如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
視需要更新。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/vpc-access-connector: CONNECTOR_NAME spec: containers: - image: IMAGE_URL
更改下列內容:
- SERVICE:Cloud Run 服務的名稱。
- :無伺服器虛擬私有雲存取網路的名稱。CONNECTOR_NAME
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。
使用下列指令建立或更新服務:
gcloud run services replace service.yaml
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
這項 Cloud Run 服務使用虛擬私有雲連接器,並透過該連接器轉送所有輸出流量:
將 us-docker.pkg.dev/cloudrun/container/hello
替換為容器映像檔的參照。
驗證靜態外部 IP 位址
完成上述步驟後,您已在虛擬私有雲網路中設定 Cloud NAT,並使用預先定義的靜態 IP 位址,且已將所有 Cloud Run 服務的出站流量路由至虛擬私有雲網路。Cloud Run 服務的要求會透過虛擬私有雲網路傳輸,並使用靜態 IP 位址連線至外部端點。
如要驗證這項行為並確認服務使用的來源 IP 位址,您可以向 API 或 curlmyip.org 等網站提出要求,這些網站會顯示來源 IP 位址。
刪除靜態外部 IP 位址
如果不再需要靜態外部 IP 位址,請參閱「釋出靜態外部 IP 位址」。