限制 Cloud Run 的网络入站流量

本页面介绍如何使用入站流量设置来限制对 Cloud Run 服务的网络访问。

在网络级层,可以从以下网络入站流量路径访问 Cloud Run 服务的端点:

  • 默认 run.app 网址(可以停用
  • 任何已配置的网域映射
  • 任何已配置的外部应用负载均衡器或内部应用负载均衡器

所有网络入站流量路径都受服务的入站流量设置约束。默认的入站流量路径和入站流量设置允许互联网上的任何资源访问您的 Cloud Run 服务。您可以使用自定义限制条件来限制组织或一组项目的入站流量设置。IAM 身份验证仍然适用于从上述任何网络入站流量路径到达服务端点的请求。如需采用分层方法来管理访问权限,请同时使用网络入站流量设置和 IAM 身份验证。

可用的网络入站流量设置

您可以使用以下设置:

设置 说明
内部 限制性最高。允许来自以下来源的请求:
  • 内部应用负载均衡器,包括通过内部应用负载均衡器路由的来自共享 VPC 网络的请求。
  • 任何包含 Cloud Run 服务的 VPC Service Controls 边界允许的资源。Cloud Run 必须配置为受限服务。
  • 与 Cloud Run 服务位于同一项目中的 VPC 网络。
  • 共享 VPC 入站流量:您的修订版本配置为将流量发送到的共享 VPC 网络。如需了解共享 VPC 流量何时被识别为“内部”,请参阅共享 VPC 的特殊注意事项
  • 以下 Google Cloud 产品(如果与 Cloud Run 服务位于同一项目或 VPC Service Controls 边界内,并且使用的是默认 run.app 网址,而不是自定义网域):
来自这些来源的请求会保留在 Google 网络中,即使它们通过 run.app 网址访问您的服务也是如此。来自其他来源(包括互联网)的请求无法通过 run.app 网址或自定义网域访问您的服务。

内部和 Cloud Load Balancing 此设置允许来自以下资源的请求:
  • 限制性较高的“内部”设置允许的资源
  • 外部应用负载均衡器
使用此设置可执行以下操作:
  • 接受通过外部应用负载均衡器从互联网发出的请求。 不允许从互联网直接发送到 run.app 网址的请求。
  • 确保来自互联网的请求受外部应用负载均衡器功能(例如 Identity-Aware ProxyGoogle Cloud ArmorCloud CDN)的约束。

注意:如需在 gcloud CLI 中启用此设置,请使用 internal-and-cloud-load-balancing。 如需在 Google Cloud 控制台中启用此设置,请选择内部 > 允许来自外部应用负载均衡器的流量
全部 限制性最低允许所有请求,包括直接从互联网发送到 run.app 网址的请求。

访问内部服务

需额外注意以下事项:

  • 访问内部服务时,请像平常一样使用其网址(即默认 run.app 网址或 Cloud Run 中设置的自定义网域)来调用它们。

  • 对于来自 Compute Engine 虚拟机实例的请求,具有外部 IP 地址或使用 Cloud NAT 的机器无需进一步设置。否则,请参阅接收来自 VPC 网络的请求

  • 从 Cloud Run、App Engine 或 Cloud Run functions 调用设置为“内部”或“内部和 Cloud Load Balancing”的 Cloud Run 服务时,流量必须通过被视为内部资源的 VPC 网络路由。请参阅接收来自其他 Cloud Run 服务、App Engine 和 Cloud Run functions 的请求

  • 来自同一项目中 VPC 网络内资源的请求属于“内部”请求,即使这些资源具有外部 IP 地址也是如此。

  • 来自通过 Cloud VPN 和 Cloud Interconnect 连接到 VPC 网络的本地资源的请求是“内部”请求。

设置入站流量

您可以使用标签页中的任何受支持的方法来设置入站流量:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

    转到 Cloud Run

  2. 如果您要配置新服务,请点击部署容器,然后选择服务以显示创建服务表单。填写初始服务设置页面。

  3. 如果您要配置现有服务,请点击该服务,然后点击网络标签页。

  4. 选择要允许的入站流量

    图片

  5. 点击创建保存

gcloud

  1. 如果要部署新服务,请使用 --ingress 标志部署您的服务:

    gcloud run deploy SERVICE --image IMAGE_URL --ingress INGRESS

    您需要进行如下替换

    • INGRESS 替换为可用入站流量设置之一:
      • all
      • internal
      • internal-and-cloud-load-balancing
    • SERVICE 替换为您的服务名称
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  2. 如果要更改现有服务入站流量,请执行以下操作:

    gcloud run services update SERVICE --ingress INGRESS

    您需要进行如下替换

    • INGRESS 替换为可用入站流量设置之一:
      • all
      • internal
      • internal-and-cloud-load-balancing
    • SERVICE 替换为您的服务名称

YAML

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 run.googleapis.com/ingress: 注释:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      annotations:
        run.googleapis.com/ingress: INGRESS
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION

    您需要进行如下替换

    • SERVICE 替换为您的 Cloud Run 的名称
    • INGRESS 替换为可用入站流量设置之一:
      • all
      • internal
      • internal-and-cloud-load-balancing
    • REVISION 替换为新的修订版本名称或者将其删除(如果存在)。如果您提供新的修订版本名称,则该名称必须满足以下条件:
      • 开头为 SERVICE-
      • 仅包含小写字母、数字和 -
      • 不以 - 结尾
      • 不超过 63 个字符
  3. 使用以下命令将服务的配置替换为新配置:

    gcloud run services replace service.yaml

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

请将以下内容添加到 main.tf 文件:

resource "google_cloud_run_v2_service" "default" {
  provider = google-beta
  name     = "ingress-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  # For valid annotation values and descriptions, see
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#ingress
  ingress = "INGRESS_TRAFFIC_INTERNAL_ONLY"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello" #public image for your service
    }
  }
}

停用默认网址

停用 Cloud Run 服务的默认 run.app 网址,以便仅允许来自服务的其他入站流量路径(Cloud Load Balancing 和任何已配置的网域映射)的流量。

如需停用默认网址,请执行以下步骤:

命令行

  • 如需停用服务的 run.app 网址,请运行带有 --no-default-url 标志的 gcloud beta run deploygcloud beta run services update 命令:

    gcloud beta run deploy SERVICE_NAME --no-default-url

    其中,SERVICE_NAME 是您的 Cloud Run 服务的名称。

在输出中,网址显示为 None

如需恢复默认网址,请使用 --default-url 标志。

YAML

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 如需停用 run.app 网址,请使用 run.googleapis.com/default-url-disabled 注解:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      annotations:
        run.googleapis.com/default-url-disabled: true
        run.googleapis.com/launch-stage: BETA
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION

    您需要进行如下替换

    • SERVICE 替换为您的 Cloud Run 服务的名称。
    • REVISION 替换为新的修订版本名称或者将其删除(如果存在)。如果您提供新的修订版本名称,则该名称必须满足以下条件:
      • 开头为 SERVICE-
      • 仅包含小写字母、数字和 -
      • 不以 - 结尾
      • 不超过 63 个字符
  3. 使用以下命令创建或更新服务:

    gcloud run services replace service.yaml

如需恢复默认网址,请移除 run.googleapis.com/default-url-disabled 注解。

以下 Google Cloud 服务使用默认 run.app 网址调用 Cloud Run。停用默认 run.app 网址会阻止这些服务按预期运行:

后续步骤