Django配置AWS S3存储执行collectstatic遇PutObject权限拒绝错误
解决Django collectstatic至AWS S3时的AccessDenied错误
我之前配置Django + S3时也踩过这个一模一样的坑,结合实际排查经验,给你几个关键方向逐一排查:
1. 检查S3存储桶的Bucket Policy权限
很多时候问题出在存储桶本身没有给指定IAM用户开放写入权限。你可以在S3控制台的存储桶「权限」→「Bucket Policy」里添加类似以下的配置(替换成你的IAM用户ARN和存储桶名称):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:user/你的IAM用户名" }, "Action": [ "s3:PutObject", "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::你的存储桶名称", "arn:aws:s3:::你的存储桶名称/*" ] } ] }
另外还要确认存储桶的「Block Public Access」设置:如果开启了「Block all public access」,要确保你的IAM用户权限足够覆盖写入操作,优先用IAM权限控制而非开放公共访问。
2. 验证IAM用户的权限配置
即使你确认访问密钥正确,IAM用户可能没有被授予足够的S3操作权限。进入IAM控制台找到该用户,检查其附加的权限策略,确保包含以下关键操作:
s3:PutObject(上传文件的核心权限)s3:ListBucket(collectstatic需要这个来检查桶内已存在的文件)s3:GetObject(可选,用于读取已上传的静态文件)
示例IAM权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DjangoStaticMediaAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::你的存储桶名称", "arn:aws:s3:::你的存储桶名称/static/*", "arn:aws:s3:::你的存储桶名称/media/*" ] } ] }
3. 核对Django settings.py的配置细节
几个容易被忽略的配置点:
- 确认
STATICFILES_STORAGE和DEFAULT_FILE_STORAGE是否正确设置为storages.backends.s3boto3.S3Boto3Storage(django-storages v2+版本的标准配置) - 如果设置了
AWS_LOCATION(比如指定静态文件存到static前缀下),要确保IAM权限里的Resource包含该前缀路径(如上面示例的static/*) - 检查
AWS_S3_REGION_NAME是否和存储桶所在区域完全一致,区域不匹配也会导致权限验证失败 - 建议用环境变量加载凭证,避免硬编码的同时防止配置错误:
import os AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
4. 排查凭证缓存或环境变量冲突
有时候本地的boto3凭证缓存会干扰当前配置:
- 检查
~/.aws/credentials文件里是否有旧的凭证条目,暂时删除或注释掉,再重新执行collectstatic - 确认终端环境里的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY是否正确,有没有被其他环境变量覆盖(可以用echo $AWS_ACCESS_KEY_ID快速验证)
如果以上步骤都试过还是不行,可以用boto3单独测试上传,排除Django的影响:
import boto3 s3 = boto3.client('s3', aws_access_key_id='你的密钥', aws_secret_access_key='你的密钥') s3.put_object(Bucket='你的存储桶名称', Key='test.txt', Body='test content')
如果这个测试也报错,那问题肯定在AWS的权限配置上;如果测试成功,再回到Django的配置细节逐一排查。
内容的提问来源于stack exchange,提问作者pasta1020
相关产品推荐
相关产品推荐

