![](/img/trans.png)
[英]botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
[英][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_path,存储)文件“/home/seokchan/server/ mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py”,第 353 行,在 copy_file self.storage.save(prefixed_path, 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 来解决问题。 要做到这一点,
Object Ownership
并单击编辑设置 AWS_S3_REGION_NAME='your-region' 例如:'us-east-2'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.