Amazon S3 + CloudFront 查询特定版本的存储文件

Posted

技术标签:

【中文标题】Amazon S3 + CloudFront 查询特定版本的存储文件【英文标题】:Amazon S3 + CloudFront query for specific version of stored file 【发布时间】:2015-06-10 02:46:20 【问题描述】:

我创建了一个具有版本控制功能的新 S3 存储桶,并在我的云端发行版上打开了“转发查询字符串”。

我知道您可以通过将 versionId 作为查询字符串发送来访问不同的对象版本。

这如何与云端和签名网址一起使用?

如果我想返回一个特定版本的文件,我是否必须使用附加的查询字符串对 url 进行签名,例如:

http://example.cloudfront.net/files/file.pdf?verisonId=[id]

好吧,我尝试将 url 与 versionId 一起签名 - 它不起作用。 仅对 url 进行签名,然后在稍后附加 versionId 会给出拒绝访问响应。

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>89F25EB47DDA64D5</RequestId>
<HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

任何帮助将不胜感激。

【问题讨论】:

“它不起作用” ...你能说得更具体些吗? 【参考方案1】:

您需要设置正确的 ACL 以允许您的 CloudFront 规范 ID 访问版本化对象,或者您需要设置 bucket policy that allows the action "s3:GetObjectVersion"。您可能只有 GetObject 允许您通过 CloudFront 检索普通对象,但不能检索 ?versionId= 对象。

添加类似于以下内容的存储桶策略:


     "Version":"2012-10-17",
     "Id": "PolicyForCloudFrontPrivateContent",
     "Statement": [
          "Action": ["s3:GetObject", "s3:GetObjectVersion" ],
          "Effect": "Allow",
          "Principal":"CanonicalUser":"<CLOUDFRONT CANONICAL ID>",
          "Resource": "<BUCKET RESOURCE IDENTIFIER>",
          "Sid": "Grant a CloudFront Origin Identity access to support private content and versioned content."
     ]

【讨论】:

这是正确答案,但是我继续收到拒绝访问,直到我使 CloudFront 缓存无效。

以上是关于Amazon S3 + CloudFront 查询特定版本的存储文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要 Amazon S3 和 Cloudfront?

Amazon S3 是不是向 CloudFront 发送失效信号?

Amazon S3 Cloudfront 部署最佳实践

使用 Amazon S3 和 Cloudfront 的 CORS

Amazon S3 重定向和 Cloudfront

Gzip 与 Amazon S3/Cloudfront 失败