设置第三方对象存储

如果内容托管在本地或其他云中,您可以使用外部后端。通过外部后端可从 Google 的 Cloud CDN 传送内容。

本文档逐步引导您完成将第三方对象存储(例如 Amazon Simple Storage Service (Amazon S3) 或 Azure Blob Storage)设置为 Cloud CDN 的外部后端的过程。外部后端和 Cloud CDN 与外部应用负载均衡器搭配使用。

架构

如需创建外部后端,您需要创建一个指向第三方后端服务作为负载均衡器后端的互联网网络端点组 (NEG)。互联网 NEG 用于外部后端。

如需将第三方存储桶设置为后端,您必须执行以下操作:

  1. 准备第三方存储桶以传送内容。
  2. 创建使用存储桶的 FQDN 的互联网 NEG。
  3. 配置将互联网 NEG 作为后端的外部应用负载均衡器。
  4. 测试设置。

准备存储桶以传送内容

在 Google Cloud 中开始设置之前,请确保已正确配置存储桶。以下说明假定您使用的是 Amazon S3 存储桶,并且拥有对 Amazon S3 存储桶和对象进行更改所需的权限。

  1. 确保 Amazon S3 存储桶和存储桶中的对象是公开的,或者您已经为 Amazon S3 存储桶配置专用源站身份验证

  2. 确保内容符合可缓存的内容中列出的可缓存性要求。如果您需要添加对象元数据,请参阅 AWS 知识库,例如修改对象元数据

  3. 设置互联网 NEG 时,您需要使用 Amazon S3 存储桶的端点 (FQDN)。如需获取端点信息,请按照 AWS 知识库中提供的说明操作,例如访问存储桶。您还可以从对象的概览页面获取 Amazon S3 端点网址。

创建使用存储桶的主机名的互联网 NEG

为简单起见,此示例使用 FQDN backend.example.com。请务必将其替换为第三方存储桶的 FQDN(可能类似于 http://unique-name-bucket.s3-us-west-1.amazonaws.com/)。

本指南通过一个示例介绍了在外部应用负载均衡器中使用外部后端(有时称为“自定义源站”)的基础知识。外部后端是 Google Cloud 外部的端点。将外部后端与外部应用负载均衡器搭配使用时,您可以使用 Cloud CDN 缓存来提高性能。

本指南逐步说明如何使用启用了 Cloud CDN 的后端服务(作为位于 backend.example.com 的外部后端服务器的代理)来配置全球外部应用负载均衡器。

在此示例中,负载均衡器接受来自客户端的 HTTPS 请求,并作为代理将这些请求以 HTTPS 格式发送到外部后端。此示例假定外部后端支持 HTTPS。

其他选项包括:将负载均衡器配置为接受 HTTP 或 HTTPS 请求,以及在作为代理将请求发送到外部后端时使用 HTTPS。

本指南假定您已经设置负载均衡器,并且要添加新的外部后端。 如需了解详情,请参阅设置具有代管式实例组后端的传统版应用负载均衡器

图 1 展示了一个示例架构。

图 1. 外部后端的 S3 存储桶使用场景。
图 1. 外部后端的 S3 存储桶使用场景。

在该图中,www.example.com 有一个 IP 地址为 120.1.1.1 的负载均衡器前端。如果存在缓存未命中,则系统会通过 HTTPS 从外部后端提取用户对 /cart/id/1223515 的请求。所有其他传入流量都会根据网址映射定向到使用 Compute Engine 虚拟机的 Google Cloud 后端服务或定向到后端存储分区。

准备工作

在按照本指南进行操作之前,请先熟悉以下内容:

权限

为按照本指南进行操作,您需要创建互联网网络端点组 (NEG) 并在项目中创建或修改外部应用负载均衡器。您应该是项目的 Owner 或 Editor,或者应具有下面两个 Compute Engine IAM 角色

任务 所需角色
创建和修改负载均衡器组件 Network Admin
创建和修改 NEG Compute Instance Admin

配置具有外部后端的负载均衡器

本部分介绍如何配置和测试互联网网络端点组。

设置概览

设置互联网 NEG 包括以下操作:

  • 在互联网 NEG 中定义互联网端点。
  • 将互联网 NEG 作为后端添加到后端服务。
  • 通过配置外部应用负载均衡器的网址映射来定义要映射到此后端服务的用户流量。
  • 将必要的 IP 范围列入许可名单。

本示例会创建以下资源:

  • 具有 120.1.1.1 IP 地址的转发规则将传入的请求定向到目标代理。
    • 转发规则的 networkTier 必须是 PREMIUM
  • 目标 HTTP 代理根据网址映射检查每个请求以确定请求的相应后端服务。
    • 对于外部后端,目标代理必须是 TargetHttpProxyTargetHttpsProxy。本示例使用 TargetHttpsProxy
  • 在后端服务上启用 Cloud CDN(可选),将允许从 Cloud CDN 缓存进行响应缓存和传送。
  • 此示例包含自定义标头,这在外部后端需要特定值作为 HTTP 请求的 Host 标头时是必需的。

设置如下所示。

图 2.Cloud CDN 与 Amazon S3 存储桶后端。
图 2. Cloud CDN 与 Amazon S3 存储桶后端。

创建 NEG 和互联网端点

控制台

  1. 在 Google Cloud 控制台中,转到网络端点组页面。

    进入“网络端点组”

  2. 点击创建网络端点组
  3. 输入网络端点组的名称:example-fqdn-neg
  4. 对于网络端点组类型,选择网络端点组(互联网)
  5. 对于默认端口,输入 443
  6. 对于新网络端点,选择完全限定域名和端口
  7. 对于 FQDN,输入 backend.example.com
  8. 对于端口类型,选择默认,并确认端口号443
  9. 点击创建

gcloud

  1. 创建一个互联网 NEG,并将 --network-endpoint-type 设置为 internet-fqdn-port(可通过其访问外部后端的主机名和端口):

    gcloud compute network-endpoint-groups create example-fqdn-neg \
        --network-endpoint-type="internet-fqdn-port" --global
    
  2. 将您的端点添加到该 NEG。如果未指定端口,则端口选择默认为端口 80 (HTTP) 或 443(HTTPS、HTTP/2),具体取决于后端服务中配置的协议。请务必添加 --global 标志。

    gcloud compute network-endpoint-groups update example-fqdn-neg \
        --add-endpoint="fqdn=backend.example.com,port=443" \
        --global
    
  3. 列出所创建的互联网 NEG:

    gcloud compute network-endpoint-groups list --global
    

    输出:

    NAME                LOCATION   ENDPOINT_TYPE        SIZE
    example-fqdn-neg    global     INTERNET_FQDN_PORT   1
    

  4. 列出该 NEG 内的端点:

    gcloud compute network-endpoint-groups list-network-endpoints example-fqdn-neg \
        --global
    

    输出:

    INSTANCE   IP_ADDRESS   PORT   FQDN
                                   backend.example.com
    

将外部后端添加到负载均衡器

以下示例会更新现有负载均衡器。

在现有负载均衡器中,默认服务是 Google Cloud 服务。此示例会通过添加路径匹配器以向与互联网 NEG 关联的 images 后端服务发送对 cart/id/1223515 的所有请求,来修改现有网址映射。

控制台

创建后端服务并添加互联网 NEG

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    进入“负载均衡”

  2. 如需将后端服务添加到现有负载均衡器,请选择您的传统应用负载均衡器,点击 菜单,然后选择修改
  3. 点击后端配置
  4. 后端服务和后端存储桶菜单中,选择创建后端服务
  5. 将后端服务的名称设置为 images
  6. 对于后端类型,选择互联网网络端点组
  7. 选择您要用于从负载均衡器连接到互联网 NEG 的协议。在此示例中,请选择 HTTPS
  8. 新建后端 > 互联网网络端点组下,选择 example-fqdn-neg,然后点击完成
  9. 选择启用 Cloud CDN
  10. 可选:修改缓存模式TTL 设置。
  11. 高级配置自定义请求标头下,点击添加标头
    1. 对于标头名称,输入 Host
    2. 对于标头值,输入 backend.example.com
  12. 点击创建
  13. 保持窗口打开以继续。

将后端服务连接到现有网址映射

  1. 点击主机和路径规则
  2. 右侧列的第一行或前几行包含 Google Cloud 服务,其中一行已填充了主机路径的默认规则 Any unmatched (default)
  3. 确保在右侧列中选择含有 images 的行。如果此行不存在,请点击添加主机和路径规则,然后选择 images。按如下所示填充其他字段:
    1. 主机中输入 *
    2. 路径中输入 /cart/id/1223515

检查并最终确定

  1. 点击检查并最终确定
  2. 比较您的设置与您打算创建的内容。
  3. 如果看起来都正确,请点击更新

gcloud

  1. 为 NEG 创建新的后端服务:

    gcloud compute backend-services create images \
       --global \
       --enable-cdn \
       --cache-mode=CACHE_MODE \
       --protocol=HTTP2
    

    通过将 CACHE_MODE 替换为以下项之一来设置缓存模式

    • CACHE_ALL_STATIC:自动缓存静态内容

    • USE_ORIGIN_HEADERS(默认):要求源站设置有效缓存标头以缓存内容

    • FORCE_CACHE_ALL:缓存所有内容,并忽略 Cache-Control 响应标头中的任何 privateno-storeno-cache 指令

  2. 将此后端服务配置为向请求添加自定义请求标头 Host: backend.example.com

    gcloud compute backend-services update images \
       --custom-request-header "Host: backend.example.com" --global
    
  3. 使用 backend-services add-backend 命令向此后端服务添加互联网 NEG。

    gcloud compute backend-services add-backend images \
      --network-endpoint-group "example-fqdn-neg" \
      --global-network-endpoint-group \
      --global
    
  4. 通过创建新的匹配规则将请求定向到该后端,从而将此新后端服务连接到负载均衡器的网址映射。

    gcloud compute url-maps add-path-matcher EXAMPLE_URL_MAP \
      --default-service=GCP_SERVICE_EXAMPLE \
      --path-matcher-name=CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE \
      --backend-service-path-rules=/CART/ID/1223515=IMAGES
    

    替换以下内容:

    • EXAMPLE_URL_MAP:现有网址映射的名称
    • GCP_SERVICE_EXAMPLE:现有默认后端服务的名称
    • CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE:此新路径规则的名称
    • /CART/ID/1223515:路径
    • IMAGES:连接互联网 NEG 的新后端服务的名称

将必要的 IP 地址范围列入许可名单

如需允许外部应用负载均衡器将请求发送到您的互联网 NEG,您必须使用 dignslookup 等工具查询 _cloud-eoips.googleusercontent.com DNS TXT 记录。

例如,运行以下 dig 命令:

dig TXT _cloud-eoips.googleusercontent.com | grep -Eo 'ip4:[^ ]+' | cut -d':' -f2

输出包含两个 IP 范围,如下所示:

34.96.0.0/20
34.127.192.0/18

请记下 IP 范围并确保您的防火墙或云访问控制列表 (ACL) 允许使用这些范围。

如需了解详情,请参阅对请求进行身份验证

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

创建负载均衡器后,请记好与负载均衡器关联的 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 提供商,请参阅添加、修改和删除记录

测试外部应用负载均衡器

现在您已经配置了负载均衡器,接下来可以开始向负载均衡器的 IP 地址发送流量了。如果您配置了网域,则还可以将流量发送到该域名。不过,DNS 传播可能需要一些时间才能完成,因此您可以先使用 IP 地址进行测试。

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击您刚刚创建的负载均衡器。

  3. 记下负载均衡器的 IP 地址。

  4. 如果您创建了 HTTP 负载均衡器,则可以使用网络浏览器访问 http://IP_ADDRESS 来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。系统会将您定向到 helloworld 服务首页。

    如果您创建了 HTTPS 负载均衡器,则可以使用网络浏览器访问 https://IP_ADDRESS 来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。系统会将您定向到 helloworld 服务首页。

    如果此操作无效并且您使用的是 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态

    或者,您也可以通过本地机器的命令行使用 curl。将 IP_ADDRESS 替换为负载均衡器的 IPv4 地址

    如果您使用的是 Google 管理的证书,请测试指向负载均衡器的 IP 地址的网域。例如:

    curl -s 'https://www.example.com:443' --resolve www.example.com:443:IP_ADDRESS
    

  5. 可选:如果您使用的是自定义网域,则可能需要等待更新后的 DNS 设置传播。然后,在网络浏览器中测试您的网域(例如 backend.example.com)。

    如需获取问题排查方面的帮助,请参阅排查外部后端和互联网 NEG 问题

测试 Cloud CDN

测试 1:直接到达存储分区端点

此测试使用虚拟机中的 timewget 命令。该示例从存储桶 backend.example.com 中下载 /cart/id/1223515/image.jpg

从输出结果中,您可以看到总体请求需要 780 毫秒。您现在可以直接从 Amazon S3 检索 3.3 MB 图片。

time wget backend.example.com/cart/id/1223515/image.jpg
--2020-06-26 18:22:46--  backend.example.com/cart/id/1223515/image.jpg
Resolving backend.example.com (backend.example.com)... 52.219.120.233
Connecting to backend.example.com (backend.example.com)|52.219.120.233|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.47'
/cart/id/1223515/image.jpg.47                                                 100%[==============================================================================================================================================>]   3.29M  6.25MB/s    in 0.5s
2020-06-26 18:22:47 (6.25 MB/s) - '/cart/id/1223515/image.jpg.47' saved [3447106/3447106]
real    0m0.780s
user    0m0.003s
sys     0m0.012s

测试 2:通过 Cloud CDN 的第一个请求

此测试使用负载均衡器的 IP 地址检索 /cart/id/1223515/image.jpg 文件。由于这是第一个请求,因此应该是一个未命中,并且 Cloud CDN 应从源站(即 Amazon S3)提取映像。从输出结果中,您可以看到该请求用时 844 毫秒。

time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:27--  http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.44'
/cart/id/1223515/image.jpg.44                                                 100%[==============================================================================================================================================>]   3.29M  8.23MB/s    in 0.4s
2020-06-26 18:19:28 (8.23 MB/s) - '/cart/id/1223515/image.jpg.44' saved [3447106/3447106]
real    0m0.844s
user    0m0.003s
sys     0m0.012s

测试 3:通过 CDN 的第二个请求

现在我们将使用此负载均衡器 IP 再发出一个请求。这一次,我们应该获得缓存的响应,因此响应速度应该比前两次测试快。

我们再次使用同一 LB IP 地址 LOAD_BALANCER_IP_ADDRESS。从输出中,我们可以看到请求仅用时 18 毫秒。

time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:29--  http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.45'
/cart/id/1223515/image.jpg.45                                                 100%[==============================================================================================================================================>]   3.29M  --.-KB/s    in 0.008s
2020-06-26 18:19:29 (423 MB/s) - '/cart/id/1223515/image.jpg.45' saved [3447106/3447106]
real    0m0.018s
user    0m0.001s
sys     0m0.010s

使用日志进行验证

Cloud CDN 的日志与启用了 Cloud CDN 的后端连接到的外部应用负载均衡器相关联。使用日志,您可以检查请求是命中还是未命中。如需详细了解 Cloud CDN 日志,请参阅查看日志

限制

  • 第三方存储桶和对象必须是公开的。或者,如果您配置专用源站身份验证,则可以将您的存储桶和对象设为不公开。外部后端不支持其他内容身份验证方法,例如签名网址或签名 Cookie。

  • 如果使用的外部后端服务需要特定值作为 HTTP 请求的 Host 标头,则必须配置后端服务以将 Host 标头设置为该预期值。如果您未配置自定义请求标头,则后端服务会保留客户端用于连接到 Google Cloud 外部应用负载均衡器的 Host 标头。如需了解有关自定义标头的一般信息,请参阅配置自定义请求标头。如需查看具体示例,请参阅配置具有外部后端的负载均衡器

后续步骤