部署在EC2的Django图库调用S3 PutObject时出现AccessDenied错误求助
问题排查与解决方案
针对你部署在EC2上的Django图库网站上传图片到S3时出现的PutObject AccessDenied错误,按以下步骤逐一排查:
1. 验证EC2上的身份凭证是否生效
- 如果EC2实例使用IAM实例角色而非硬编码密钥:确认实例角色已附加
AmazonS3FullAccess权限,且Django配置中未硬编码其他IAM用户的密钥(避免冲突)。 - 如果使用IAM用户密钥:在EC2终端执行
aws configure list检查当前生效的密钥是否正确,同时确认Django的settings.py中AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY配置与预期一致,且未被~/.aws/credentials文件或环境变量覆盖。 - 直接用AWS CLI测试权限:在EC2上创建一个测试文件,执行
aws s3 cp test.txt s3://photoshare20230619/test.txt,如果同样报错,说明是身份/权限问题;如果成功,问题出在Django配置。
2. 修正S3 Bucket权限配置
- 补充Bucket策略的写入权限:当前Bucket策略仅允许公共读(
s3:GetObject),虽然IAM用户有AmazonS3FullAccess,但可添加写入权限的策略确保兼容性:
{ "Version": "2008-10-17", "Statement": [ { "Sid": "AllowPublicRead", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::photoshare20230619/*" }, { "Sid": "AllowIAMUserWrite", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:user/你的IAM用户名" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::photoshare20230619/*" } ] }
- 检查Bucket的Block Public Access设置:确保未开启
Block all public access(如果需要公开访问图片),IAM用户的操作不受公共访问限制,但若Bucket ACL设置为私有,需确认PutObject时的ACL配置。
3. 检查Django的S3存储配置
- 确认
settings.py中的关键配置:AWS_STORAGE_BUCKET_NAME是否为photoshare20230619AWS_S3_REGION_NAME是否正确(如us-east-1)AWS_S3_SIGNATURE_VERSION设置为s3v4(避免区域兼容问题)AWS_DEFAULT_ACL设置合理:若需公开访问图片设为public-read,若私有则设为private
- 确认部署时加载的是生产环境配置,而非本地配置(比如是否通过
DJANGO_SETTINGS_MODULE指定了正确的settings文件)。
4. 排查上层权限限制
- 检查AWS组织的服务控制策略(SCP):如果你的账号属于AWS组织,确认SCP未限制
S3:PutObject操作。 - 检查IAM用户的权限边界:若IAM用户设置了权限边界,确认边界允许
S3:PutObject操作。
内容的提问来源于stack exchange,提问作者Chloro
相关产品推荐
相关产品推荐

