Google Cloud CDN回源GCS私有桶

作者:MeshCloud脉时云公有云架构师 许多杰

引言

私有源身份验证为 Cloud CDN 提供了对私有 Google Cloud Storage 存储桶的长期资源访问权限。使用私有来源可防止客户端绕过 Cloud CDN 并直接访问GCS Bucket,具有全局外部 HTTP(S) 负载平衡器或全局外部 HTTP(S) 负载平衡器(经典)的 Cloud CDN 支持此功能。

整体架构

技术简介

在使用Cloud Storage私有桶的情况下,Cloud CDN无法获取GCS的资源,需要开启Google Cloud CDN回源认证,通过认证后就可以获取GCS的私有桶的资源,同时可以避免公开GCS的对外访问权限。

本产品或功能受 Google Cloud 服务条款的正式发布前产品条款的约束。 正式发布前产品和功能可能受到有限支持,并且对正式发布前产品和功能的更改可能不兼容其他正式发布前版本。 如需了解详情,请参阅发布阶段说明。

目标

通过AK/AS给Google Cloud CDN进行授权,使其可以回源到无公开访问权限的GCS存储桶获取资源。客户端可以正常访问Cloud CDN,但是无权限直接访问GCS。

准备工作

在使用私有源身份验证之前,请执行以下操作:

  • 获取 GCS 存储桶的 Access Key 和 Access Secret。详细步骤,请参阅 https://cloud.google.com/storage/docs/authentication/managing-hmackeys?hl=zh-cn#create
  • 如有必要,请更新到最新版本的 Google Cloud CLI:
gcloud components update

实施步骤

配置GCS Bucket访问凭证

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。
  2. 进入“存储桶”,点击设置
  3. 选择互操作性标签页,点击 + 为用户帐号创建密钥
  4. 点击创建密钥
  5. 添加访问密钥,保存AK/SK

添加访问密钥,保存AK/SK

配置外部源站NEG

Compute Engine > Network endpoint group > Create a network endpoint group

  • 选择互联网NEG(Network endpoint group (Internet))
  • 填写GCS存储桶的域名及端口(或默认)

如Bucket名称为:my-bucket ,这里可以可以填写域名
my-bucket.storage.googleapis.com

配置LB CDN

后端选择上面配置的GCS ENG,其他按照正常配置即可。

导出后端YAML

将后端服务的配置导出到文件

gcloud compute backend-services export NAME --destination=<path-to-file> --global

NAME:要导出的后端服务的名称
--destination=DESTINATION :将导出配置的 YAML 文件的路径
--global:如果设置,后端服务是全局的

示例:
gcloud compute backend-services export  my-gcs-backend --destination=./BackendService.yaml --global

添加认证:securitySettings 通过在以下部分指定这些额外的配置选项,使用签名版本 4 验证您的后端请求backendServices

securitySettings:
  awsV4Authentication:
    accessKeyId: ACCESS_KEY_ID
    accessKey: ACCESS_KEY
    accessKeyVersion: ACCESS_KEY_VERSION
    originRegion: REGION
...]

替换以下内容:

  • ACCESS_KEY_ID:访问密钥的唯一ID
  • ACCESS_KEY: 用于身份验证的访问密钥
  • ACCESS_KEY_VERSION(可选):您可以设置的唯一名称来表示密钥版本,例如:prod-access-key-v1.2
  • REGION:Cloud Storage Bucket区域

添加认证后配置yaml示例:(在导出的yaml文件增加securitySettings部分)

affinityCookieTtlSec: 0
backends:
- balancingMode: UTILIZATION
  capacityScaler: 1.0
  group: https://www.googleapis.com/compute/v1/projects/xdj-project/global/networkEndpointGroups/bucket-neg
cdnPolicy:
  cacheKeyPolicy:
    includeHost: true
    includeProtocol: true
    includeQueryString: true
  cacheMode: CACHE_ALL_STATIC
  clientTtl: 3600
  defaultTtl: 3600
  maxTtl: 86400
  negativeCaching: false
  requestCoalescing: true
  serveWhileStale: 0
  signedUrlCacheMaxAgeSec: 0
connectionDraining:
  drainingTimeoutSec: 0
creationTimestamp: '2023-01-28T23:10:07.869-08:00'
customRequestHeaders:
- Host:instance-cdn-gcs-bucket.storage.googleapis.com
description: ''
enableCDN: true
kind: compute#backendService
loadBalancingScheme: EXTERNAL
logConfig:
  enable: true
  sampleRate: 1.0
name: bucket-neg
port: 80
portName: http
protocol: HTTP
selfLink: https://www.googleapis.com/compute/v1/projects/xdj-project/global/backendServices/bucket-neg
sessionAffinity: NONE
timeoutSec: 30
securitySettings:
  awsV4Authentication:
    accessKeyId: GOOG****FFY77
    accessKey: yuin3fy+4nDpX****
    accessKeyVersion: prod-access-key-v1.2
    originRegion: us-central1

导入新的YAML

gcloud compute backend-services import NAME --source=<path-to-file> --global

NAME:要导入的后端服务的名称
--source=SOURCE :将导入配置的YAML文件的路径
--global:如果设置,后端服务是全局的

示例:
gcloud beta compute backend-services import  my-gcs-backend --source=./BackendService.yaml --global

测试验证

通过公网访问GCS链接为403,拒接访问。

通过Google CDN认证之后返回200,正常。

常见问题

  1. GCS Bucket以 Backend Service 的方式配置为LB、Cloud CDN的后端,产生的回源流量可以记为Google Cloud 内的网络出站流量吗?

–不可以。在这种配置下是通过外部网络通信,产生的流量是常规网络(Internet)出站流量。常规网络费用可以参考:
https://cloud.google.com/cdn/pricing?hl=zh-cn

  1. 配置生效时间是多少?

–将yaml文件导入Backend Service配置中后,需要5-10分钟生效。

  1. 配置完成后,请求CDN依然返回403无权限访问,会是什么情况?

–常见原因是使用的AK/AS不匹配、yaml文件未成功导入。

发表评论

您的电子邮箱地址不会被公开。