本页面介绍了如何使用无服务器 VPC 访问通道将 App Engine 标准环境应用直接连接到 VPC 网络,从而允许访问 Compute Engine 虚拟机实例、Memorystore 实例以及任何使用内部 IP 地址的其他资源。
准备工作
如果您的项目中还没有 VPC 网络,请创建一个 VPC 网络。
如果您使用共享 VPC,请参阅连接到共享 VPC 网络。
创建 Serverless VPC Access 连接器
如需在不使用公共互联网的情况下向您的 VPC 网络发送请求并接收相应的响应,您必须使用无服务器 VPC 访问通道连接器。
您可以使用 Google Cloud Console、Google Cloud CLI 或 Terraform 创建连接器:
控制台
确保已为您的项目启用无服务器 VPC 访问通道 API:
打开无服务器 VPC 访问通道概览页面。
点击创建连接器。
在名称字段中,为连接器输入名称。该名称必须符合 Compute Engine 命名惯例,但还需注意,长度不得超过 21 个字符,且连字符 (-) 计为 2 个字符。
在区域字段中,选择连接器的区域。此区域必须与您的无服务器服务的区域相匹配。
如果您的服务位于
us-central
或europe-west
区域,请使用us-central1
或europe-west1
。在网络字段中,选择要将连接器连接到的 VPC 网络。
点击子网下拉菜单:
如果您使用的是共享 VPC(需要使用您自己的子网),请选择未使用的
/28
子网。- 子网必须专供连接器使用。其他资源(例如虚拟机、Private Service Connect 或内部 HTTP(S) 负载均衡)不能使用这些子网。
- 如需确认您的子网未用于 Private Service Connect 或内部 HTTP(S) 负载均衡,请通过在 gcloud CLI 中运行以下命令来检查子网
purpose
是否为PRIVATE
:gcloud compute networks subnets describe SUBNET_NAME
替换:- SUBNET_NAME:您的子网的名称
如果您不使用共享 VPC,并且希望让连接器创建子网而非显式创建子网,请从下拉菜单中选择自定义 IP 范围,然后在 “IP 范围”字段中,输入未预留 CIDR
/28
内部 IP 范围中的第一个地址。此 IP 地址范围不得与 VPC 网络中预留的任何现有 IP 地址重叠。例如,10.8.0.0
(/28
) 将适用于大多数新项目。
(可选)如需设置扩缩选项以更好地控制连接器,请点击显示扩缩设置以显示扩缩表单。
- 设置连接器的实例数下限和上限,或使用默认值 2(下限)和 10(上限)。如果流量需要,连接器会扩容到指定的上限,但流量下降时,连接器实例数量不会缩减回来。
您必须使用介于
2
和10
之间的值。 - 在实例类型下拉菜单中,选择要用于连接器的机器类型,或者使用默认的
e2-micro
。当您选择实例类型时,请注意右侧的费用边栏,其中显示带宽和费用估算值。
- 设置连接器的实例数下限和上限,或使用默认值 2(下限)和 10(上限)。如果流量需要,连接器会扩容到指定的上限,但流量下降时,连接器实例数量不会缩减回来。
您必须使用介于
点击创建。
准备就绪后,连接器名称旁边会出现绿色的对勾标记。
gcloud
将
gcloud
组件更新到最新版本:gcloud components update
确保已为您的项目启用 Serverless VPC Access API:
gcloud services enable vpcaccess.googleapis.com
如果您使用的是共享 VPC(需要使用您自己的子网),请使用以下命令创建连接器:
gcloud 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 \ # Optional: specify minimum and maximum instance values between 2 and 10, default is 2 min, 10 max. --min-instances MIN \ --max-instances MAX \ # Optional: specify machine type, default is e2-micro --machine-type MACHINE_TYPE
替换以下内容:
CONNECTOR_NAME
:连接器的名称。该名称必须符合 Compute Engine 命名惯例,但还需注意,长度不得超过 21 个字符,且连字符 (-) 计为 2 个字符。REGION
:连接器的区域;此区域必须与无服务器服务的区域相匹配。如果您的服务位于us-central
或europe-west
区域,请使用us-central1
或europe-west1
。SUBNET
:未使用的/28
子网的名称。- 子网必须专供连接器使用。其他资源(例如虚拟机、Private Service Connect 或内部 HTTP(S) 负载均衡)不能使用这些子网。
- 如需确认您的子网未用于 Private Service Connect 或内部 HTTP(S) 负载均衡,请通过在 gcloud CLI 中运行以下命令来检查子网
purpose
是否为PRIVATE
:gcloud compute networks subnets describe SUBNET_NAME
替换:- SUBNET_NAME:您的子网的名称
HOST_PROJECT_ID
:宿主项目的 ID;仅在您使用共享 VPC 时提供MIN
:用于连接器的实例数下限。请使用介于2
到9
之间的整数。默认值为2
。如需了解连接器扩缩,请参阅吞吐量和扩缩。MAX
:用于连接器的实例数上限。请使用介于3
到10
之间的整数。默认值为10
。如果流量需要,连接器会扩容到[MAX]
个实例,但不会缩减。如需了解连接器扩缩,请参阅吞吐量和扩缩。MACHINE_TYPE
:f1-micro
、e2-micro
或e2-standard-4
。如需了解连接器吞吐量,包括机器类型和扩缩,请参阅吞吐量和扩缩。
如需了解详情和可选的参数,请参阅
gcloud
参考文档。如果您不使用共享 VPC,并且希望提供自定义 IP 范围而不是使用子网,请使用以下命令创建连接器:
gcloud compute networks vpc-access connectors create CONNECTOR_NAME \ --network VPC_NETWORK \ --region REGION \ --range IP_RANGE
替换以下内容:
CONNECTOR_NAME
:连接器的名称。该名称必须符合 Compute Engine 命名惯例,但还需注意,长度不得超过 21 个字符,且连字符 (-
) 计为 2 个字符。VPC_NETWORK
:要将连接器附加到的 VPC 网络。REGION
:连接器的区域。此区域必须与您的无服务器服务的区域相匹配。如果您的服务位于us-central
或europe-west
区域,请使用us-central1
或europe-west1
。IP_RANGE
:未预留的内部 IP 网络,必须提供/28
的未分配空间。提供的值是采用 CIDR 表示法的网络 (10.8.0.0/28
)。此 IP 范围不得与 VPC 网络中预留的任何现有 IP 地址重叠。例如,10.8.0.0/28
适用于大多数新项目。
如需了解详情和可选的参数(例如吞吐量控制),请参阅
gcloud
参考文档。在使用之前,验证连接器处于
READY
状态:gcloud compute networks vpc-access connectors describe CONNECTOR_NAME \ --region REGION
替换以下内容:
CONNECTOR_NAME
:连接器的名称;这是您在上一步中指定的名称。REGION
:连接器的区域;这是您在上一步中指定的区域。
输出应包含
state: READY
行。
Terraform
您可以使用 Terraform 资源启用 vpcaccess.googleapis.com
API。
您可以使用 Terraform 模块创建 VPC 网络和子网,然后创建连接器。
配置服务以使用连接器
创建无服务器 VPC 访问通道连接器后,您必须在 App Engine 应用中配置要连接到 VPC 网络的每项服务。
如需为应用中的服务指定连接器,请执行以下操作:
将
vpc_access_connector
字段添加到服务的app.yaml
文件中:vpc_access_connector: name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
其中,
PROJECT_ID
是您的 Cloud 项目 ID,REGION
是连接器所在的区域,CONNECTOR_NAME
是连接器的名称。部署该服务:
gcloud app deploy
部署服务后,服务将可以向内部 IP 地址发送请求,从而访问 VPC 网络中的资源。
限制对 VPC 资源的访问权限
您可以使用防火墙规则限制连接器对 VPC 网络的访问权限。
在服务项目中连接到具有连接器的共享 VPC 网络时,系统不会自动创建防火墙规则。具有宿主项目的 Network Administrator 角色的用户在配置宿主项目时会设置防火墙规则。
在宿主项目中连接到具有连接器的独立 VPC 网络或共享 VPC 网络时,系统会自动在 VPC 网络上创建优先级为 1000 的隐式防火墙规则,以允许来自连接器子网或自定义 IP 范围的入站流量进入 VPC 网络中的所有目的地。隐式防火墙规则不会显示在 Google Cloud Console 中,而且仅在关联的连接器存在时存在。如果您不想让连接器能够访问 VPC 网络中的所有目的地,则可以限制其访问权限。
您可以通过在目标资源上创建入站规则或在 VPC 连接器上创建出站规则来限制连接器的访问权限。
使用入站规则限制访问权限
选择网络标记或 CIDR 范围来控制传入您的 VPC 网络的流量。
网络标记
以下步骤介绍了如何创建入站规则,以根据连接器网络标记限制对 VPC 网络的访问权限。
确保您拥有插入防火墙规则所需的权限。您必须拥有以下 Identity and Access Management (IAM) 角色之一:
- 计算安全管理员角色
- 启用了
compute.firewalls.create
权限的自定义 IAM 角色
拒绝您的 VPC 网络中的连接器流量。
在您的 VPC 网络上创建优先级低于 1000 的入站防火墙规则,以拒绝来自连接器网络标记的入站流量。这会替换无服务器 VPC 访问通道默认情况下在您的 VPC 网络中创建的隐式防火墙规则。
gcloud compute firewall-rules create RULE_NAME \ --action=DENY \ --rules=PROTOCOL \ --source-tags=VPC_CONNECTOR_NETWORK_TAG \ --direction=INGRESS \ --network=VPC_NETWORK \ --priority=PRIORITY
替换以下内容:
- RULE_NAME:新防火墙规则的名称。例如
deny-vpc-connector
。 - PROTOCOL:您希望 VPC 连接器允许的一个或多个协议。您必须指定
ah
、all
、esp
、icmp
、ipip
、sctp
、tcp
和udp
中的一项或多项,您还可视需要指定介于 0 到 255 之间的 IP 协议端口号。例如,tcp:80,icmp
会允许通过端口 80 的 TCP 流量,以及 ICMP 流量。如需了解详情,请参阅allow
标志的文档。 VPC_CONNECTOR_NETWORK_TAG:通用连接器网络标记(如果要限制对所有连接器的访问,包括将来创建的任何连接器)或唯一网络标记(如果要限制对特定连接器的访问)。
- 通用网络标记:
vpc-connector
唯一网络标记:
vpc-connector-REGION-CONNECTOR_NAME
您需要进行如下替换:
- REGION:您要限制的连接器所在的区域
- CONNECTOR_NAME:您要限制的连接器的名称
如需详细了解连接器网络标记,请参阅网络标记。
- 通用网络标记:
VPC_NETWORK:您的 VPC 网络的名称
PRIORITY:介于 1-999 之间的整数(含边界值)。例如:990。
- RULE_NAME:新防火墙规则的名称。例如
允许应接收连接器流量的资源接收连接器流量。
使用
allow
和target-tags
标志创建一条入站防火墙规则,用于定位您的 VPC 网络中您希望 VPC 连接器访问的资源。将此规则的优先级设置为低于您在上一步中创建的规则的优先级值。gcloud compute firewall-rules create RULE_NAME \ --allow=PROTOCOL \ --source-tags=VPC_CONNECTOR_NETWORK_TAG \ --direction=INGRESS \ --network=VPC_NETWORK \ --target-tags=RESOURCE_TAG \ --priority=PRIORITY
替换以下内容:
- RULE_NAME:新防火墙规则的名称。例如
allow-vpc-connector-for-select-resources
。 - PROTOCOL:您希望 VPC 连接器允许的一个或多个协议。您必须指定
ah
、all
、esp
、icmp
、ipip
、sctp
、tcp
和udp
中的一项或多项,您还可视需要指定介于 0 到 255 之间的 IP 协议端口号。例如,tcp:80,icmp
会允许通过端口 80 的 TCP 流量,以及 ICMP 流量。如需了解详情,请参阅allow
标志的文档。 VPC_CONNECTOR_NETWORK_TAG:通用连接器网络标记(如果要限制对所有连接器的访问,包括将来创建的任何连接器)或唯一网络标记(如果要限制对特定连接器的访问)。必须与您在上一步中指定的网络标记相匹配。
- 通用网络标记:
vpc-connector
唯一网络标记:
vpc-connector-REGION-CONNECTOR_NAME
您需要进行如下替换:
- REGION:您要限制的连接器所在的区域
- CONNECTOR_NAME:您要限制的连接器的名称
如需详细了解连接器网络标记,请参阅网络标记。
- 通用网络标记:
VPC_NETWORK:您的 VPC 网络的名称
RESOURCE_TAG:您希望 VPC 连接器访问的 VPC 资源的网络标记
PRIORITY:小于您在上一步中设置的优先级值的整数。例如,如果您将在上一步中创建的规则的优先级设置为 990,请尝试 980。
- RULE_NAME:新防火墙规则的名称。例如
如需详细了解用于创建防火墙规则的必需和可选标志,请参阅 gcloud compute firewall-rules create
的文档。
CIDR 范围
以下步骤介绍了如何创建入站规则,以根据连接器的 CIDR 范围限制对 VPC 网络的访问权限。
确保您拥有插入防火墙规则所需的权限。您必须拥有以下 Identity and Access Management (IAM) 角色之一:
- 计算安全管理员角色
- 启用了
compute.firewalls.create
权限的自定义 IAM 角色
拒绝您的 VPC 网络中的连接器流量。
在您的 VPC 网络上创建优先级低于 1000 的入站防火墙规则,以拒绝来自连接器的 CIDR 范围的入站流量。这会替换无服务器 VPC 访问通道默认情况下在您的 VPC 网络中创建的隐式防火墙规则。
gcloud compute firewall-rules create RULE_NAME \ --action=DENY \ --rules=<_1, PROTOCOL> \ --source-ranges=VPC_CONNECTOR_CIDR_RANGE \ --direction=INGRESS \ --network=VPC_NETWORK \ --priority=PRIORITY
替换以下内容:
- RULE_NAME:新防火墙规则的名称。例如
deny-vpc-connector
。 - VPC_CONNECTOR_CIDR_RANGE:您要限制其访问权限的连接器的 CIDR 范围
- VPC_NETWORK:您的 VPC 网络的名称
- PRIORITY:介于 1-999 之间的整数。例如:990。
- RULE_NAME:新防火墙规则的名称。例如
允许应接收连接器流量的资源接收连接器流量。
使用
allow
和target-tags
标志创建一条入站防火墙规则,用于定位您的 VPC 网络中您希望 VPC 连接器访问的资源。将此规则的优先级设置为低于您在上一步中创建的规则的优先级值。gcloud compute firewall-rules create RULE_NAME \ --allow=PROTOCOL \ --source-ranges=VPC_CONNECTOR_CIDR_RANGE \ --direction=INGRESS \ --network=VPC_NETWORK \ --target-tags=RESOURCE_TAG \ --priority=PRIORITY
替换以下内容:
- RULE_NAME:新防火墙规则的名称。例如
allow-vpc-connector-for-select-resources
。 - PROTOCOL:您希望 VPC 连接器允许的一个或多个协议。您必须指定
ah
、all
、esp
、icmp
、ipip
、sctp
、tcp
和udp
中的一项或多项,您还可视需要指定介于 0 到 255 之间的 IP 协议端口号。例如,tcp:80,icmp
会允许通过端口 80 的 TCP 流量,以及 ICMP 流量。如需了解详情,请参阅allow
标志的文档。 - VPC_CONNECTOR_CIDR_RANGE:您要限制其访问权限的连接器的 CIDR 范围
- VPC_NETWORK:您的 VPC 网络的名称
- RESOURCE_TAG:您希望 VPC 连接器访问的 VPC 资源的网络标记
- PRIORITY:小于您在上一步中设置的优先级值的整数。例如,如果您将在上一步中创建的规则的优先级设置为 990,请尝试 980。
- RULE_NAME:新防火墙规则的名称。例如
如需详细了解用于创建防火墙规则的必需和可选标志,请参阅 gcloud compute firewall-rules create
的文档。
使用出站规则限制访问权限
以下步骤介绍了如何创建出站规则以限制连接器的访问权限。
确保您拥有插入防火墙规则所需的权限。您必须拥有以下 Identity and Access Management (IAM) 角色之一:
- 计算安全管理员角色
- 启用了
compute.firewalls.create
权限的自定义 IAM 角色
拒绝连接器的出站流量。
在无服务器 VPC 访问通道连接器上创建出站防火墙规则,以防止其发送传出流量。
gcloud compute firewall-rules create RULE_NAME \ --action=DENY \ --rules=PROTOCOL \ --direction=EGRESS \ --target-tags=VPC_CONNECTOR_NETWORK_TAG \ --network=VPC_NETWORK \ --priority=PRIORITY
替换以下内容:
- RULE_NAME:新防火墙规则的名称。例如
deny-vpc-connector
。 - PROTOCOL:您希望 VPC 连接器允许的一个或多个协议。您必须指定
ah
、all
、esp
、icmp
、ipip
、sctp
、tcp
和udp
中的一项或多项,您还可视需要指定介于 0 到 255 之间的 IP 协议端口号。例如,tcp:80,icmp
会允许通过端口 80 的 TCP 流量,以及 ICMP 流量。如需了解详情,请参阅allow
标志的文档。 - VPC_CONNECTOR_NETWORK_TAG:通用 VPC 连接器网络标记 - 如果您希望将此规则应用于所有现有 VPC 连接器和未来的任何 VPC 连接器。或者,如果要控制特定连接器,则是唯一的 VPC 连接器网络标记。
- VPC_NETWORK:您的 VPC 网络的名称
- PRIORITY:介于 1-999 之间的整数。例如:990。
- RULE_NAME:新防火墙规则的名称。例如
当目的地位于您希望连接器访问的 CIDR 范围内时,允许出站流量。
使用
allow
和destination-ranges
标志可创建一条防火墙规则,以允许来自连接器的出站流量进入特定目的地范围。将目的地范围设置为您的 VPC 网络中您希望连接器访问的资源的 CIDR 范围。将此规则的优先级设置为低于您在上一步中创建的规则的优先级值。gcloud compute firewall-rules create RULE_NAME \ --allow=PROTOCOL \ --destination-ranges=RESOURCE_CIDR_RANGE \ --direction=EGRESS \ --network=VPC_NETWORK \ --target-tags=VPC_CONNECTOR_NETWORK_TAG \ --priority=PRIORITY
替换以下内容:
- RULE_NAME:新防火墙规则的名称。例如
allow-vpc-connector-for-select-resources
。 - PROTOCOL:您希望 VPC 连接器允许的一个或多个协议。您必须指定
ah
、all
、esp
、icmp
、ipip
、sctp
、tcp
和udp
中的一项或多项,您还可视需要指定介于 0 到 255 之间的 IP 协议端口号。例如,tcp:80,icmp
会允许通过端口 80 的 TCP 流量,以及 ICMP 流量。如需了解详情,请参阅allow
标志的文档。 - RESOURCE_CIDR_RANGE:您要限制其访问权限的连接器的 CIDR 范围
- VPC_NETWORK:您的 VPC 网络的名称
- VPC_CONNECTOR_NETWORK_TAG:通用 VPC 连接器网络标记 - 如果您希望将此规则应用于所有现有 VPC 连接器和未来的任何 VPC 连接器。或者,如果要控制特定连接器,则是唯一的 VPC 连接器网络标记。如果您在上一步中使用了唯一的网络标记,请使用该唯一的网络标记。
- PRIORITY:小于您在上一步中设置的优先级值的整数。例如,如果您将在上一步中创建的规则的优先级设置为 990,请尝试 980。
- RULE_NAME:新防火墙规则的名称。例如
如需详细了解用于创建防火墙规则的必需和可选标志,请参阅 gcloud compute firewall-rules create
的文档。
管理连接器
控制服务的出站流量
默认情况下,只有对内部 IP 地址和内部 DNS 名称的请求会通过无服务器 VPC 访问通道连接器进行路由。您可以在 app.yaml
文件中为您的服务指定出站流量设置。
出站流量设置与 URL Fetch 服务不兼容。
如果使用 urlfetch
库,则系统会忽略出站流量设置,并且请求不会通过无服务器 VPC 访问通道连接器进行路由。
如需配置 App Engine 服务的出站流量行为,请执行以下操作:
将
egress_setting
特性添加到服务的app.yaml
文件的vpc_access_connector
字段中:vpc_access_connector: name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME egress_setting: EGRESS_SETTING
您需要将其中的:
- 将
PROJECT_ID
替换为您的 Cloud 项目 ID - 将
REGION
替换为连接器所在的区域 - 将
CONNECTOR_NAME
替换为连接器的名称 - 将
EGRESS_SETTING
替换为以下项之一:
- 将
部署该服务:
gcloud app deploy
断开服务与 VPC 网络的连接
如需断开服务与 VPC 网络的连接,请从 app.yaml
文件中移除 vpc_access_connector
字段并重新部署该服务。
即使没有流量并断开连接,连接器也会继续产生费用。如需了解详情,请参阅价格。如果您不再需要连接器,请务必删除连接器,以避免继续计费。
删除连接器
在删除连接器之前,请确保没有服务仍与该连接器连接。
对于在共享 VPC 宿主项目中设置连接器的共享 VPC 用户,您可以使用 gcloud compute networks vpc-access connectors describe
命令列出其中存在使用给定连接器的服务的项目。
如需删除连接器,请使用 Google Cloud 控制台或 Google Cloud CLI:
控制台
转到 Google Cloud 控制台中的无服务器 VPC 访问通道概览页面:
选择要删除的连接器。
点击删除。
gcloud
使用以下 gcloud
命令删除连接器:
gcloud compute networks vpc-access connectors delete CONNECTOR_NAME --region=REGION
替换以下内容:
- 将 CONNECTOR_NAME 替换为要删除的连接器的名称
- 将 REGION 替换为连接器所在的区域
问题排查
服务帐号权限
为了在您的 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 网络中预留的任何现有 IP 地址均不重叠的 RFC 1918 内部 IP 地址范围。
- 向您的项目授予权限,让它能使用 ID 为
serverless-vpc-access-images
的项目中的 Compute Engine 虚拟机映像。如需了解如何相应地更新组织政策,请参阅设置映像访问权限限制。
如果您已指定连接器,但仍无法访问 VPC 网络中的资源:
- 确保您的 VPC 网络上没有优先级低于 1000 的防火墙规则会拒绝来自连接器 IP 范围的入站流量。
后续步骤
- 使用无服务器 VPC 访问通道审核日志记录监控管理员活动。
- 使用 VPC Service Controls 创建服务边界来保护资源和数据。
- 了解与无服务器 VPC 访问通道关联的 Identity and Access Management (IAM) 角色。如需获取与每个角色关联的权限列表,请参阅 IAM 文档中的无服务器 VPC 访问通道角色。
- 了解如何从 App Engine 标准环境连接到 Memorystore。