您可以启用 App Engine 服务,以通过 直接 VPC 出站流量将流量发送到 共享 VPC 网络,而无需 无服务器 VPC 访问通道连接器。
本页面介绍了如何配置 App Engine 的 IAM 权限以使用共享 VPC 网络的子网,然后将服务置于共享子网上。
准备工作
查看 IP 地址分配 部分,了解如何 从子网分配 IP 地址。
限制
IP 地址消耗量:服务的 IP 地址用量直接随 运行的实例数量而伸缩,并且伸缩能力受 所选子网中可用 IP 地址数量的限制。
维护事件:在网络基础设施维护事件期间,您的服务可能会遇到短暂的连接 中断。我们建议您使用客户端库来处理偶尔的连接重置。
冷启动:初始冷启动时间取决于区域和 具体用例。在极少数情况下,冷启动可能会持续长达一分钟。
直接 VPC 入站流量:App Engine 不支持直接 VPC 入站流量。
实例数量:您只能为每个 App Engine 版本配置最多 100 个实例,以使用直接 VPC 出站流量。
设置 IAM 权限
您必须先确保 App Engine 服务代理具有使用子网的足够权限,然后才能使共享 VPC 服务项目中的 App Engine 能够访问共享 VPC 网络。
App Engine 服务代理角色:如需访问共享 VPC 网络,请通过添加以下角色之一向 App Engine 服务代理授予足够的权限:
共享 VPC 宿主项目上的 Compute Network User (
roles/compute.networkUser) 。具有外部 IPv6 的子网还需要 Compute Public IP Admin (roles/compute.publicIpAdmin) 角色。例如,如需授予 Compute Network User 角色,请运行以下命令:
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
替换以下内容:
- HOST_PROJECT_ID:共享 VPC 宿主 项目的 ID。
- SERVICE_PROJECT_NUMBER:您在其中部署 App Engine 服务的共享 VPC 服务 项目的编号。
共享 VPC 宿主项目上的 Compute Network Viewer (
compute.networkViewer) 和共享 VPC 子网的 Compute Network User (compute.networkUser) 角色。具有外部 IPv6 的子网还需要 Compute Public IP Admin (roles/compute.publicIpAdmin) 角色。例如,如需授予子网的 Compute Network User 角色,请运行以下命令:
gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \ --region REGION \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \ --role "roles/compute.networkUser" \ --project HOST_PROJECT_ID
替换以下内容:
- SUBNET_NAME:您要运行 App Engine 服务的子网 的完全限定资源名称。
- REGION:App Engine 服务所在的区域, 该区域必须与子网的区域一致。
- SERVICE_PROJECT_NUMBER:您在其中部署 App Engine 服务的共享 VPC 服务 项目的编号。
- HOST_PROJECT_ID:共享 VPC 宿主 项目的 ID。
自定义权限:如需进行更精细的控制,请向 App Engine 服务代理授予对项目的以下额外权限:
- 共享 VPC 宿主项目上的
compute.networks.get - 宿主项目或特定子网的
compute.subnetworks.get权限 - 宿主项目或特定子网的
compute.subnetworks.use权限 - 共享 VPC 服务项目的
compute.addresses.get权限 - 共享 VPC 服务项目的
compute.addresses.list权限 - 共享 VPC 服务项目的
compute.addresses.create权限 - 共享 VPC 服务项目的
compute.addresses.delete权限 - 共享 VPC 服务项目的
compute.addresses.createInternal权限 - 共享 VPC 服务项目的
compute.addresses.deleteInternal权限 - 共享 VPC 服务项目的
compute.regionOperations.get权限
- 共享 VPC 宿主项目上的
IP 地址分配
如需将 App Engine 服务置于 VPC 网络中,请指定 VPC 网络或子网,或同时指定两者。如果您仅指定网络,则子网会使用与网络相同的名称。 App Engine 会分配子网中的 IP 地址。
IP 地址是临时性的,因此请勿基于各个 IP 创建政策。如果您需要基于 IP 创建政策(例如防火墙规则),则必须使用整个子网的 IP 地址范围。
如需更改服务使用的网络或子网,请部署使用新网络和子网值的新版本。
扩容和缩容
为在发生流量激增时实现快速扩容,App Engine 会一次性预留 16 个 IP 地址块(28 子网掩码)。
为了确保有足够的 IPv4 地址可在 App Engine 中使用,子网的 IPv4 地址范围必须为 /26 或更大。
为了提高 IP 分配效率和易于管理,请将多个资源置于同一子网中。如果 IPv4 地址空间有限,请参阅 支持的 IPv4 范围以了解更多选项。
如需删除子网,您必须先删除或重新部署 App Engine 服务以停止使用子网,然后等待 1-2 小时。
服务的 IP 地址消耗量
在稳定状态下,App Engine 使用的 IP 地址数量是实例数量的 2 倍 (2X)。版本缩容时,App Engine 会将其 IP 地址保留最多 20 分钟。总共预留至少 2 倍的 IP 地址数量,再加上考虑到版本更新的缓冲空间。
例如,如果您升级版本,使 version 1 从 100 个实例缩减到零,而 version 2 从零扩容到 100,则 App Engine 会在缩容之后将 version 1 IP 地址保留最多 20 分钟。在 20 分钟的保留窗口内,您必须至少预留 400 个 IP 地址 ((100 + 100) * 2)。
支持的 IPv4 范围
App Engine 支持子网的以下 IPv4 范围:
部署 App Engine 服务
借助直接 VPC 出站流量,您的 App Engine 服务可以将流量发送到没有无服务器 VPC 访问通道连接器的共享 VPC 网络。您可以为 App Engine 服务的特定版本分配网络标记,以实现更精细的网络安全性,例如 应用 VPC 防火墙规则。
如需将服务置于共享子网上,请在 app.yaml 文件中为共享 VPC 网络和子网指定完全限定的资源名称。
更新
app.yaml文件以添加vpc_access部分:vpc_access: network_interface: network: projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK subnet: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME tags: - NETWORK_TAGS vpc_egress: EGRESS_SETTING
替换以下内容:
- HOST_PROJECT_ID:共享 VPC 项目的 ID。
- VPC_NETWORK:共享 VPC 网络的名称。
- REGION:App Engine 服务所在的区域, 该区域必须与子网的区域一致。
- SUBNET_NAME:子网的完全限定资源名称。
- 可选:NETWORK_TAGS:要与 App Engine 服务的实例关联的网络标记列表,用于防火墙规则和路由政策。
可选:EGRESS_SETTING:控制如何路由出站流量。此字段支持以下配置设置:
all-traffic:通过共享 VPC 网络发送所有出站流量。private-ranges-only(默认):仅发送通过共享 VPC 网络发送到内部地址的流量。
通过运行以下命令部署服务:
gcloud beta app deploy
断开服务连接
如需从共享 VPC 网络中移除服务,请执行以下操作:
- 从
app.yaml文件中移除vpc_access部分。 重新部署服务:
gcloud beta app deploy
问题排查
本部分介绍了在使用共享 VPC 网络的直接 VPC 出站流量时可能会遇到的常见错误,并提供了有关如何解决这些错误的指南。
无法删除子网
如需删除子网,您必须先删除使用该子网的所有资源。如果 App Engine 使用子网,您必须先断开其连接或将其移至其他子网,然后才能 删除该子网。
删除或移动 App Engine 资源后,请等待 1-2 小时,以便 App Engine 释放 IP,然后再删除子网。
部署失败
如果部署失败,Google Cloud CLI 会显示错误消息,指明根本原因。常见的问题包括:
VPC 网络元数据不正确,例如
app.yaml文件中的网络或子网名称拼写错误。如需修复潜在错误,请查看app.yaml文件中的 VPC 网络配置。IAM 权限不足。请确保您 在部署服务帐号上授予所需权限。如果在部署期间遇到权限错误,请确保向服务帐号授予以下额外角色:
- Cloud Build 服务账号 (
roles/cloudbuild.builds.builder) - Service Account Token Creator (
roles/iam.serviceAccountTokenCreator)
- Cloud Build 服务账号 (
无法分离共享 VPC 网络
如需在宿主项目中分离共享 VPC 网络,请按照 取消预配共享 VPC 中的步骤操作,并务必断开所有 App Engine 服务与共享 VPC 网络的连接。
如需查看哪些 App Engine 资源正在使用共享 VPC 网络,请运行以下命令:
gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID
将 HOST_PROJECT_ID 替换为共享 VPC 宿主 项目的 ID。
直接 VPC 出站流量子网用尽 IPv4 地址
如果 VPC 网络的子网用尽 IPv4 地址,App Engine 将无法启动更多服务实例。
如需解决此问题,请考虑迁移到具有更多可用 IP 地址的子网,或扩大子网范围。
查看分配的 IP 地址
如需查看 App Engine 分配的 IP 地址,请转到控制台中的 “IP 地址”页面,或从 Google Cloud CLI 运行以下命令: Google Cloud
gcloud compute addresses list