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

pas*_*020 5 django amazon-s3 amazon-web-services

我正在尝试在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"
            ]
        }
    }
]
}
Run Code Online (Sandbox Code Playgroud)

我的IAM用户拥有AmazonS3FullAccess,如下所示:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "*"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

我还尝试创建自己的策略并将其附加到IAM用户,如下所示:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
]
}
Run Code Online (Sandbox Code Playgroud)

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

sto*_*sky 24

我有同样的错误.并且,与您不同,我使用正确的用户使用适当的IAM策略.

在输出中:

python manage.py collectstatic 
Run Code Online (Sandbox Code Playgroud)

在AccessDenied堆栈错误之前,我可以从django-storagelib 读取此消息:

UserWarning:S3Boto3Storage的默认行为是不安全的,将在django-storages 2.0中更改.默认情况下,文件和新存储桶使用"公共读取"(全局公开可读)的ACL保存.2.0版将默认使用存储桶的ACL.要选择加入新行为集AWS_DEFAULT_ACL = None,否则要将此警告静音,请显式设置AWS_DEFAULT_ACL."S3Boto3Storage的默认行为是不安全的,将会改变"

这让我尝试了.

通过设置 :

AWS_DEFAULT_ACL = None
Run Code Online (Sandbox Code Playgroud)

然后,在存储桶中收集静态文件.

  • 你是救生员。它没有向我显示此警告,而是按照一些教程进行操作,并被卡在此错误中。 (2认同)
  • 我认为这是因为默认情况下,AWS 将“阻止新的公共 ACL 和上传公共对象”设置为新存储桶的 True。如果您在权限选项卡中将其设置为 `False`,您应该能够设置 `AWS_DEFAULT_ACL='public-read'` (2认同)
  • 如果您确定存储桶中的哪些内容应该公开。将 s3 块的权限从“打开”更改为“关闭”(阻止所有公共访问)。所以 `AWS_DEFAULT_ACL = 'public-read'` (2认同)