配置无服务器 VPC 访问通道

借助无服务器 VPC 访问通道,您可以从 Google Cloud(Cloud Run(全代管式)、Cloud Functions 或 App Engine 标准环境)上的无服务器环境直接连接到 VPC 网络。此连接使您的无服务器环境能够访问 Compute Engine 虚拟机实例、Memorystore 实例以及具有内部 IP 地址的其他任何资源。例如,在以下情况下,这可能非常有用:

  • 您使用 Memorystore 存储无服务器服务的数据。
  • 您的无服务器工作负载使用您在 Compute Engine 虚拟机上运行的第三方软件。
  • 您在 Compute Engine 中的托管实例组中运行后端服务,并需要您的无服务器环境在不向公共互联网公开的情况下与此后端通信。
  • 您的无服务器环境需通过 Cloud VPN 访问本地数据库中的数据。

借助与 VPC 网络的连接,您的无服务器环境可以向 RFC 1918RFC 6598 定义的内部 DNS 名称和内部 IP 地址发送请求。这些内部地址只能通过 Google Cloud 服务访问。使用内部地址可避免向公共互联网公开资源,并可缩短服务之间的通信延迟时间。

无服务器 VPC 访问通道仅允许通过无服务器环境发起请求。由虚拟机发起的请求必须使用无服务器服务的外部地址;如需了解详情,请参阅专用 Google 访问通道

无服务器 VPC 访问通道支持共享 VPC,且支持与通过 Cloud InterconnectCloud VPNVPC 网络对等互连连接的网络进行通信。无服务器 VPC 访问通道不支持旧式网络

无服务器 VPC 访问通道连接器简介

无服务器 VPC 访问通道基于名为连接器的资源。连接器会处理无服务器环境与 VPC 网络之间的流量。在 Google Cloud 项目中创建连接器后,将其连接到特定的 VPC 网络和地区。然后,您可以配置无服务器服务,将此连接器用于出站网络流量。

创建连接器时,您可以使用自己的 CIDR /28 子网或使用自定义 IP 范围。通过连接器发送到您的 VPC 网络的流量将来自您的 /28 子网或自定义 IP 范围内的地址。如果使用自定义 IP 范围,则此 IP 范围必须是您的 VPC 网络中尚未预留的 CIDR /28 范围。

如果子网不是共享子网,则在 VPC 网络上创建了优先级为 1000 的隐式防火墙规则,以允许流量从连接器的 IP 范围进入网络中的所有目的地。

无服务器 VPC 访问通道会自动为连接器预配吞吐量(增量为 100 Mbps),具体取决于通过连接器发送的流量。自动预配的吞吐量只能增加,不能减少。一个连接器始终至少预配了 200 Mbps,而且可以扩容到 1000 Mbps。创建连接器时,可以配置吞吐量扩缩限制;请注意,通过连接器的实际吞吐量可能会超过预配的吞吐量,尤其是对于短期流量激增。

无服务器 VPC 访问通道连接器根据使用情况按月收费。如需了解详情,请参阅价格

无服务器 VPC 访问通道示例(点击可放大)
无服务器 VPC 访问通道示例(点击放大)

请注意以下事项:

  • 连接器必须与连接到它的无服务器服务(例如 Cloud Run 服务、App Engine 应用或 Cloud Functions)位于同一项目中。
  • 连接器必须与所连接的无服务器服务位于同一区域中。如需查看您可以在其中创建连接器的区域列表,请参阅支持的区域
  • 发送到内部 IP 地址和内部 DNS 名称的流量会通过连接器进行路由。默认情况下,发送到外部 IP 地址的流量通过互联网路由。
  • 如果您使用共享 VPC:

  • 您可以将同一连接器用于多个无服务器服务。

  • 对于允许跨区域访问的资源(例如 Google Cloud 虚拟机实例或 GKE 集群),连接器可以与接收其流量的资源位于不同的区域。您需要为连接器的出站流量付费,具体请参阅价格

创建连接器

如需创建连接器,请使用 Cloud Console 或 gcloud 命令行工具:

控制台

  1. 如果您使用的是共享 VPC,请确保您已配置宿主项目

  2. 确保已为您的项目启用 Serverless VPC Access API:

    启用 API

  3. 转到 Serverless VPC Access 概览页面。

    转到无服务器 VPC 访问通道

  4. 点击创建连接器

  5. 名称字段中,为连接器输入名称。

  6. 地区字段中,选择连接器的地区。此地区必须与您的无服务器服务的地区相匹配。请参阅支持的地区

  7. 网络字段中,选择要将连接器连接到的 VPC 网络。

  8. 点击子网下拉菜单:

    • 如果您使用的是自己的子网(共享 VPC 要求),请选择要用于连接器的 /28 子网。
    • 如果您不使用共享 VPC,并且希望让连接器创建子网而非显式创建子网,请从下拉菜单中选择自定义 IP 范围,然后在 “IP 范围”字段中,输入未预留 CIDR /28 内部 IP 范围中的第一个地址。此 IP 范围不得与 VPC 网络中预留的任何现有 IP 地址重叠。例如,10.8.0.0 (/28) 将适用于大多数新项目。

  9. (可选)如需进一步控制连接器的吞吐量,请修改最小吞吐量最大吞吐量字段。

  10. 点击创建

  11. 准备就绪后,连接器名称旁边会出现绿色的对勾标记。

gcloud

  1. 如果您使用的是共享 VPC,请确保您已配置宿主项目

  2. gcloud 组件更新到最新版本:

    gcloud components update
    
  3. 确保已为您的项目启用 Serverless VPC Access API:

    gcloud services enable vpcaccess.googleapis.com
    
  4. 如果您使用的是自己的子网(共享 VPC 要求),请使用以下命令创建连接器:

    gcloud beta compute networks vpc-access connectors create [CONNECTOR_NAME] \
    --region [REGION] \
    --subnet [SUBNET] \
    # If you are not using Shared VPC, omit the following line.
    --subnet-project [HOST-PROJECT-ID]
    

    其中:

    • [CONNECTOR_NAME] 是连接器的名称。
    • [REGION] 是连接器的地区。此地区必须与您的无服务器服务的地区相匹配。请参阅支持的地区
    • [SUBNET] 是您自己的“/28”专用子网,该子网未被任何其他资源使用。要提供的值是子网的名称。
    • [HOST-PROJECT-ID] 是宿主项目的 ID。 仅当使用共享 VPC 时才提供此值。

    如需了解详情和可选的参数(例如吞吐量控制),请参阅 gcloud 参考文档

  5. 如果您不使用共享 VPC,并且希望提供自定义 IP 范围而不是使用子网,请使用以下命令创建连接器:

    gcloud compute networks vpc-access connectors create [CONNECTOR_NAME] \
    --network [VPC_NETWORK] \
    --region [REGION] \
    --range [IP_RANGE]
    

    其中:

    • [CONNECTOR_NAME] 是连接器的名称。
    • [VPC_NETWORK] 是要将连接器附加到的 VPC 网络。
    • [REGION] 是连接器的地区。此地区必须与您的无服务器服务的地区相匹配。请参阅支持的地区
    • [IP_RANGE] 是未预留的内部 IP 网络,必须提供“/28”的未分配空间。提供的值是采用 CIDR 表示法的网络 (10.8.0.0/28)。此 IP 地址范围不得与 VPC 网络中预留的任何现有 IP 地址重叠。例如,10.8.0.0/28 适用于大多数新项目。

    如需了解详情和可选的参数(例如吞吐量控制),请参阅 gcloud 参考文档

  6. 在使用之前,验证连接器处于 READY 状态:

    gcloud compute networks vpc-access connectors describe [CONNECTOR_NAME] --region [REGION]
    

    输出应包含 state: READY 行。

配置宿主项目(如果使用共享 VPC)

如果要为共享 VPC 创建连接器,则必须按如下方式配置宿主项目:

  • 添加防火墙规则以允许所需的 IP 地址范围访问连接器。
  • 为每个服务项目授予宿主项目中的 Compute Network User 角色。
  • 在宿主项目中创建子网,以在创建共享 VPC 连接器时使用。

添加防火墙规则以允许 IP 范围

这些步骤必须由具有宿主项目的 Network Administrator 角色的用户(Shared VPC Administrator)执行。

您必须创建防火墙规则,以允许来自以下 IP 范围的请求访问连接器以及被连接器访问:

  • NAT 范围
    • 107.178.230.64/26
    • 35.199.224.0/19
  • 运行状况检查范围
    • 130.211.0.0/22
    • 35.191.0.0/16
    • 108.170.220.0/23

这些范围由 Cloud Run、Cloud Functions 和 App Engine 标准环境的底层 Google 基础架构使用。来自这些 IP 的所有请求都源自 Google 基础架构,这可确保每个 Cloud Run、Cloud Functions 和 App Engine 服务/函数/应用都只与其所连接的 VPC 连接器进行通信。

对于简单配置,请应用规则,以允许连接到共享 VPC 网络的任何服务项目中的无服务器服务将请求发送到网络中的任何资源。

如需应用这些规则:

  1. 运行以下三个命令以设置规则,允许来自无服务器环境的请求访问网络中的所有 VPC 连接器:

    gcloud compute firewall-rules create serverless-to-vpc-connector \
    --allow tcp:667,udp:665-666,icmp \
    --source-ranges 107.178.230.64/26,35.199.224.0/19 \
    --direction=INGRESS \
    --target-tags vpc-connector \
    --network=VPC-NETWORK
    gcloud compute firewall-rules create vpc-connector-to-serverless \
    --allow tcp:667,udp:665-666,icmp \
    --destination-ranges 107.178.230.64/26,35.199.224.0/19 \
    --direction=EGRESS \
    --target-tags vpc-connector \
    --network=VPC-NETWORK
    gcloud compute firewall-rules create vpc-connector-health-checks \
    --allow tcp:667 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16,108.170.220.0/23 \
    --direction=INGRESS \
    --target-tags vpc-connector \
    --network=VPC-NETWORK

    其中 VPC_NETWORK 是要将连接器附加到的 VPC 网络。

  2. 运行以下命令以允许从任何 VPC 连接器发送请求到网络上的任何其他资源:

    gcloud compute firewall-rules create \
    vpc-connector-egress \
    --allow tcp,udp,icmp \
    --direction=INGRESS \
    --source-tags vpc-connector \
    --network=VPC-NETWORK

    此规则授予 VPC 连接器对网络中每个资源的访问权限。如需仅允许 VPC 连接器访问一组较少资源,请为这些防火墙规则指定目标

创建范围更小的防火墙规则

如果按照添加防火墙规则以允许 IP 范围中的流程操作,则防火墙规则将应用于所有连接器,包括当前的连接器和未来创建的连接器。如果您不希望这样,而是希望仅为特定的连接器创建规则,您可以限制规则的范围,使其仅应用于这些连接器。

要将规则的范围限制为特定连接器,您可以使用以下机制之一。

  • 网络标记。每个连接器都有两个网络标记:vpc-connectorvpc-connector-<region>-<connector-name>。使用后者将防火墙规则的范围限制为某个特定的连接器。
  • IP 范围。仅可对出站规则使用此机制,因为它不适用于入站流量。您可以使用连接器子网的 IP 范围将防火墙规则范围限制为单个 VPC 连接器。

向服务项目中的服务帐号授予权限

对于将使用 VPC 连接器的每个服务项目,Shared VPC Admin 必须向服务项目 cloudservicesvpcaccess 服务帐号授予宿主项目中的 Compute Network User 角色 (compute.networkUser)。

如需授予角色:

  1. 使用以下命令:

    gcloud projects add-iam-policy-binding HOST-PROJECT-ID \
    --role "roles/compute.networkUser" \
    --member "serviceAccount:service-SERVICE-PROJECT-NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com"
    gcloud projects add-iam-policy-binding HOST-PROJECT-ID \
    --role "roles/compute.networkUser" \
    --member "serviceAccount:SERVICE-PROJECT-NUMBER@cloudservices.gserviceaccount.com"
  2. 如果 @gcp-sa-vpcaccess 服务帐号不存在,请在服务项目中启用 Serverless VPC Access API,然后重试:

    gcloud services enable vpcaccess.googleapis.com

如果您不想向这些服务帐号授予整个共享 VPC 网络的访问权限,而希望只授予特定子网的访问权限,则可以改为仅向这些服务帐号授予特定子网的这些角色

创建子网

使用共享 VPC 时,Shared VPC Admin 必须为每个连接器创建一个子网。按照添加子网文档的说明将 /28 子网添加到共享 VPC 网络。此子网必须与将使用连接器的无服务器服务位于同一区域。

删除连接器

在您删除连接器之前,请确保没有服务仍在使用连接器。如需了解如何将连接器与服务断开连接,请参阅相关产品文档

如需删除连接器,请使用 Cloud Console 或 gcloud 命令行工具:

控制台

  1. 转到 Serverless VPC Access 概览页面。

    转到无服务器 VPC 访问通道

  2. 选择要删除的连接器。

  3. 点击删除

gcloud

使用以下 gcloud 命令删除连接器:

gcloud compute networks vpc-access connectors delete [CONNECTOR_NAME] --region [REGION]

其中:

  • [CONNECTOR_NAME] 是您要删除的连接器的名称。
  • [REGION] 是连接器所在的区域。

配置服务以使用连接器

创建连接器后,您可以配置无服务器服务,以使用该连接器。配置服务以使用连接器的方式取决于产品。 如需了解具体说明,请参阅相关指南:

在您的服务连接到 VPC 网络后,您可以通过向内部 IP 地址或 DNS 名称发送请求来访问虚拟机实例和其他内部资源。

添加 VPC Service Controls

创建连接器并配置服务后,您可以将 VPC Service Controls 用于 Serverless VPC Access API 来降低数据渗漏的风险并保护资源和数据。

如需了解有关启用 VPC Service Controls 的一般信息,请参阅创建服务边界

支持的服务

您可以使用无服务器 VPC 访问通道通过以下服务访问 VPC 网络:

支持的地区

您可以在以下区域中创建无服务器 VPC 访问通道连接器:

  • asia-east1
  • asia-east2
  • asia-northeast1
  • asia-northeast2
  • asia-northeast3
  • asia-south1
  • asia-southeast1
  • asia-southeast2
  • australia-southeast1
  • europe-central2
  • europe-north1
  • europe-west1
  • europe-west2
  • europe-west3
  • europe-west4
  • europe-west6
  • northamerica-northeast1
  • southamerica-east1
  • us-central1
  • us-east1
  • us-east4
  • us-west1
  • us-west2
  • us-west3
  • us-west4

支持的网络协议

下表介绍了每个无服务器 VPC 访问通道连接器出站流量设置支持的协议。如需详细了解可用的出站流量设置,请参阅配置网络设置

协议 仅路由通过 VPC 连接器向专用 IP 发送的请求 路由通过 VPC 连接器发送的所有流量
TCP
UDP
ICMP 仅支持外部 IP 地址

精选 IAM 角色

下表描述了与无服务器 VPC 访问通道关联的 Identity and Access Management (IAM) 角色。如需获取与每个角色关联的权限列表,请参阅 IAM 文档中的无服务器 VPC 访问通道角色

角色 说明
Serverless VPC Access Admin
roles/vpcaccess.admin
拥有对所有无服务器 VPC 访问通道资源的完整访问权限
Serverless VPC Access User
roles/vpcaccess.user
无服务器 VPC 访问通道连接器的用户
Serverless VPC Access Viewer
roles/vpcaccess.viewer
可查看所有无服务器 VPC 访问通道资源

服务帐号

为了在您的 Cloud 项目中执行操作,无服务器 VPC 访问通道服务使用 Serverless VPC Access Service Agent 服务帐号。此服务帐号的电子邮件地址采用以下格式:

service-PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com

默认情况下,此服务帐号具有 Serverless VPC Access Service Agent 角色 (roles/vpcaccess.serviceAgent)。如果您更改此帐号的权限,则无服务器 VPC 访问通道操作可能会失败。

审核日志记录

请参阅无服务器 VPC 访问通道审核日志记录信息

价格

对于无服务器 VPC 访问通道价格,请参阅 VPC 价格页面上的无服务器 VPC 访问通道

问题排查

如果创建连接器发生错误,请尝试以下操作并重新创建连接器:

  • 指定与 VPC 网络中预留的任何现有 IP 地址均不重叠的 RFC 1918 内部 IP 地址范围。
  • 向您的项目授予权限,让它能使用 ID 为 serverless-vpc-access-images 的项目中的 Compute Engine 虚拟机映像。如需了解如何相应地更新组织政策,请参阅设置映像访问权限限制
  • 设置 constraints/compute.vmCanIpForward 组织政策以允许虚拟机启用 IP 转发。

如果您为无服务器服务指定了连接器,但仍无法访问 VPC 网络中的资源:

  • 确保您的 VPC 网络上没有优先级低于 1000 的防火墙规则会拒绝来自连接器 IP 范围的入站流量。