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

yoo*_*oon 1 django amazon-s3 boto amazon-web-services

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

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

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

发生错误:

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

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

键入“是”以继续,或键入“否”以取消:是回溯(最近一次调用最后一次):在execute_from_command_line(sys.argv)中的文件“ manage.py”,第22行,文件“ / 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)File“ /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”,第506行,位于_save self._save_content(obj,content,参数=参数)文件“ /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,Callback = Callback,Config = Config )在upload_fileobj中,文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/boto3/s3/inject.py”第539行返回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行,结果引发self._exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py”,第126行,在在在/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行,结果是提高self._exception文件,“ / home / seokchan / server / mdocker / lib / python3.5 / site-packages / s3transfer / tasks.py”,第126行,在/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行,结果是提高self._exception文件,“ / home / seokchan / server / mdocker / lib / python3.5 / site-packages / s3transfer / tasks.py”,第126行,在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行,结果引发self。 _exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py”,第126行,在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行,结果引发self。 _exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py”,第126行,在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行,结果引发self._exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/ task.py“,第126行,在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行,结果引发self._exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/ task.py“,第126行,在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行,结果引发self._exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-包/s3transfer/tasks.py”,第126行,在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行,结果引发self._exception文件“ /home/seokchan/server/mdocker/lib/python3.5/site-包/s3transfer/tasks.py”,第126行,在5 / site-packages / s3transfer / tasks.py“,第126行,在5 / site-packages / s3transfer / tasks.py“,第126行,在呼叫 返回self._execute_main(kwargs)文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py”,行_execute_main中的第150行return_value = self._main(** kwargs) _main client.put_object(Bucket = bucket,Key = key,Body = body,*中的文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/upload.py”,第692行) * extra_args)文件“ /home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py”,第357行,在_api_call返回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>/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 11

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

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


Mad*_*Air 6

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


Joh*_*son 6

这对我有用:

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 存储桶的访问权限


yoo*_*oon 5

这是AWS S3访问问题。

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