使用Boto3上传S3对象调用PutObject返回AccessDenied错误如何解决
S3上传返回AccessDenied问题排查与解决方案
核心原因
你遇到的报错核心触发点是S3的公开访问拦截规则优先级高于IAM权限:你的代码上传时指定了"ACL": "public-read"参数,但当前AWS账号的目标存储桶/全局S3配置开启了「阻止公开访问(Block Public Access)」规则,就算使用根账号操作也会被直接拦截,完全符合你测试时的现象。
具体排查步骤
- 首先检查目标存储桶的阻止公开访问配置:进入S3控制台打开对应存储桶,切换到「权限」标签找到「阻止公开访问(桶设置)」项,只要开启了「阻止新的公开ACL和上传公开的对象」选项,上传时指定公开类ACL就会直接返回AccessDenied。
- 其次检查账号全局S3阻止公开访问配置:进入S3控制台总览页面的全局设置,查看「阻止公开访问(账户设置)」,如果全局开启了拦截规则,账号下所有存储桶都会受影响。
- 额外排查组织级限制:如果你的账号归属于AWS Organizations组织,检查上层是否配置了限制S3公开操作、或限制指定区域S3访问的SCP(服务控制策略),该类策略优先级高于账号内的权限配置。
- 快速验证方法:注释掉代码
extra_args中的"ACL": "public-read"行后重试上传,如果可以正常上传即可100%确认是公开访问拦截导致的问题。
修复方案
- 若业务需要上传的对象为公开访问权限:关闭对应存储桶/账号级阻止公开访问配置中,拦截公开ACL的对应选项即可。
- 若业务不需要对象公开:直接删除代码中的
ACL参数即可,默认上传的对象为私有权限,不会触发拦截规则。
内容的提问来源于stack exchange,提问作者Mehdi Khlifi
相关产品推荐
相关产品推荐

