靜態外寄 IP 位址

根據預設,Cloud Run 工作負載會使用所有無伺服器工作負載共用的區域性動態 IP 位址集區,連線至網際網路上的外部端點。由於其他工作負載會共用這個集區,因此如果您需要可預測的來源 IP 位址或獨立的 IP 信譽,就不應依賴這個集區。

在下列情況下,請設定 Cloud Run 工作負載,使用專屬靜態 IP 位址轉送傳出要求:

  • 您連線至使用 IP 位址許可清單或防火牆的外部資料庫或 API。
  • 您連線至對信譽敏感的外部端點,例如付款閘道、代管資料庫,或受第三方網頁應用程式防火牆 (WAF) 保護的合作夥伴 API。預設共用 IP 集區中其他租戶的雜訊流量,可能會降低 IP 信譽,導致外部 WAF 封鎖或限制您的要求。
  • 您執行授權的網路掃描、通訊埠列舉、主機指紋、安全漏洞探測、網路抓取或負載測試工作負載。

如要從專屬靜態 IP 位址傳送傳出要求,請將 Cloud Run 服務設為使用直連虛擬私有雲輸出。 您也可以選擇建立連接器。

工作總覽

如要使用靜態 IP 位址轉送要求,請設定服務的虛擬私有雲輸出,透過虛擬私有雲網路傳送所有傳出流量 (--vpc-egress=all-traffic)。使用預留的靜態 IP 位址,將 Cloud NAT 閘道連結至該網路。

在本教學課程中,您將以手動模式設定 Cloud NAT,並為其指派單一靜態 IP 位址。如果工作負載擴充至多個容器執行個體,或開啟多個並行連線 (例如在授權網路掃描期間),請為 Cloud NAT 指派多個靜態 IP 位址。您也可以增加每個容器執行個體的通訊埠數量下限,或啟用動態通訊埠分配功能,避免通訊埠耗盡。進一步瞭解 Cloud NAT 閘道如何使用 IP 位址和通訊埠。

透過 Cloud NAT 轉送流量不會在網路堆疊中增加額外的躍點,因為 Cloud NAT 閘道和 Cloud Router 僅提供控制層,封包不會通過 NAT 閘道或 Cloud Router。

設定網路位址轉譯 (NAT)

如果您使用直連虛擬私有雲輸出 或無伺服器 VPC 存取連接器,Cloud Run 服務的要求會傳送至虛擬私有雲網路。如要使用靜態 IP 將傳出要求轉送至外部端點,請設定 Cloud NAT 閘道。

gcloud

  1. 建立新的 Cloud Router,以便設定 Cloud NAT 閘道:

    gcloud compute routers create ROUTER_NAME \
      --network=NETWORK_NAME \
      --region=REGION

    更改下列內容:

    • ROUTER_NAME:要建立的 Cloud Router 資源名稱。
    • NETWORK_NAME:您先前找到的虛擬私有雲網路名稱。
    • REGION:要建立 Cloud NAT 閘道的區域。
  2. 預留靜態 IP 位址。當與預留 IP 位址資源相關聯的資源遭到刪除並重新建立時,預留 IP 位址資源會保留基礎 IP 位址:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    更改下列內容:

    • ORIGIN_IP_NAME:要指派給 IP 位址資源的名稱。
    • REGION:執行 Cloud NAT 路由器的區域。請使用與 Cloud Run 服務相同的區域,盡可能縮短延遲時間並降低網路費用。
  3. 在這個路由器上建立 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 指令」。

  1. 建立新的 Cloud Router,以便設定 Cloud NAT 閘道:

    resource "google_compute_router" "default" {
      name    = "cr-static-ip-router"
      network = google_compute_network.default.name
      region  = google_compute_subnetwork.default.region
    }

    將 cr-static-ip-router 替換為子網路名稱。

  2. 預留靜態 IP 位址。當與預留 IP 位址資源相關聯的資源遭到刪除並重新建立時,預留 IP 位址資源會保留基礎 IP 位址:

    resource "google_compute_address" "default" {
      name   = "cr-static-ip-addr"
      region = google_compute_subnetwork.default.region
    }

    將 cr-static-ip-addr 替換為子網路名稱。

  3. 在這個路由器上建立 Cloud NAT 閘道設定,使用您建立的靜態 IP 位址,轉送來自虛擬私有雲網路的流量:

    resource "google_compute_router_nat" "default" {
      name   = "cr-static-nat"
      router = google_compute_router.default.name
      region = google_compute_subnetwork.default.region
    
      nat_ip_allocate_option = "MANUAL_ONLY"
      nat_ips                = [google_compute_address.default.self_link]
    
      source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
      subnetwork {
        name                    = google_compute_subnetwork.default.id
        source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
      }
    }

    將 cr-static-nat 替換為 Cloud NAT 閘道名稱。

透過虛擬私有雲網路轉送 Cloud Run 流量

設定 Cloud NAT 後,請使用直連虛擬私有雲輸出或無伺服器 VPC 存取連接器部署或更新 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:服務的區域。

無伺服器 VPC 存取連接器

如要部署或更新 Cloud Run 服務,以便使用無伺服器 VPC 存取連接器,並透過該連接器轉送所有輸出流量,請執行下列指令:

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:無伺服器 VPC 存取連接器的名稱。
  • REGION:服務的區域。

YAML

直連虛擬私有雲輸出

  1. 如果您要建立新服務,請略過這個步驟。如要更新現有服務,請下載其 YAML 設定:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 視需要更新。

    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:服務容器映像檔的網址。
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

    gcloud run services replace 指令預設會使用 service.yaml 檔案 (如有)。

無伺服器 VPC 存取連接器

  1. 如果您要建立新服務,請略過這個步驟。如要更新現有服務,請下載其 YAML 設定:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 視需要更新。

    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:無伺服器 VPC 存取網路的名稱。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須預先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

    gcloud run services replace 指令預設會使用 service.yaml 檔案 (如有)。

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

直連虛擬私有雲輸出

這項 Cloud Run 服務使用直連虛擬私有雲輸出,並透過該輸出轉送所有輸出流量:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    vpc_access {
      network_interfaces {
        network    = "default"
        subnetwork = "default"
        tags       = ["tag1", "tag2", "tag3"]
      }
    }
  }
}

無伺服器 VPC 存取連接器

這項 Cloud Run 服務使用 VPC 連接器,並透過該連接器轉送所有輸出流量:

resource "google_cloud_run_v2_service" "default" {
  name     = "cr-static-ip-service"
  location = google_compute_subnetwork.default.region

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # Replace with the URL of your container
      #   gcr.io/<YOUR_GCP_PROJECT_ID>/<YOUR_CONTAINER_NAME>
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    scaling {
      max_instance_count = 5
    }
    vpc_access {
      connector = google_vpc_access_connector.default.id
      egress    = "ALL_TRAFFIC"
    }
  }
  ingress = "INGRESS_TRAFFIC_ALL"

}

將 us-docker.pkg.dev/cloudrun/container/hello 替換為容器映像檔的參照。

驗證靜態外部 IP 位址

完成上述步驟後,您已在虛擬私有雲網路上設定 Cloud NAT,並指定靜態 IP 位址,且已將所有 Cloud Run 服務的傳出流量轉送至虛擬私有雲網路。Cloud Run 服務的要求會透過虛擬私有雲網路傳送,並使用靜態 IP 位址連至外部端點。

如要驗證這項行為,並確認服務使用的來源 IP 位址,您可以向 API 或網站 (例如 curlmyip.org) 提出要求,顯示來源 IP 位址。

刪除靜態外部 IP 位址

如果不再需要靜態外部 IP 位址,請參閱「釋出靜態外部 IP 位址」。