AWS S3桶已配置公共访问策略,但部分对象仍无法公开访问
S3桶公共策略生效但部分文件访问被拒绝的问题排查与解决
问题概述
现有AWS S3桶cancon已配置公开读取的桶策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::cancon/*" } ] }
桶内多数旧文件可正常公开访问,但新上传的文件(如static/img/star_half.svg)访问时返回AccessDenied错误:
<Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>EJ8K3ZG143FAHD3X</RequestId> <HostId>QLVfJC56e0elbw7HbLMZ7J8zrfg1H/CxhP2Qtz/prV5TozEjavkb4ciXZxV8F2oRBENti9V72Q8=</HostId> </Error> > 注:旧文件使用区域Endpoint(如`s3.eu-central-1.amazonaws.com`)可正常访问,新文件使用全局Endpoint(`s3.amazonaws.com`)报错;且控制台新上传文件默认无法访问。 ## 可能原因及解决方法 ### 1. 公共访问阻止(Public Access Block)未完全关闭 S3的公共访问阻止设置若开启特定选项,会直接覆盖桶策略的公共访问授权,即使策略配置正确也无法生效。 **解决步骤**: - 登录AWS S3控制台,进入`cancon`桶的「权限」标签页 - 找到「公共访问设置」模块,点击「编辑」 - 取消勾选以下全部四个选项,保存更改: - Block public access to buckets and objects granted through any access control lists (ACLs) - Block public access to buckets and objects granted through new access control lists (ACLs) - Block public access to buckets and objects granted through bucket policies - Block public and cross-account access to buckets and objects if bucket policies allow public access ### 2. 对象ACL为私有且未适配桶策略 S3控制台默认上传文件的ACL为「私有」,若对象所有者与桶所有者不一致(如跨账号上传),私有ACL会限制公共访问,桶策略可能无法直接覆盖。 **解决步骤**: #### 单文件修复: - 在S3控制台找到无法访问的对象,进入「权限」标签页 - 编辑「访问控制列表(ACL)」,添加规则:授予「所有人(Everyone)」「读取」权限,保存更改 #### 批量修复(使用AWS CLI): ```bash # 批量修改指定前缀下的所有对象ACL为公共读取 aws s3 cp s3://cancon/static/img/ s3://cancon/static/img/ --recursive --acl public-read --metadata-directive REPLACE
3. 上传时未配置公共ACL
新文件上传时若未明确设置公共读取ACL,即使桶策略允许,也可能因默认私有ACL导致访问异常(尤其受公共访问阻止设置影响时)。
解决步骤:
- 控制台上传文件时,在「设置」-「权限」中,将「ACL」设置为「授予公共读取访问权限」
- 若使用脚本/SDK上传,需在上传参数中指定
ACL='public-read'
4. Endpoint区域不匹配
旧文件使用区域特定Endpoint(如eu-central-1)可访问,新文件使用全局Endpoint(s3.amazonaws.com)报错,说明桶实际位于eu-central-1区域,全局Endpoint会因区域不匹配触发权限拦截。
解决步骤:
- 查看桶的实际区域:进入桶的「属性」标签页,查看「区域」字段
- 统一使用区域特定Endpoint访问文件,例如:
https://cancon.s3.eu-central-1.amazonaws.com/static/img/star_half.svg - 配置Web应用时,将静态资源地址替换为对应区域的S3 Endpoint
内容的提问来源于stack exchange,提问作者Jekson
相关产品推荐
相关产品推荐

