区域 ID
REGION_ID
是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r
包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。
详细了解区域 ID。
本指南介绍了如何使用 Cloud Load Balancing 为 App Engine 应用设置新的公共端点。
借助 Cloud Load Balancing,您可以将自定义网域端点配置为前端服务,并使用无服务器网络端点组 (NEG) 将 App Engine 应用配置为后端服务。流向 Cloud Load Balancing 前端服务端点的流量的路由方式与之前相同,包括您在应用的 dispatch.yaml
文件中定义的所有路由规则。
下图描述了对应用的更改:
通过迁移到 Cloud Load Balancing,您可以在访问网域时更加灵活地处理流量,例如从 Cloud Storage 传送静态内容,或添加在 Cloud Run 和 Google Kubernetes Engine 等其他计算平台上运行的服务。
您还可以有权访问 App Engine 未提供的主要 Google Cloud 功能,其中包括:
- Google Cloud Armor,可通过高级 DDoS 防护、基于 IP 和基于地理位置的访问权限控制、Web 应用防火墙规则等来提高安全性
- Cloud CDN,实现缓存内容传送
- SSL 政策,用于管理应用将接受哪些 SSL 功能和 TLS 版本
本指南介绍了将传入请求从具有自定义网域的 App Engine 服务转移到 Cloud Load Balancing 前端服务的设置说明:
- 确保您拥有所需的权限
- 创建 Google 管理的证书
- 配置 Cloud Load Balancing
- 测试负载均衡器
- 将您的网域连接到负载均衡器
- 删除 App Engine 自定义网域映射
- 设置入站流量控制以仅允许通过 Cloud Load Balancing 进行访问
准备工作
拥有一个在 App Engine 设置中配置了自定义网域的 App Engine 应用。
配置权限
如需按照本指南操作,您需要在项目中创建 Google 管理的证书、无服务器 NEG 和外部 HTTP(S) 负载均衡器。您应该是项目的所有者或编辑者,或者具有以下 IAM 角色:
任务 | 所需的角色 |
---|---|
使用 Certificate Manager 创建 Google 管理的 SSL 证书 | Certificate Manager Owner 或 Certificate Manager Editor 和 Compute Load Balancer Admin |
更新自定义网域的 DNS 记录 | Cloud DNS Administrator(如果使用 Cloud DNS 作为 DNS 解决方案)。 如果使用其他 DNS 提供商,您需要拥有添加和更新自定义网域的 DNS 记录的权限。 |
创建负载均衡器和网络组件 | 计算网络管理员 |
创建和修改 NEG | Compute Instance Admin |
创建和修改 SSL 证书 | 计算安全管理员 |
在 App Engine 设置中删除自定义网域 | App Engine Admin 角色或可提供 appengine.applications.update 权限的角色。 |
创建 Google 管理的 SSL 证书
Google 管理的 SSL 证书(在文档中也称为 TLS 证书)可让 Google Cloud 自动获取、管理和续订证书。如需迁移到 Cloud Load Balancing 前端而不导致现有 App Engine 服务停机,您必须使用 Certificate Manager 创建 DNS 授权和 Google 管理的证书。
请注意,Cloud Load Balancing 文档说明与创建 Google 管理的 SSL 证书的说明类似,但这些说明使用负载均衡器授权,该授权需要 App Engine 服务停机且可能持续长达几个小时。如需了解详情,请参阅 Google 管理的证书的网域授权。
为避免您的应用停机,请按照本页面中的步骤操作。
创建 DNS 授权
运行以下命令,在 Certificate Manager 中创建 DNS 授权:
gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \ --domain="DOMAIN_NAME" gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
请替换以下内容:
AUTHORIZATION_NAME
是用于描述此 DNS 授权的唯一名称。DOMAIN_NAME
是您要为其创建此 DNS 授权的 App Engine 自定义网域的域名。
记下
gcloud
命令返回的 CNAME。您必须在后续步骤中使用它来更新 DNS 记录。
将 CNAME 记录添加到您的 DNS 配置
根据您使用的是 Cloud DNS 还是其他第三方 DNS 解决方案,请按照适合您的使用场景的说明操作:
Cloud DNS
创建 DNS 授权后,gcloud
命令会返回相应的 CNAME 记录。您必须将此 CNAME 记录添加到目标网域的 DNS 区域中的 DNS 配置,如下所示:
发起 DNS 记录事务:
gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
将
DNS_ZONE_NAME
替换为公共 DNS 区域的名称。如果您使用 Google Cloud 管理网域并接收流向该网域的流量,则表示您已经创建了公共 DNS 区域。如需查看公共 DNS 区域,请参阅列出和描述代管式区域。将 CNAME 记录添加到目标 DNS 区域:
gcloud dns record-sets transaction add CNAME_RECORD \ --name="_acme-challenge.DOMAIN_NAME." \ --ttl="30" \ --type="CNAME" \ --zone="DNS_ZONE_NAME"
请替换以下内容:
CNAME_RECORD
是用于创建相应 DNS 授权的gcloud
命令所返回的 CNAME 记录的完整值。DOMAIN_NAME
是 App Engine 自定义域名。您必须在目标域名后添加尾随英文句点。DNS_ZONE_NAME
是前面的目标 DNS 区域的名称。
执行 DNS 记录事务以保存更改:
gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
将
DNS_ZONE_NAME
替换为前面的目标 DNS 区域的名称。
其他 DNS 解决方案
使用上一部分中的(主机)名称 (_acme-challenge.DOMAIN_NAME
) 和数据字段,将 CNAME 记录添加到网域的 DNS 配置。请参阅第三方 DNS 解决方案的相关文档。
创建引用 DNS 授权的 Google 管理的证书
如需创建引用您在先前步骤中创建的 DNS 授权的 Google 管理的证书,请运行以下命令:
创建 Google 管理的证书:
gcloud certificate-manager certificates create CERTIFICATE_NAME \ --domains=DOMAIN_NAME --dns-authorizations=AUTHORIZATION_NAME
请替换以下内容:
CERTIFICATE_NAME
是描述证书的唯一名称。DOMAIN_NAME
是 App Engine 自定义域名。AUTHORIZATION_NAME
是之前创建的 DNS 授权的名称。
验证证书是否处于活跃状态。
在将证书部署到负载均衡器之前,请使用以下命令验证证书本身是否处于活跃状态。请注意,证书状态可能需要长达几个小时才能更改为
ACTIVE
。gcloud certificate-manager certificates describe CERTIFICATE_NAME
将
CERTIFICATE_NAME
替换为之前创建的 Google 管理的证书的名称。gcloud
工具会返回类似于以下内容的输出:certificatePem: myPEM createTime: '2021-10-20T12:19:53.370778666Z' expireTime: '2022-05-07T05:03:49Z' managed: authorizationAttemptInfo: - domain: example.com state: AUTHORIZED dnsAuthorizations: - projects/my-project/locations/global/dnsAuthorizations/myAuth domains: - example.com state: ACTIVE name: projects/myProject/locations/global/certificates/myCert scope: myScope sanDnsnames: - example.com updateTime: '2021-10-20T12:19:55.083385630Z'
如果
gcloud
工具返回其他输出,请参阅排查 Certificate Manager 问题。
创建证书映射
创建证书映射:
gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
将
CERTIFICATE_MAP_NAME
替换为用于描述证书映射的唯一名称。创建证书映射条目,并将其与前面的证书和证书映射相关联:
gcloud certificate-manager maps entries create CERTIFICATE_MAP_ENTRY_NAME \ --map=CERTIFICATE_MAP_NAME \ --certificates=CERTIFICATE_NAME \ --set-primary
请替换以下内容:
CERTIFICATE_MAP_ENTRY_NAME
是描述此证书映射条目的唯一名称。CERTIFICATE_MAP_NAME
是此证书映射条目关联到的证书映射的名称。CERTIFICATE_NAME
是要与此证书映射条目关联的证书的名称。
您可以附加
--set-primary
标志,以确保在未指定域名时此证书用作默认证书。验证证书映射是否处于活跃状态。
在将相应的证书映射关联到目标代理之前,请使用以下命令验证证书映射条目是否处于活跃状态:
gcloud certificate-manager maps entries describe CERTIFICATE_MAP_ENTRY_NAME \ --map=CERTIFICATE_MAP_NAME
请替换以下内容:
CERTIFICATE_MAP_ENTRY_NAME
是前面的证书映射条目的名称。CERTIFICATE_MAP_NAME
是此证书映射条目关联到的证书映射的名称。
gcloud
工具会返回类似于以下内容的输出:createTime: '2021-09-06T10:01:56.229472109Z' name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry state: ACTIVE updateTime: '2021-09-06T10:01:58.277031787Z'
如需详细了解如何使用 Certificate Manager,请参阅 Certificate Manager 的运作方式。
配置 Cloud Load Balancing
在您拥有 Google 管理的证书后,可以将 App Engine 自定义网域替换为 Cloud Load Balancing 前端服务。
下图展示了具有单个后端服务和无服务器 NEG 的 HTTPS 负载均衡器。
转发规则路由来自外部 IP 地址的传入请求并将请求定向到目标 HTTPS 代理。HTTPS 负载均衡器使用网址映射将请求定向到后端服务,该服务包含 App Engine 服务的无服务器 NEG。
保留外部 IP 地址
在配置 Cloud Load Balancing 之前,您需要设置一个全球静态外部 IP 地址,以供用户访问您的负载均衡器。
控制台
转到 Google Cloud 控制台中的外部 IP 地址页面。
点击预留静态地址以预留 IPv4 地址。
为静态地址分配一个名称,例如
appengine-external-ip
。将网络层级设置为优质。
将 IP 版本设置为 IPv4。
将类型设置为全局。
点击预留。
gcloud
创建外部 IP 地址预留:
gcloud compute addresses create EXTERNAL_IP \ --network-tier=PREMIUM \ --ip-version=IPV4 \ --global
EXTERNAL_IP
是要创建的地址的名称。请记下预留的 IPv4 地址:
gcloud compute addresses describe EXTERNAL_IP \ --format="get(address)" \ --global
为 App Engine 配置后端服务
网络端点组 (NEG) 用于为负载均衡器指定一组后端端点。如需指定指向 App Engine 服务的后端,请配置无服务器 NEG,然后在 Cloud Load Balancing 中配置后端服务、路由规则和前端服务。
为 App Engine 应用创建无服务器 NEG:
gcloud compute network-endpoint-groups create APP_ENGINE_NEG \ --network-endpoint-type=serverless \ --app-engine-app \ --region=APP_ENGINE_REGION
请替换以下内容:
APP_ENGINE_NEG
是网络端点组的名称。APP_ENGINE_REGION
是在 App Engine 中设置的区域。
您可以附加上述
--app-engine-app
标志以使用默认路由,而不是定向到特定的 App Engine 服务。使用默认路由表示请求将发送到默认服务 (https://PROJECT_ID.REGION_ID.r.appspot.com
),否则请遵循您在dispatch.yaml
文件中定义的所有路由规则。这与使用 App Engine 配置的自定义网域的行为相同。创建后端服务:
gcloud compute backend-services create APP_ENGINE_BACKEND \ --global \ --load-balancing-scheme=EXTERNAL_MANAGED
将
APP_ENGINE_BACKEND
替换为要创建的后端服务的名称。将无服务器 NEG 添加到 App Engine 后端服务:
gcloud compute backend-services add-backend APP_ENGINE_BACKEND \ --global --network-endpoint-group=APP_ENGINE_NEG \ --network-endpoint-group-region=APP_ENGINE_REGION
请替换以下内容:
APP_ENGINE_BACKEND
是前面的后端服务的名称。APP_ENGINE_NEG
是网络端点组的名称。APP_ENGINE_REGION
是在 App Engine 中设置的区域。
创建网址映射以将传入请求路由到相应后端服务:
gcloud compute url-maps create URL_MAP_NAME \ --default-service APP_ENGINE_BACKEND
请替换以下内容:
URL_MAP_NAME
是网址映射资源的唯一名称,用于定义网址到后端服务的映射。APP_ENGINE_BACKEND
是前面的后端服务的名称。
创建目标 HTTPS 代理以将请求路由到您的网址映射:
gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \ --certificate-map=CERTIFICATE_MAP_NAME \ --url-map=URL_MAP_NAME
请替换以下内容:
TARGET_HTTPS_PROXY_NAME
是您选择用来描述 HTTPS 代理的唯一名称。CERTIFICATE_MAP_NAME
是引用证书映射条目及其关联证书的证书映射的名称。URL_MAP_NAME
是前面的网址映射的名称。
创建转发规则以将传入请求路由到相应代理:
gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \ --load-balancing-scheme=EXTERNAL_MANAGED \ --network-tier=PREMIUM \ --address=EXTERNAL_IP \ --target-https-proxy=TARGET_HTTPS_PROXY_NAME \ --global \ --ports=443
请替换以下内容:
HTTPS_FORWARDING_RULE_NAME
是用于描述将网络流量定向到 HTTPS 代理的转发规则的唯一名称。TARGET_HTTPS_PROXY_NAME
是前面的 HTTPS 代理的名称。EXTERNAL_IP
是之前创建的 IPv4 地址的名称。
测试负载均衡器
现在您已配置了负载均衡器,接下来可以开始将流量发送到负载均衡器的 IP 地址进行测试,然后再迁移网域。
- 进入 Google Cloud 控制台中的负载均衡页面。
转到“负载均衡” - 点击刚刚创建的负载均衡器。
- 记下负载均衡器的 IP 地址。
对于 HTTPS 负载均衡器,您可以使用网络浏览器访问
https://IP_ADDRESS
来测试负载均衡器。将IP_ADDRESS
替换为负载均衡器的 IP 地址,例如30.90.80.100
。- 如果此方法不起作用并且您使用的是 Google 管理的证书,请确认证书为
ACTIVE
,并且证书映射为ACTIVE
。 - 如果您使用自签名证书进行测试,则浏览器会显示警告。您必须明确指示浏览器接受自签名证书。点击该警告即可查看实际页面。
如需了解更多配置选项,请参阅使用无服务器平台设置全球外部 HTTP(S) 负载均衡器。
- 如果此方法不起作用并且您使用的是 Google 管理的证书,请确认证书为
将您的网域连接到负载均衡器
创建负载均衡器后,请记好与负载均衡器关联的 IP 地址,例如 30.90.80.100
。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A
记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A
记录,所有网域均指向负载均衡器的 IP 地址。例如,如需为 www.example.com
和 example.com
创建 A
记录,请使用以下命令:
NAME TYPE DATA www A 30.90.80.100 @ A 30.90.80.100
如果您使用 Cloud DNS 作为 DNS 提供商,请参阅添加、修改和删除记录。
删除 App Engine 自定义网域映射
在 Google Cloud 控制台中:
找到 App Engine 设置页面的自定义网域标签页。
选择自定义域名,然后点击删除。
或者,您也可以使用 gcloud 命令或 Admin API 删除自定义网域。
设置入站流量控制以仅允许通过 Cloud Load Balancing 进行访问
测试负载均衡器后,我们建议您更新 App Engine 应用,以仅接受来自 Cloud Load Balancing 的流量。如需了解如何配置 internal-and-cloud-load-balancing
入站流量控制,请参阅入站流量设置。