AWS S3和Django在调用PutObject操作时返回“发生错误(AccessDenied)”

时间:2018-02-10 15:27:44

标签: django amazon-web-services amazon-s3

我正在尝试在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/*"
        ]
    }
]
}

这些都不起作用,所以我显然遗漏了一些东西。

2 个答案:

答案 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