我正在嘗試選擇一個現有存盤桶,然后使用 Boto3 將檔案上傳到存盤桶中。但是與存盤桶相關的所有方法對我來說都無法正常作業。
我面臨的問題是這樣的:
- 當我使用
boto3.Session.client('s3').list_buckets()方法列出存盤桶時,它會生成一個空的存盤桶串列。 boto3.Session.resource('s3').Bucket('existing_bucket_name')當我使用then runupload_fileobj()方法選擇特定的存盤桶時,它會拋出例外(盡管 Bucket 物件的屬性正確回傳了存盤桶的名稱NoSuchBucket,這非常荒謬)。name
到目前為止我已經嘗試過:
- 使用
Session帶有關鍵字引數的實體,指示帳戶和區域配置。我在 Boto3 配置設定方面遇到了一些問題,最終放棄了使用組態檔,然后直接提供了實體配置引數。 resource代替client. _client方法不能正常作業,所以我用resource了,但也不順利。
這是我的代碼:
- 實作客戶端類
class S3Client:
def __init__(self):
region = 'ap-northeast-2'
self.session = boto3.Session(
aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],
aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],
region_name=region
)
self.client = self.session.client(service_name='s3', region_name=region,
aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],
aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'])
self.resource = self.session.resource('s3')
self.bucket = self.resource.Bucket(settings.AWS_S3['BUCKET_NAME'])
@staticmethod
def open_test_file_as_byte():
file_name = os.path.join(os.path.dirname(__file__), 'test_file.pdf')
data = open(file_name, 'rb')
return data
def upload_file(self, file_name):
with self.open_test_file_as_byte() as file_byte_stream:
return self.bucket.upload_fileobj(
file_byte_stream,
'reports/' file_name,
ExtraArgs={'ACL': 'public-read-write'}
)
# this method worked once with message saying that creation successfully completed, but I cannot find anything in my S3
def create_bucket(self):
return self.client.create_bucket(
ACL='public-read-write',
Bucket='public-reports'
# CreateBucketConfiguration={
# 'LocationConstraint': 'ap-northeast-2'
# }
)
- 呼叫客戶端方法的代碼
@mock_s3
class S3ClientTestCases(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.s3_client = S3Client()
def test_create_bucket(self):
logger.debug(self.s3_client.create_bucket())
logger.debug(self.s3_client.client.list_buckets())
def test_upload_file(self):
logger.debug(self.s3_client.upload_file('test.pdf'))
這是完整的錯誤日志:
======================================================================
ERROR: test_upload_file (apps.reports.test.S3ClientTestCases)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/moto/core/models.py", line 111, in wrapper
result = func(*args, **kwargs)
File "/Users/psymon/Documents/Git/portfolio-manager/apps/reports/test.py", line 54, in test_upload_file
logger.debug(self.s3_client.upload_file('test.pdf'))
File "/Users/psymon/Documents/Git/portfolio-manager/apps/reports/services/report_upload_service.py", line 71, in upload_file
return self.bucket.upload_fileobj(
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/boto3/s3/inject.py", line 678, in bucket_upload_fileobj
return self.meta.client.upload_fileobj(
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/boto3/s3/inject.py", line 636, in upload_fileobj
return future.result()
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/s3transfer/futures.py", line 103, in result
return self._coordinator.result()
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/s3transfer/futures.py", line 266, in result
raise self._exception
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/s3transfer/tasks.py", line 139, in __call__
return self._execute_main(kwargs)
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/s3transfer/tasks.py", line 162, in _execute_main
return_value = self._main(**kwargs)
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/s3transfer/upload.py", line 758, in _main
client.put_object(Bucket=bucket, Key=key, Body=body, **extra_args)
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/botocore/client.py", line 515, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/Users/psymon/Documents/Git/portfolio-manager/.venv/lib/python3.10/site-packages/botocore/client.py", line 934, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.NoSuchBucket: An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist
編輯#1
存盤桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::some_bucket_name/*"
}
]
}
授予用戶權限:
AmazonS3FullAccess
我猜 AWS 帳戶設定有問題,但我不確定到底是什么導致了整個故障......
請任何建議!
uj5u.com熱心網友回復:
解決了
我的問題的原因是測驗代碼上的注釋,@mock_s3.
實際上,我什至不能稱之為問題,而是一個錯誤。
不管怎樣,如果有人因為那個注釋而遇到麻煩,我希望我的愚蠢記錄能幫到你。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/534949.html
