配置网络设置

通过 Cloud Functions 网络设置,您可以控制各个函数之间的网络入站流量和出站流量。例如,您可以在以下使用场景中使用网络设置:

  • 通过实现基于网络的访问权限控制来保护函数。
  • 使函数的出站流量遵循与您的 VPC 网络关联的防火墙、DNS 和路由规则。
  • 将函数的出站流量与静态 IP 地址关联。

如需详细了解使用场景,请参阅使用场景示例部分。

入站流量设置

入站流量设置控制 Google Cloud 项目或 VPC Service Controls 服务边界之外的资源是否可以调用函数。

要受 VPC Service Controls 边界政策约束,资源必须属于要受限制的服务。对于 Cloud Run 函数,受限服务是 Cloud Run Admin API。

配置入站流量设置

如需限制项目或边界之外的资源,请指定以下入站流量设置值之一:

  • 允许所有流量:默认设置。允许同一项目中通过互联网和资源向函数发送的所有入站请求。
  • 仅允许内部流量:仅允许来自同一项目或 VPC Service Controls 边界内的 Cloud Scheduler、Cloud Tasks、Eventarc、合成监控工具(包括拨测)、Workflows、BigQuery 和 VPC 网络的流量。所有其他请求会被拒绝并显示 404 错误。

    对于来自共享 VPC 的请求,请注意以下注意事项:

    • 如果函数部署在共享 VPC 宿主项目中,则流量会被视为内部流量。
    • 如果共享 VPC 宿主项目和所有服务项目位于同一 VPC Service Controls 边界内,则流量会被视为内部流量。
    • 如果函数连接到同一共享 VPC 网络,则到该函数的流量会被视为内部流量。
    • 来自共享 VPC 网络的所有其他流量都会被拒绝。
  • 允许内部流量以及来自 Cloud Load Balancing 的流量:允许来自同一项目或 VPC Service Controls 边界内的 Cloud Scheduler、Cloud Tasks、Eventarc、合成监控工具(包括拨测)、Workflows、BigQuery 和 VPC 网络的流量。允许来自 Cloud Load Balancing 的流量。

您可以在部署或更新函数时使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 指定入站流量设置:

控制台

  1. 在 Google Cloud 控制台中打开 Functions 概览页面:

    前往 Cloud Run functions 概览页面

  2. 点击创建函数。或者,点击现有函数以转至其详情页面,然后点击修改

  3. 点击运行时、构建...展开高级设置。

  4. 连接部分中,为入站流量设置选择一个值。

gcloud

使用 gcloud functions deploy 命令部署或更新函数,并指定 --ingress-settings 标志:

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

其中:

  • FUNCTION_NAME 是函数的名称。
  • INGRESS_SETTINGS入站流量设置支持的值之一。可能的值包括:

    • all
    • internal-only
    • internal-and-gclb:允许内部流量以及发往 Cloud Load Balancing 公开的公共 IP 的流量。阻止发送到 cloudfunctions.net 或通过 Cloud Functions 设置的任何自定义网域的流量。防止用户规避通过 Cloud Load Balancing 设置的任何访问权限控制机制(Cloud Armor、IAP)。
  • FLAGS... 是指您传递给 deploy 命令的其他标志。

Terraform

可选。如需更新 Terraform 资源main.tf 文件的入站流量设置字段,请包括要部署或更新的 ingress_settings 参数。更改入站流量设置会重新创建函数。

  1. main.tf 文件中,找到您要限制其入站流量设置的资源,并将其更新为所需的设置,例如:

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }

    其中 INGRESS_SETTINGS入站流量设置支持的值之一。可能的值包括:

    • ALLOW_ALL(默认值):允许同一项目中通过互联网和资源向函数发送的所有入站请求。
    • ALLOW_INTERNAL_ONLY:仅允许来自同一项目或 VPC Service Controls 边界中的 Cloud Scheduler、Cloud Tasks、Eventarc、Workflows 和 VPC 网络的流量。
    • ALLOW_INTERNAL_AND_GCLB:允许内部流量以及发往 Cloud Load Balancing 公开的公共 IP 的流量。阻止发送到 cloudfunctions.net 或通过 Cloud Functions 设置的任何自定义网域的流量。防止用户规避通过 Cloud Load Balancing 设置的任何访问权限控制机制(Cloud Armor、IAP)。

如果您将 Google Cloud Armor 与 Cloud Load Balancing 搭配使用,则可以创建安全政策,用于过滤基于流量的条件(例如传入请求的 IP 地址、IP 地址范围、区域代码或请求标头)。如需了解详情,请参阅 Google Cloud Armor 安全政策概览

出站流量设置

出站流量设置控制来自函数的出站 HTTP 请求的路由。如需指定出站流量设置,您必须使用无服务器 VPC 访问通道连接器将函数连接到 VPC 网络。出站流量设置控制流量何时通过 VPC 网络中的连接器进行路由。

限制

  • 无服务器 VPC 访问通道仅支持路由 IPv4 流量。它不支持 IPv6 流量,即使 VPC 网络中存在 IPv6 路由也是如此。

  • 为了提高安全性,Google Cloud 会阻止发送到 TCP 目标端口 25 上的外部 IP 地址的出站流量数据包。

  • 调用受 VPC 网络保护的函数或服务的用户函数或服务必须通过 VPC 连接器路由这些调用。

配置出站流量设置

对于出站流量设置,您可以指定以下各项:

  • 仅路由通过 VPC 连接器向专用 IP 发送的请求:默认设置。 仅当承载流量的数据包具有以下目标时,流量才会通过 VPC 网络路由:

    具有其他目标的数据包会从 Cloud Functions 路由到互联网,不通过任何 VPC 网络。

  • 通过 VPC 连接器路由所有流量:对于所有数据包目的地,流量始终通过与连接器关联的 VPC 网络进行路由。在以下情况下,您必须使用此选项:

    • 您需要将流量发送到具有以非公开方式使用的外部 IP 地址范围的 VPC 子网范围。如需详细了解 VPC 子网范围,请参阅“子网概览”中的有效 IPv4 范围
    • 您需要将流量发送到 Google API 的 Private Service Connect 端点,其地址是以非公开方式使用的外部 IP 地址。如需详细了解 Google API 的 Private Service Connect 端点,请参阅通过端点访问 Google API
    • 您需要将流量发送到任何其他可在连接器的 VPC 网络中路由的以非公开方式使用的外部 IP 地址。涵盖以非公开方式使用的外部 IP 地址的其他目的地示例可能包括对等互连子网范围、通过为服务分配的 IP 地址范围创建的对等互连子网范围,以及可使用 VPC 网络中的自定义路由访问的目的地。

    如果 VPC 网络包括默认路由,并且您配置了 Cloud NAT 网关以向连接器使用的子网提供 NAT 服务,则数据包在被连接器处理后仍可以路由到互联网。这些数据包受 VPC 网络中的路由以及应用于 VPC 网络的防火墙规则的约束。您可以使用路由和防火墙配置来控制您的函数通过无服务器 VPC 访问通道连接器发送的所有出站请求的互联网出站流量。

您可以在部署或更新函数时使用 Google Cloud 控制台或 Google Cloud CLI 指定出站流量设置:

控制台

  1. 在 Google Cloud 控制台中打开 Functions 概览页面:

    前往 Cloud Run functions 概览页面

  2. 点击创建函数。或者,点击现有函数以转至其详情页面,然后点击修改

  3. 点击运行时、构建...展开高级设置。

  4. 连接部分的出站流量设置下,选择无服务器 VPC 访问通道连接器。

  5. 根据您希望通过连接器路由出站流量的方式,选择适当的出站流量设置。

gcloud

使用 gcloud functions deploy 命令部署或更新函数,并指定 --egress-settings 标志:

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

其中:

  • FUNCTION_NAME 是函数的名称。
  • CONNECTOR_NAME 是要使用的无服务器 VPC 访问通道连接器的名称。如需了解详情,请参阅 gcloud 文档

  • EGRESS_SETTINGS 为出站流量设置支持的值之一:请参阅 gcloud 文档。

  • FLAGS... 是指您传递给 deploy 命令的其他标志。

实际使用示例

以下示例演示了如何在几种常见场景中配置网络访问权限。

创建无法由外部客户端调用的函数

您可以保护 HTTP 函数,方法是仅允许处于同一 Google Cloud 项目或 VPC Service Controls 服务边界内的资源调用这些函数。

  1. 部署您的函数,仅允许内部流量。使用 Google Cloud 控制台或 Google Cloud CLI:

    控制台

    1. 在 Google Cloud 控制台中打开 Functions 概览页面:

      前往 Cloud Run functions 概览页面

    2. 点击创建函数。或者,点击现有函数以转至其详情页面,然后点击修改

    3. 点击运行时、构建...展开高级设置。

    4. 连接部分的入站流量设置下,选择仅允许内部流量

    gcloud

    使用 gcloud functions deploy 命令:

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

部署函数后,来自您的 Google Cloud 项目之外的请求将无法访问函数。如果您使用的是 VPC Service Controls,系统会阻止来自服务边界外的请求。您的项目或服务边界内的虚拟机实例仍可通过向函数的 HTTPS 端点发送请求来访问函数。

如果您希望从其他函数调用此受限函数,则调用函数必须通过您的 VPC 网络路由其出站流量

使用出站流量和入站流量设置来限制访问权限

您可以将入站流量和出站流量整合到服务中,以额外增加一层限制。

  1. 克隆 cloud-run-sample 代码库并切换到 vpc-sample 目录:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample

  2. 安装 Python 依赖项:

    pip3 install -r requirements.txt

  3. 您可以打开 vpc-sample 目录中的 main.py 文件,以查看要部署的函数:

    def hello_world(request):
        return "Hello World!"

  4. 部署函数:

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. 设置无服务器 VPC 访问通道连接器:

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    其中,SERVICE_REGION 是连接器的区域。此区域必须与您的无服务器服务的区域相匹配。如果您的服务位于 us-centraleurope-west 区域,请使用 us-central1europe-west1

  6. 构建容器映像:

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .

    其中,PROJECT_ID 是项目 ID。

    这将构建一个容器映像,该映像会在从 main.py 文件部署时调用 get_hello_world

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. 使用 gcloud run deploy run-function 命令部署 Cloud Run 容器:

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    其中:

    • PROJECT_ID 是项目 ID。
    • SERVICE_REGION 是连接器的区域;此区域必须与您的无服务器服务的区域相匹配。如果您的服务位于 us-centraleurope-west 区域,请使用 us-central1europe-west1

    Cloud Run run-function 服务现已设置为通过 VPC 连接器向网络受限函数发送 GET 请求。

通过您的 VPC 网络路由函数出站流量

Google Cloud 中的 VPC 网络支持丰富的配置和网络功能。您可以将来自函数的出站流量路由到 VPC 网络,从而确保 Cloud Functions 函数出站流量遵循 VPC 网络的防火墙、DNS、路由和其他规则,并且您可以使用 Cloud NAT 等产品。

  1. 设置 VPC 网络。请按照使用 VPC 网络中的指南,配置现有 VPC 网络或创建新网络。

  2. 设置无服务器 VPC 访问通道连接器。 Cloud Functions 函数需要使用无服务器 VPC 访问通道连接器才能将流量路由到您的 VPC 网络。请按照连接到 VPC 网络中的说明,创建连接器并设置适当的权限。

  3. 部署使用连接器的函数并通过该连接器路由所有出站流量。使用 Google Cloud 控制台或 gcloud 命令行工具:

    控制台

    1. 在 Google Cloud 控制台中打开 Functions 概览页面:

      前往 Cloud Run functions 概览页面

    2. 点击创建函数。或者,点击现有函数以转至其详情页面,然后点击修改

    3. 点击运行时、构建...展开高级设置。

    4. 连接部分的出站流量设置下,选择您的无服务器 VPC 访问通道连接器,然后选择通过 VPC 连接器路由所有流量

    gcloud

    使用 gcloud functions deploy 命令:

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

部署函数后,源自您的函数的所有流量都会通过您的 VPC 网络路由,并且会遵循 VPC 网络中设置的规则。请注意,除非您配置 Cloud NAT,否则您的函数将无法访问公共互联网。另请注意,您需要使用 Cloud NAT 将所有子网的所有主要和次要 IP 范围映射到 NAT 网关,才能将该连接器的子网添加到映射中。

将函数出站流量与静态 IP 地址相关联

在某些情况下,您可能需要将源自您的函数的流量与静态 IP 地址相关联。例如,如果您调用的外部服务仅允许来自显式指定的 IP 地址的请求,这将非常有用。

  1. 通过您的 VPC 网络路由函数的出站流量。 请参阅上一节:通过 VPC 网络路由函数出站流量

  2. 设置 Cloud NAT 并指定静态 IP 地址。 按照指定 NAT 子网范围指定 NAT 的 IP 地址中的指南,为与您的函数的无服务器 VPC 访问通道连接器关联的子网设置 Cloud NAT。 Cloud NAT 必须将所有子网的所有主要和次要 IP 范围映射到 NAT 网关,才能在映射中包含连接器的子网。

多区域负载均衡

您可以将某个函数部署到不同的区域,并允许将请求发送到运行状况良好的最近区域。为此,您需要为函数设置无服务器网络端点组 (NEG),并将其连接到负载均衡器(如使用无服务器 NEG 设置 HTTP(S) 负载均衡器中所述)。