AWS S3:为什么公共对象不能与版本控制一起使用?

Pra*_*tik 2 amazon-s3 amazon-web-services

我已上传该对象并将其在我的存储桶下标记为公共。当我单击时,Object URL我可以在浏览器上看到它(可公开访问)。

然后我在 s3 存储桶级别启用了版本控制,然后更改了对象中的内容并将其再次上传到同一存储桶。版本控制效果很好,我可以看到同一对象的两个不同版本。然而,公共访问则不然。当我点击新的时Object's URL,它说访问被拒绝

这种行为背后有什么具体原因,或者这是 S3 的已知问题,或者我正在做一些不符合标准做法的事情?

Erv*_*gyi 5

如果您启用了版本控制并且想要查看存储桶中文件的特定版本,则必须GetObjectVersion在存储桶策略中添加权限。存储桶策略应如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果公共 URL 包含查询参数,则此策略将允许打开您的versionId存储桶中的文件:

https://my-bucket-123456789.s3.amazonaws.com/file3.json?versionId=RXbjBh8SzW9RpEsxX.xzkYb1RTK4pjwF
Run Code Online (Sandbox Code Playgroud)

如果您的公共 URL 中没有versionId,即使您没有GetObjectVersion向策略添加权限,它也应该可以工作。在这种情况下,它将打开最新版本。

请注意,此答案假设存储桶未启用访问控制列表 (ACL),并期望每个对象的所有权设置为Bucket owner enforced