簡體   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