![](/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.