我正在尝试将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_path,存储) 文件“ /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)
答案 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