[Django] [AWS S3] botocore.exceptions.clienterror调用PutObject操作时发生错误(拒绝访问)

时间:2019-02-20 14:46:52

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

我正在尝试将Django项目连接到AWS S3。

settings.py包含以下内容:

AWS_ACCESS_KEY_ID = #ID
AWS_SECRET_ACCESS_KEY = #Key
AWS_STORAGE_BUCKET_NAME = #Bucket
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'backend/static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

IAM用户是使用AmazonS3FullAccess创建的。 但是当我输入:

python manage.py collectstatic

发生错误:

  

您已请求在目标位置收集静态文件       设置中指定的位置。

     

这将覆盖现有文件!     您确定要这样做吗?

     

输入“是”继续,或输入“否”取消:是     追溯(最近一次通话):      在第22行的文件“ manage.py”中           execute_from_command_line(sys.argv)     文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/init.py”,   第381行,在execute_from_command_line中           utility.execute()         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/init.py”,   行375,在执行           self.fetch_command(子命令).run_from_argv(self.argv)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/base.py”,   第316行,位于run_from_argv中           self.execute(* args,** cmd_options)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/base.py”,   第353行,在执行中           输出= self.handle(* args,** options)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py”,   188号线,在手柄中           收集= self.collect()         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py”,   收集中的第114行           处理程序(路径,prefixed_pa​​th,存储)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py”,   第353行,在copy_file中           self.storage.save(前缀路径,源文件)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/files/storage.py”,   第49行,保存           返回self._save(名称,内容)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/storages/backends/s3boto3.py”,   _save中的第506行           self._save_content(obj,content,parameters =参数)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/storages/backends/s3boto3.py”,   _save_content中的第521行           obj.upload_fileobj(content,ExtraArgs = put_parameters)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/boto3/s3/inject.py”,   第621行,在object_upload_fileobj中           ExtraArgs = ExtraArgs,Callback = Callback,Config = Config)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/boto3/s3/inject.py”,   第539行,在upload_fileobj中           返回future.result()         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/futures.py”,   第106行,结果           返回self._coordinator.result()         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/futures.py”,   结果是第265行           提高自我         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py”,   第126行,致电           返回self._execute_main(kwargs)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py”,   第150行,在_execute_main中           return_value = self._main(** kwargs)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/upload.py”,   _main中的第692行           client.put_object(Bucket = bucket,Key = key,Body = body,** extra_args)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py”,   _api_call中的第357行           返回self._make_api_call(operation_name,kwargs)         文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py”,   _make_api_call中的第661行           引发error_class(parsed_response,operation_name)       botocore.exceptions.ClientError:调用PutObject操作时发生错误(AccessDenied):访问被拒绝

因此,我编辑了存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow All",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::<bucket name>/*"
        }
    ]
}

,但错误仍然发生。如何解决此错误?

我正在遵循的教程在这一步没有显示任何错误。(https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

4 个答案:

答案 0 :(得分:2)

设置AWS_DEFAULT_ACL = None对我有用。默认情况下,它看起来像boto请求public-read ACL,因此,除非您将存储桶公开,否则它将不起作用。

答案 1 :(得分:1)

这对我有用:

In my S3 bucket -> Permissions Tab -> click Block public access -> Edit -> untick Block all public access -> Save

AND

In my AWS IAM settings -> Users Tab (under Access Management) -> <my-user> -> Add Permissions -> add AmazonS3FullAccess

这授予用户(由AWS ID和AWS Secret标识)访问权限来控制我的s3存储桶

答案 2 :(得分:0)

这是AWS S3访问问题。

在S3存储桶控制台中,我将存储桶的公共访问权限编辑为公共。

答案 3 :(得分:0)

默认情况下,当您创建新存储桶时,所有s3对象的公共访问都将被阻止(默认情况下被选中)。也就是说,您不能通过任何公共api或应用程序(如Django应用程序)访问对象(读取,写入)。因此,如果您要访问特定存储桶中的s3对象,则应将权限设置为可公开访问(请参见存储桶的权限部分)。为了进一步控制,您可以从ACL部分添加ACL(访问控制列表)用户。

您可以参考此link