Разрешения Localstack запрещают клиенту s3 записывать файл в корзину

#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.