繁体   English   中英

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

[英][Django][AWS S3] botocore.exceptions.clienterror an error occurred (accessdenied) when calling the PutObject operation

我正在尝试将 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

发生错误:

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

这将覆盖现有文件! 你确定要这么做吗?

键入“是”继续,或“否”取消:是 回溯(最近一次调用最后):文件“manage.py”,第 22 行,在 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(subcommand).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(prefixed_pa​​th, source_file) 文件“/home/seokchan/server /mdocker/lib/python3.5/site-packages/django/core/files/storage.py”,第 49 行,在保存返回 self._save(name, content) 文件“/home/seokchan/server/mdocker/lib /python3.5/site-packages/storages/backends/s3boto3.py”,第 506 行,在 _save self._save_content(obj, content, parameters=parameters) 文件“/home/seokchan/server/mdocker/lib/python3. 5/site-packages/storages/backends/s3boto3.py”,第 521 行,在 _save_content 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,Callbac k=Callback, Config=Config) File "/home/seokchan/server/mdocker/lib/python3.5/site-packages/boto3/s3/inject.py", line 539, in upload_fileobj return future.result() File “/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 行,结果引发 self._exception 文件“/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”,第 692 行,在 _main client.put_object(Bucket=bucket , Key=key, Body=body, **extra_args) 文件“/home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py”,第 357 行,在 _api_ca 将返回 self._make_api_call(operation_name, kwargs) 文件“/home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py”,第 661 行,在 _make_api_call 中引发 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 )

这是 AWS S3 访问问题。

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

注意:仅当您打算公开文件时才这样做,例如您使用它来为您的网站提供文件,例如图像、css 等每个人都需要访问的东西。

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

这对我有用:

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

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

这授予了用户(由 AWS id 和 AWS 秘密标识)访问控制我的 s3 存储桶的权限

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

你可以参考这个链接

如果有人仍然遇到这些问题,则问题出在 AWS S£ 存储桶上,您可以通过在 s3 存储桶上启用 ACL 来解决问题。 要做到这一点,

  1. 转到您的 S3 存储桶>权限选项卡
  2. 向下滚动到Object Ownership并单击编辑
  3. 将设置从禁用 ACL 更改为启用 ACL 并保存更改

它是访问控制列表(ACL)存储桶 -> 权限 -> ACL -> 编辑 -> 勾选所有人(公共访问)列表并读取对象和存储桶 ACL

在此处输入图像描述

设置 AWS_S3_REGION_NAME='your-region' 例如:'us-east-2'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM