从 Amazon S3 进行的转移可以使用 Amazon CloudFront 分发作为出站路径。
与直接从 S3 传输数据相比,通过 CloudFront 传输数据可能会降低 AWS 出站流量费用。如需了解详情,请参阅 CloudFront 价格和 S3 出站流量费用。
使用 CloudFront 作为出站路径不会将您的 S3 对象公开。请参阅使用 CloudFront 是否会将我的对象公开?
概览
如需通过 CloudFront 传输 S3 数据,您必须按照以下步骤操作:
配置 IAM 权限
请按照无代理转移权限中的说明授予所需的 Google Cloud 权限。
配置对 S3 存储桶的访问权限
按照“配置对来源的访问权限:Amazon S3”中的说明配置对 Amazon S3 中数据的访问权限。
为 S3 存储桶创建 CloudFront 发行版
- 在您的 AWS 账号中,前往 CloudFront。
- 点击创建 CloudFront 分发网络。
- 在来源网域下,选择您的 S3 存储桶。
- 来源路径必须留空。
- 接受自动填充的来源名称,或指定您自己的值。
- 在来源访问权限部分,选择“公开”。此操作不会将您的存储桶设为公开;它指示 CloudFront 不应配置访问机制。
- 在缓存键和来源请求部分中:
- 对于缓存政策,请选择“CachingDisabled”。这样可以防止 CloudFront 缓存请求并将其提供给未经身份验证的观看者。
- 对于来源请求政策,请选择“AllViewerExceptHostHeader”。这允许 CloudFront 将身份验证标头转发到 S3,以便 Storage Transfer Service 可以使用安全凭据访问您的存储桶。
- 在Web 应用防火墙 (WAF) 部分,选择“不启用”。
- (可选)选择价格类别。Storage Transfer Service 根据来源存储桶所在的区域选择工作器池,因此该区域会产生 CloudFront 费用。若要获取最低价格,请确保您的来源存储桶位于美国或欧洲,或者选择“仅使用北美和欧洲”作为 CloudFront 中的 Price 类。
点击创建 CloudFront 分发。
成功创建后,系统会显示 CloudFront 分发详情页面。
记下分发域名。例如
https://dy1h2n3l4ob56.cloudfront.net
。如果详情页面中未在分发网域名前面添加https://
协议,您需要在创建转移作业时自行添加。
创建转移作业
Google Cloud 控制台和 REST API 支持通过 CloudFront 发行版进行转移。
请勿在转移作业名称中包含敏感信息,例如个人身份信息 (PII) 或安全数据。资源名称可能会传播到其他资源的名称,并且可能会向您项目之外的 Google 内部系统公开。 Google Cloud如需使用 Google Cloud 控制台创建转移作业,请按照说明创建转移作业。
当系统提示您输入 CloudFront 网域时,请输入您在上一部分中记下的分发网域名称。您也可以在 Amazon Web Services 控制台的 CloudFront 部分找到此值。其格式为 https://dy1h2n3l4ob56.cloudfront.net
。
如需使用 REST API 创建转移作业,请按照创建转移作业页面上的示例操作。
将分发域名指定为 transferSpec.awsS3DataSource.cloudfrontDomain
字段的值:
"transferSpec": {
"awsS3DataSource": {
"bucketName": "AWS_SOURCE_NAME",
"cloudfrontDomain": "https://dy1h2n3l4ob56.cloudfront.net",
"awsAccessKey": {
"accessKeyId": "AWS_ACCESS_KEY_ID",
"secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}
},
...
}
常见问题解答
使用 CloudFront 是否会将我的对象公开?
不会。如果您按照本页上的配置步骤操作,您的对象不会向公众公开。
- CloudFront 没有直接访问您的 S3 对象的权限。
- 如果用户尝试直接或通过 CloudFront(如果您的存储分区是私有的)访问您的对象,则会收到
permission denied
错误。 - Storage Transfer Service 会使用您在转移作业中提供的凭据对发送给 CloudFront 的请求进行签名,这样我们就可以安全地下载您的对象,就像直接从 S3 下载一样。之所以有效,是因为标头转发设置
AllViewerExceptHostHeader
。