静态出站 IP 地址

默认情况下,Cloud Run 服务使用动态 IP 地址池连接到互联网上的外部端点。如果 Cloud Run 服务连接到需要从静态 IP 地址建立连接的外部端点,例如使用基于 IP 地址的防火墙的数据库或 API,则不适合使用此操作。对于这些连接,您必须将 Cloud Run 服务配置为通过静态 IP 地址路由请求。

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

任务概览

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

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

请注意,连接到同一 VPC 网络的所有 Cloud Run 服务共用同一出站流量 IP 地址。如需为不同的 Cloud Run 服务使用不同的出站流量 IP 地址,请按照本指南创建单独的子网和(可选)无服务器 VPC 访问通道连接器。

创建子网

您必须创建一个专用 /28 子网来托管连接器。如果您使用的是直接 VPC 出站流量,请使用现有子网或创建另一个子网。如果您使用连接器,则专用子网可防止 VPC 中的其他计算资源(例如 Compute Engine 虚拟机或 Google Kubernetes Engine 集群)意外使用静态 IP(如果您配置了无服务器 VPC 访问通道)访问互联网。

gcloud

  1. 查找您的 VPC 网络名称:

    gcloud compute networks list

    您应该会看到如下所示的输出:

    NAME     SUBNET_MODE  BGP_ROUTING_MODE
    default  AUTO         REGIONAL

    确定您要连接到无服务器 VPC 访问通道连接器的网络。

  2. 在 VPC 中为无服务器 VPC 访问通道连接器创建子网。

    gcloud compute networks subnets create SUBNET_NAME \
    --range=RANGE --network=NETWORK_NAME --region=REGION

    替换此命令中的以下值:

    • SUBNET_NAME 替换为您要为子网指定的名称。
    • RANGE 替换为您要分配给此子网的 CIDR 格式的 IP 范围(例如 10.124.0.0/28
    • NETWORK_NAME:VPC 网络的名称。
    • REGION 替换为要在其中创建无服务器 VPC 访问通道连接器的区域。

Terraform

  1. 创建要使用的 VPC 网络。

    resource "google_compute_network" "default" {
      provider = google-beta
      name     = "cr-static-ip-network"
    }

    cr-static-ip-network 替换为子网名称。

  2. 在 VPC 中为无服务器 VPC 访问通道连接器创建子网。

    resource "google_compute_subnetwork" "default" {
      provider      = google-beta
      name          = "cr-static-ip"
      ip_cidr_range = "10.124.0.0/28"
      network       = google_compute_network.default.id
      region        = "us-central1"
    }

    替换

    • cr-static-ip 替换为您的子网名称
    • 10.124.0.0/28 替换为您的 CIDR 范围
    • us-central1 替换为您的 Google Cloud 区域

创建 Serverless VPC Access 连接器

如果您使用直接 VPC 出站流量集成,则无需创建连接器。如果您不使用直接 VPC 出站流量,则需要使用无服务器 VPC 访问通道连接器将 Cloud Run 服务的出站流量路由到 VPC 网络。

如要创建无服务器 VPC 访问通道连接器,请进行如下操作:

gcloud

  1. 使用预先创建的子网创建无服务器 VPC 访问通道连接器。

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
      --region=REGION \
      --subnet-project=PROJECT_ID \
      --subnet=SUBNET_NAME
    

    替换此命令中的以下值:

    • CONNECTOR 替换为您要为此资源指定的名称。
    • PROJECT_ID 替换为托管子网的名称。
    • SUBNET_NAME 替换为您创建的子网名称。
    • REGION 替换为要在其中创建 NAT 网关的区域。

Terraform

  1. 创建无服务器 VPC 访问通道连接器。

    resource "google_project_service" "vpc" {
      provider           = google-beta
      service            = "vpcaccess.googleapis.com"
      disable_on_destroy = false
    }
    
    resource "google_vpc_access_connector" "default" {
      provider = google-beta
      name     = "cr-conn"
      region   = "us-central1"
    
      subnet {
        name = google_compute_subnetwork.default.name
      }
    
      # Wait for VPC API enablement
      # before creating this resource
      depends_on = [
        google_project_service.vpc
      ]
    }

    cr-conn 替换为您的无服务器 VPC 访问通道连接器的名称

配置网络地址转换 (NAT)

如果您使用直接 VPC 出站流量或无服务器 VPC 访问通道连接器,则来自 Cloud Run 服务的请求会到达 VPC 网络。如果要通过静态 IP 将出站请求路由到外部端点,请配置 Cloud NAT 网关。

gcloud

  1. 创建一个新的 Cloud Router 来对 NAT 网关进行编程:

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

    替换此命令中的以下值:

    • ROUTER_NAME 替换为您要创建的 Cloud Router 资源的名称。
    • NETWORK_NAME 替换为您之前找到的 VPC 网络的名称。
    • REGION 替换为要在其中创建 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 替换为要在其中创建 NAT 网关的区域。
    • ORIGIN_IP_NAME 替换为您在上一步中创建的预留 IP 地址资源的名称。

Terraform

  1. 创建一个新的 Cloud Router 来对 NAT 网关进行编程:

    resource "google_compute_router" "default" {
      provider = google-beta
      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" {
      provider = google-beta
      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" {
      provider = google-beta
      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 流量

配置 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" {
  provider = google-beta
  name     = "cr-static-ip-service"
  location = google_compute_subnetwork.default.region

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