静态出站 IP 地址

默认情况下,Cloud Run 服务使用动态 IP 地址池连接到互联网上的外部端点。如果 Cloud Run 服务连接到需要静态 IP 地址的外部端点,(例如使用基于 IP 地址的防火墙的数据库或 API),则您必须将 Cloud Run 服务配置为使用静态 IP 地址路由请求。

本页面介绍了如何启用 Cloud Run 服务以使用静态 IP 地址发送请求。

我们建议您配置 Cloud Run 以使用直接 VPC 出站流量将流量发送到 VPC 网络。不过,您可以选择创建连接器

任务概览

如需启用 Cloud Run 服务以使用静态 IP 地址路由请求,请将 Cloud Run 服务的 VPC 出站流量配置为通过具有配置了静态 IP 地址的 Cloud NAT 网关的 VPC 网络路由所有出站流量。

通过 Cloud NAT 路由流量不会导致网络栈中出现额外的跃点,因为 Cloud NAT 网关和 Cloud Router 路由器仅提供一个控制平面,并且数据包不通过 NAT 网关或 Cloud Router 路由器。

配置网络地址转换 (NAT)

如果您使用直接 VPC 出站流量或无服务器 VPC 访问通道连接器,则来自 Cloud Run 服务的请求会到达 VPC 网络。如果您要使用静态 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 替换为您之前找到的 VPC 网络的名称。
    • REGION 替换为您要在其中创建 Cloud NAT 网关的区域。
  2. 保留静态 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 地址路由来自 VPC 网络的流量:

    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

  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 地址:

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

    cr-static-ip-addr 替换为您的子网名称。

  3. 在此路由器上创建 Cloud NAT 网关配置,以使用您创建的静态 IP 地址路由来自 VPC 网络的流量:

    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 网关名称。

通过 VPC 网络路由 Cloud Run 流量

配置 Cloud NAT 后,使用直接 VPC 出站流量无服务器 VPC 访问通道连接器部署或更新 Cloud Run 服务,并将 VPC 出站流量设置为通过 VPC 网络路由所有流量

gcloud

  • 直接 VPC 出站流量

    如需部署或更新 Cloud Run 服务以使用直接 VPC 出站流量并通过该集成路由所有出站流量,请运行以下命令:

    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 替换为 VPC 网络的名称。
    • 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 替换为您的服务的区域。

Terraform

此 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 地址

完成以上步骤后,您便可使用预定义的静态 IP 地址在 VPC 网络上设置 Cloud NAT,并将所有 Cloud Run 服务的出站流量路由到您的 VPC 网络。来自 Cloud Run 服务的请求通过您的 VPC 网络传输,并使用静态 IP 地址访问外部端点。

如需验证此行为并确认服务使用的来源 IP 地址,您可以向显示发起 IP 地址的 API 或网站(例如 curlmyip.org)发出请求。

删除静态外部 IP 地址

如果您不再需要某个静态外部 IP 地址,请参阅释放静态外部 IP 地址