将 App Engine 自定义网域迁移到 Cloud Load Balancing

区域 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 文件中定义的所有路由规则。

下图描述了对应用的更改:

获取 App Engine 自定义网域,然后将传入请求转移到 Cloud Load Balancing 前端服务,后者再将请求分发到 App Engine 后端服务。

通过迁移到 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 前端服务的设置说明:

  1. 确保您拥有所需的权限
  2. 创建 Google 管理的证书
  3. 配置 Cloud Load Balancing
  4. 测试负载均衡器
  5. 将您的网域连接到负载均衡器
  6. 删除 App Engine 自定义网域映射
  7. 设置入站流量控制以仅允许通过 Cloud Load Balancing 进行访问

准备工作

拥有一个在 App Engine 设置中配置了自定义网域的 App Engine 应用。

配置权限

如需按照本指南操作,您需要在项目中创建 Google 管理的证书、无服务器 NEG 和外部 HTTP(S) 负载均衡器。您应该是项目的所有者或编辑者,或者具有以下 IAM 角色

任务 所需的角色
使用 Certificate Manager 创建 Google 管理的 SSL 证书 Certificate Manager OwnerCertificate Manager EditorCompute 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 授权

  1. 运行以下命令,在 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 自定义网域的域名。
  2. 记下 gcloud 命令返回的 CNAME。您必须在后续步骤中使用它来更新 DNS 记录。

将 CNAME 记录添加到您的 DNS 配置

根据您使用的是 Cloud DNS 还是其他第三方 DNS 解决方案,请按照适合您的使用场景的说明操作:

Cloud DNS

创建 DNS 授权后,gcloud 命令会返回相应的 CNAME 记录。您必须将此 CNAME 记录添加到目标网域的 DNS 区域中的 DNS 配置,如下所示:

  1. 发起 DNS 记录事务:

    gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
    

    DNS_ZONE_NAME 替换为公共 DNS 区域的名称。如果您使用 Google Cloud 管理网域并接收流向该网域的流量,则表示您已经创建了公共 DNS 区域。如需查看公共 DNS 区域,请参阅列出和描述代管式区域

  2. 将 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 区域的名称。
  3. 执行 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 管理的证书,请运行以下命令:

  1. 创建 Google 管理的证书

    gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains=DOMAIN_NAME --dns-authorizations=AUTHORIZATION_NAME
    

    请替换以下内容:

    • CERTIFICATE_NAME 是描述证书的唯一名称。
    • DOMAIN_NAME 是 App Engine 自定义域名。
    • AUTHORIZATION_NAME 是之前创建的 DNS 授权的名称。
  2. 验证证书是否处于活跃状态。

    在将证书部署到负载均衡器之前,请使用以下命令验证证书本身是否处于活跃状态。请注意,证书状态可能需要长达几个小时才能更改为 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 问题

创建证书映射

  1. 创建证书映射

    gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
    

    CERTIFICATE_MAP_NAME 替换为用于描述证书映射的唯一名称。

  2. 创建证书映射条目,并将其与前面的证书和证书映射相关联:

    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 标志,以确保在未指定域名时此证书用作默认证书。

  3. 验证证书映射是否处于活跃状态。

    在将相应的证书映射关联到目标代理之前,请使用以下命令验证证书映射条目是否处于活跃状态:

    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 负载均衡器。

将流量分配给 App Engine 应用

转发规则路由来自外部 IP 地址的传入请求并将请求定向到目标 HTTPS 代理。HTTPS 负载均衡器使用网址映射将请求定向到后端服务,该服务包含 App Engine 服务的无服务器 NEG。

保留外部 IP 地址

在配置 Cloud Load Balancing 之前,您需要设置一个全球静态外部 IP 地址,以供用户访问您的负载均衡器。

控制台

  1. 转到 Google Cloud 控制台中的外部 IP 地址页面。

    转到“外部 IP 地址”

  2. 点击预留静态地址以预留 IPv4 地址。

  3. 为静态地址分配一个名称,例如 appengine-external-ip

  4. 将网络层级设置为优质

  5. IP 版本设置为 IPv4

  6. 类型设置为全局

  7. 点击预留

gcloud

  1. 创建外部 IP 地址预留:

    gcloud compute addresses create EXTERNAL_IP \
        --network-tier=PREMIUM \
        --ip-version=IPV4 \
        --global
    

    EXTERNAL_IP 是要创建的地址的名称。

  2. 请记下预留的 IPv4 地址:

    gcloud compute addresses describe EXTERNAL_IP \
        --format="get(address)" \
        --global
    

为 App Engine 配置后端服务

网络端点组 (NEG) 用于为负载均衡器指定一组后端端点。如需指定指向 App Engine 服务的后端,请配置无服务器 NEG,然后在 Cloud Load Balancing 中配置后端服务、路由规则和前端服务。

  1. 为 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 配置的自定义网域的行为相同。

  2. 创建后端服务:

    gcloud compute backend-services create APP_ENGINE_BACKEND \
      --global \
      --load-balancing-scheme=EXTERNAL_MANAGED
    

    APP_ENGINE_BACKEND 替换为要创建的后端服务的名称。

  3. 将无服务器 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 中设置的区域
  4. 创建网址映射以将传入请求路由到相应后端服务:

    gcloud compute url-maps create URL_MAP_NAME \
          --default-service APP_ENGINE_BACKEND
    

    请替换以下内容:

    • URL_MAP_NAME 是网址映射资源的唯一名称,用于定义网址到后端服务的映射。
    • APP_ENGINE_BACKEND 是前面的后端服务的名称。
  5. 创建目标 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 是前面的网址映射的名称。
  6. 创建转发规则以将传入请求路由到相应代理:

    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 地址进行测试,然后再迁移网域。

  1. 进入 Google Cloud 控制台中的负载均衡页面。
    转到“负载均衡”
  2. 点击刚刚创建的负载均衡器。
  3. 记下负载均衡器的 IP 地址
  4. 对于 HTTPS 负载均衡器,您可以使用网络浏览器访问 https://IP_ADDRESS 来测试负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址,例如 30.90.80.100

    • 如果此方法不起作用并且您使用的是 Google 管理的证书,请确认证书为 ACTIVE,并且证书映射为 ACTIVE
    • 如果您使用自签名证书进行测试,则浏览器会显示警告。您必须明确指示浏览器接受自签名证书。点击该警告即可查看实际页面。

    如需了解更多配置选项,请参阅使用无服务器平台设置全球外部 HTTP(S) 负载均衡器

将您的网域连接到负载均衡器

创建负载均衡器后,请记好与负载均衡器关联的 IP 地址,例如 30.90.80.100。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A 记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A 记录,所有网域均指向负载均衡器的 IP 地址。例如,如需为 www.example.comexample.com 创建 A 记录,请使用以下命令:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用 Cloud DNS 作为 DNS 提供商,请参阅添加、修改和删除记录

删除 App Engine 自定义网域映射

在 Google Cloud 控制台中:

  1. 找到 App Engine 设置页面的自定义网域标签页。

    转到“自定义网域”

  2. 选择自定义域名,然后点击删除

或者,您也可以使用 gcloud 命令Admin API 删除自定义网域。

设置入站流量控制以仅允许通过 Cloud Load Balancing 进行访问

测试负载均衡器后,我们建议您更新 App Engine 应用,以仅接受来自 Cloud Load Balancing 的流量。如需了解如何配置 internal-and-cloud-load-balancing 入站流量控制,请参阅入站流量设置