AWS S3带public=yes标签的版本化对象历史版本无法公开访问咨询
问题解答
这是配置遗漏导致的问题,不属于S3的预期行为,调整桶策略即可解决。
核心原因
S3针对对象的不同版本,对应了两个不同的权限控制动作:
- 读取对象最新版本需要的权限是
s3:GetObject,也就是你当前策略里已经配置的项 - 读取对象的历史非最新版本需要额外配置
s3:GetObjectVersion权限
你已经给所有对象版本都打上了public=yes的标签,标签规则是生效的,只是没有给公开用户开放历史版本的读取权限,所以才会出现只有最新版本能访问的情况。
修正后的桶策略
把策略里的Action字段修改为数组,同时包含两个权限动作即可,其余配置不需要改动:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject", "s3:GetObjectVersion"], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/public": "yes" } } } ] }
额外注意事项
- 桶策略修改后最多会有2分钟左右的生效延迟,修改后可以稍等再测试
- 访问历史版本时需要在请求里携带对应版本的
versionId参数,否则S3默认会返回对象的最新版本
内容的提问来源于stack exchange,提问作者rosysnake
相关产品推荐
相关产品推荐

