从 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 Cloud 资源的名称,并且可能会向您项目之外的 Google 内部系统公开。Google Cloud 控制台
如需使用 Google Cloud 控制台创建转移作业,请按照说明创建转移作业。
当系统提示您输入 CloudFront 网域时,请输入您在上一部分中记下的分发网域名称。您也可以在 Amazon Web Services 控制台的 CloudFront 部分找到此值。其格式为 https://dy1h2n3l4ob56.cloudfront.net
。
REST API
如需使用 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
。