Google CDN回源S3私有桶

作者:MeshCloud脉时云公有云架构师王明立

引言

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

整体架构

技术简介

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

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

目标

使用无公开访问的S3存储桶,Google Cloud CDN可以获取到S3的资源。

准备工作

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

  • 获取您的 Amazon S3 存储桶或其他兼容对象存储的访问密钥和访问密钥 ID。有关 Amazon S3 的详细步骤,请参阅 使用您的 AWS 凭证访问 AWS:编程访问。
  • 如有必要,请更新到最新版本的 Google Cloud CLI:
gcloud components update

实施步骤

配置AWS访问凭证

IAM > 用户 > 创建用户

添加策略,最小只读权限

添加访问密钥

配置完成 ,保存AK/SK

配置外部源站NEG

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

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

配置LB

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

导出后端YAML

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

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

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

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

添加认证:securitySettings 通过在以下部分指定这些额外的配置选项,使用 AWS 签名版本 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(可选):您可以设置的唯一名称来表示密钥版本
  • REGION:您的存储提供商的有效区域;不是 Google Cloud 区域

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

affinityCookieTtlSec: 0
backends:
- balancingMode: UTILIZATION
  capacityScaler: 1.0
  group: https://www.googleapis.com/compute/v1/projects/spoton-project/global/networkEndpointGroups/s3-neg
cdnPolicy:
  cacheKeyPolicy:
    includeHost: true
    includeProtocol: true
    includeQueryString: true
  cacheMode: FORCE_CACHE_ALL
  clientTtl: 300
  defaultTtl: 2592000
  negativeCaching: false
  requestCoalescing: true
  serveWhileStale: 0
connectionDraining:
  drainingTimeoutSec: 0
creationTimestamp: '2023-01-03T18:37:08.738-08:00'
customRequestHeaders:
- host:cdn-xxxx-s3.s3.amazonaws.com
description: ''
enableCDN: true
kind: compute#backendService
loadBalancingScheme: EXTERNAL
logConfig:
  enable: true
  sampleRate: 1.0
name: cdn-s3-backend
port: 80
portName: http
protocol: HTTP
selfLink: https://www.googleapis.com/compute/v1/projects/xxxx-project/global/backendServices/cdn-s3-backend
sessionAffinity: NONE
timeoutSec: 30
securitySettings:
  awsV4Authentication:
    accessKeyId: AKIARD******75Y4TEI
    accessKey: uHKcjCSQZXk1rY******yIO05flfP8W
    accessKeyVersion: prod-access-key-v1.2
    originRegion: us-east-1

导入新的YAML

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

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

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

导入成功后等待几分钟即可生效,只需导入一次后续修改配置可以直接在界面修改。

测试验证

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

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

常见问题

1.导入完成后测试还是无法访问?

导入配置后需要等5-10分钟生效,后如果还不可以请确认下AS/SK是否正确及权限是否正确。

发表评论

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