我正在尝试在Django应用程序中的AWS S3存储桶中设置媒体和静态文件存储,当我尝试运行python manage.py collectstatic
将静态文件放入存储桶时,我收到以下错误:
botocore.exceptions.ClientError:调用PutObject操作时发生错误(AccessDenied):拒绝访问
我正在运行boto3和django存储。我已经在这里搜索了其他答案并首先在那里尝试了这些想法。我的访问密钥等是正确的,因为我可以连接到SES OK。我在桶中配置了CORS。
我的存储桶政策是
{
"Id": "Policyxxx",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmtxxx",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname/*",
"arn:aws:s3:::bucketname"
],
"Principal": {
"AWS": [
"arn:aws:iam::xxxx:user/xxxx"
]
}
}
]
}
我的IAM用户拥有AmazonS3FullAccess,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
我还尝试创建自己的策略并将其附加到IAM用户,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketname",
"arn:aws:s3:::bucketname/*"
]
}
]
}
这些都不起作用,所以我显然遗漏了一些东西。
答案 0 :(得分:14)
我有同样的错误。而且,与您不同的是,我使用具有适当IAM策略的合适用户。
在:
的输出中python manage.py collectstatic
在AccessDenied堆栈错误之前,我可以从django-storage
lib读取此消息:
UserWarning:S3Boto3Storage的默认行为不安全,并且在django-storages 2.0中会更改。默认情况下,文件和新存储区的ACL为“公开读取”(全球公开可读)。 2.0版将默认使用存储桶的ACL。要选择新行为,请设置AWS_DEFAULT_ACL = None,否则,要使此警告静音,请显式设置AWS_DEFAULT_ACL。 “ S3Boto3Storage的默认行为是不安全的,并且会更改”。
这使我尝试了。
通过设置:
AWS_DEFAULT_ACL = None
然后,将静态文件收集到存储桶中。
答案 1 :(得分:1)
要允许django-admin.py collectstatic自动将静态文件放入存储桶,请在settings.py中设置以下内容:
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
此外,验证您的S3存储桶和密钥是否已正确配置: 查看示例 - https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html