#python #amazon-web-services #docker #boto3 #localstack
#python #amazon-веб-сервисы #docker #boto3 #localstack
Вопрос:
Я запускаю localstack с контейнером docker (docker-compose.yaml)
localstack:
image: localstack/localstack:latest
ports:
- '4563-4599:4563-4599'
- '8055:8080'
environment:
- SERVICES=s3
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
- DEFAULT_REGION=us-east-1
volumes:
- './.localstack:/tmp/localstack'
- '/var/run/docker.sock:/var/run/docker.sock'
и попробуйте загрузить файл с помощью функции загрузки
import logging
import boto3
from botocore.exceptions import ClientError
class ClientS3(object):
def __init__(self):
self.session = boto3.session.Session()
self.client = self.session.client('s3')
def upload_file(self, filename, bucket, key=None):
if not key:
key = filename
try:
self.client.upload_file(
Filename=filename,
Bucket=bucket,
Key=key
)
except ClientError as e:
logger.error(f'Failed to upload file: {str(e)}')
в API
def test_upload_file_to_s3(filename: str):
s3cl = ClientS3()
s3cl.upload_file(filename, "mybucket")
после запуска кода в API localstack возвращает сообщение об ошибке
boto3.exceptions.S3UploadFailedError: Failed to upload testfile.txt to mybucket/testfile.txt: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records.
Что я сделал не так и где должны быть надлежащие учетные данные в docker-compose?
Ответ №1:
Старый вопрос, но я боролся с этим не так давно, так что я все равно дам ответ.
Вы пропускаете endpoint_url при вызове функции Session(). Это должно быть:
self.session = boto3.session.Session(endpoint_url="http://localhost:4566")
Обратите внимание, что я использую уникальную конечную точку, которую теперь предоставляет новейшая версия LocalStack.