您可以启用 App Engine 服务,以通过直接 VPC 出站流量将流量发送到共享 VPC 网络,而无需无服务器 VPC 访问通道连接器。直接 VPC 出站流量支持 VPC 流日志和 Cloud NAT(Public NAT 和 Private NAT)。
本页面介绍了如何配置 App Engine 的 IAM 权限以使用共享 VPC 网络的子网,然后将服务置于共享子网上。
准备工作
查看 IP 地址分配部分,了解如何从子网分配 IP 地址。
限制
IP 地址消耗:服务的 IP 地址用量会直接随正在运行的实例数量而伸缩,并且伸缩能力受所选子网中可用 IP 地址数量的限制。
维护事件:在网络基础设施维护事件期间,您的服务可能会遇到短暂的连接中断。我们建议您使用客户端库来处理偶尔的连接重置。
冷启动:初始冷启动时间取决于区域和具体用例。在极少数情况下,冷启动可能需要长达一分钟。
直接 VPC 入站流量:App Engine 不支持直接 VPC 入站流量。
实例数量:默认情况下,每个 App Engine 版本最多只能配置 100 个实例来使用直接 VPC 出站流量。如果您的工作负载需要更多实例,您可以申请增加配额。
VPC 流日志:不会在日志记录中显示 App Engine 服务版本。服务名称显示在
AppEngineServiceDetails字段中。区域可用性:直接 VPC 出站流量仅在某些区域通过邀请提供。如需在这些区域申请访问权限,请与支持团队联系。
设置 IAM 权限
您必须先确保 App Engine 服务代理具有使用子网的足够权限,然后才能使共享 VPC 服务项目中的 App Engine 能够访问共享 VPC 网络。
App Engine Service Agent 角色:如需访问共享 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." \ --role "roles/compute.networkUser"
替换以下内容:
- HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
- SERVICE_PROJECT_NUMBER:您在其中部署 App Engine 服务的共享 VPC 服务项目的编号。
共享 VPC 宿主项目的 Compute Network Viewer (
roles/compute.networkViewer) 和共享 VPC 子网的 Compute Network User (roles/compute.networkUser) 角色。 具有外部 IPv6 的子网还需要 Compute Public IP Admin (roles/compute.publicIpAdmin) 角色。例如,如需在宿主项目上授予 Compute Network Viewer 角色,并在子网上授予 Compute Network User 角色,请运行以下命令:
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \ --role "roles/compute.networkViewer" gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \ --region REGION \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service." \ --role "roles/compute.networkUser" \ --project HOST_PROJECT_ID
替换以下内容:
- HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
- SERVICE_PROJECT_NUMBER:您在其中部署 App Engine 服务的共享 VPC 服务项目的编号。
- SUBNET_NAME:您要运行 App Engine 服务的子网的名称。
- REGION:App Engine 服务所在的区域,该区域必须与子网的区域一致。
自定义权限:如需进行更精细的控制,请向 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 防火墙规则。
如需将服务置于共享子网上,请为共享 VPC 网络和子网指定完全限定的资源名称。
您可以使用 YAML 或 Terraform 为 App Engine 服务配置直接 VPC 出站流量。如需启用或断开直接 VPC 出站流量,请部署新版本并将流量迁移到该版本。您也可以先删除已部署的版本,而不是覆盖现有版本 ID。
YAML
更新
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 app deploy
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
将以下
vpc_access块添加到 Terraform 配置中的google_app_engine_standard_app_version资源:vpc_access { vpc_egress = "EGRESS_SETTING" network_interfaces { network = "projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK" subnetwork = "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME" tags = ["TAG_1", "TAG_2"] } }
替换以下内容:
- HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
- VPC_NETWORK:您的共享 VPC 网络的名称。
- REGION:App Engine 服务所在的区域,该区域必须与子网的区域一致。
- SUBNET_NAME:您的子网的名称。
- 可选:TAG_1、TAG_2 列出了要与 App Engine 服务的实例关联的网络标记,以便在防火墙规则和路由政策中使用。
- 可选:EGRESS_SETTING 控制出站流量的路由方式。此字段支持以下配置设置:
ALL_TRAFFIC:通过共享 VPC 网络发送所有出站流量。PRIVATE_IP_RANGES(默认):仅发送通过共享 VPC 网络发送到内部地址的流量。
如果该版本已部署,但未使用直接 VPC 出站流量,请将
version_id字段更新为新值。您无法在现有版本上启用直接 VPC 出站流量。应用配置:
terraform apply
断开服务连接
如需从共享 VPC 网络中移除服务,请使用 YAML 或 Terraform:
YAML
- 从
app.yaml文件中移除vpc_access部分。 重新部署服务:
gcloud app deploy
Terraform
- 从 Terraform 配置中的
google_app_engine_standard_app_version资源中移除vpc_access块。 - 将
version_id字段更新为新值。您无法在现有版本上停用直接 VPC 出站流量。 应用配置:
terraform apply
问题排查
本部分介绍了将直接 VPC 出站流量与共享 VPC 网络搭配使用时可能会遇到的常见错误,并提供了有关如何解决这些错误的指导。
无法删除子网
如需删除子网,您必须先删除使用该子网的所有资源。如果 App Engine 使用子网,您必须先断开连接或将其移至其他子网,然后才能删除该子网。
删除或移动 App Engine 资源后,请等待 1-2 小时,以便 App Engine 释放 IP,然后再删除子网。
部署失败
如果部署失败,Google Cloud CLI 会显示出错提示,指明根本原因。一些常见问题包括:
VPC 网络元数据不正确,例如
app.yaml文件中的网络或子网名称拼写错误。如需修正潜在错误,请查看app.yaml文件中的 VPC 网络配置。IAM 权限不足。确保您向 App Engine 服务代理 (
service-SERVICE_PROJECT_NUMBER@gcp-gae-service.) 授予所需权限。如果您在部署期间遇到权限错误,请确保向部署服务账号授予以下额外角色:- Cloud Build 服务账号 (
roles/cloudbuild.builds.builder) - Service Account Token Creator (
roles/iam.serviceAccountTokenCreator)
- Cloud Build 服务账号 (
无法分离共享 VPC 网络
如需在宿主项目中分离共享 VPC 网络,请按照取消预配共享 VPC 中的步骤操作,并务必断开所有 App Engine 服务的连接。
如需查看哪些 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 地址,请转到 Google Cloud 控制台中的“IP 地址”页面,或从 Google Cloud CLI 运行以下命令:
gcloud compute addresses list