从Amazon S3删除对象时遭遇Access Denied权限错误求助
解决S3删除对象时的Access Denied错误
你上传操作正常但删除报错,虽然IAM权限配置了s3:*,但还是有几个常见原因可以排查:
1. 检查S3桶的桶策略
桶策略的优先级高于IAM权限,如果桶策略里存在Deny DeleteObject的规则,哪怕IAM给了允许权限也会失效。
- 登录S3控制台,找到目标桶,进入「权限」→「桶策略」
- 排查是否存在类似规则:
{ "Effect": "Deny", "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::your-bucket-name/*", "Principal": "*" }
如果有,删除该拒绝规则或调整Principal的适用范围。
2. 检查桶是否开启了版本控制
如果S3桶开启了版本控制,调用DeleteObject只会给对象添加删除标记,而非真正删除对象。这种场景下,可能需要额外权限或调整操作逻辑:
- 进入桶的「属性」→「版本控制」查看状态
- 若开启了版本控制,要么关闭版本控制(谨慎操作,会永久删除历史版本),要么给IAM角色添加
s3:DeleteObjectVersion权限:
{ "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*", "s3:DeleteObjectVersion" ], "Resource": "*" }
3. 检查对象的存储类与对象锁
- 如果对象存储在冰川(Glacier)或智能分层的归档层,这类对象处于冻结状态,无法直接删除,需要先恢复到可访问状态
- 确认对象是否开启了对象锁(WORM保护),锁过期前无法执行删除操作
4. Django Storages配置与对象路径检查
- 显式配置桶名,避免潜在的桶匹配问题,在
settings.py添加:
AWS_STORAGE_BUCKET_NAME = "你的桶名称"
- 确认
old_logo对应的对象路径是否正确,S3会对不存在的对象返回Access Denied(安全策略),可能是路径错误导致的假权限报错
5. 验证IAM权限的实际生效
确认当前使用的IAM角色/用户确实关联了配置的策略,避免用错凭证。可以用AWS CLI直接测试:
aws s3 rm s3://你的桶名称/对象的完整路径.jpg
如果CLI执行成功,问题出在Django代码或storages库;如果也报错,回到IAM和桶策略继续排查。
内容的提问来源于stack exchange,提问作者Axlic
相关产品推荐
相关产品推荐

