Как запустить лямбду AWS через локальный SAM, который записывает в корзину S3?

Я собираюсь запустить некоторые из наших лямбда-выражений AWS локально через SAM, в том числе тот, который записывает данные в корзину S3. Есть ли способ заставить S3 запускаться локально или обращаться к корзине S3 в облаке и писать в нее при локальном запуске лямбды?


person jamesdwalker    schedule 07.08.2019    source источник
comment
Да, есть способ. Где ты застрял?   -  person guijob    schedule 07.08.2019
comment
Я сделал несколько поисков в Интернете, но не смог понять, как это сделать. У меня работает лямбда, которая разговаривает с локальным экземпляром DynaModb, но не с s3.   -  person jamesdwalker    schedule 07.08.2019
comment
@guijob Не могли бы вы включить соответствующий код?   -  person Tom Nijs    schedule 07.08.2019
comment
@jamesdwalker, какую ошибку вы получили при попытке отправить файл в свой s3? локальный s3 еще не поддерживается, но вы можете подключиться к облачному сервису s3   -  person guijob    schedule 07.08.2019


Ответы (1)


Да, я добился этого (после больших трудностей документация разбросана повсюду и сосредоточена на конкретных случаях использования, которые не были моими) с помощью локальный стек.

Вам нужно запустить докер, тогда:

pip install localstack

Затем:

localstack start

Некоторая документация, которую я нашел, предполагает, что вы используете http://localhost:4566, и действительно, указывая на браузер там, что-то существует , но мне не удалось указать там boto3 или другого клиента AWS, получая очень загадочные сообщения об ошибках.

Реальный порт — 4572, попробуйте это:

aws --endpoint-url=http://localhost:4572 s3api create-bucket --bucket mybucket --region us-west-1

А теперь, если у вас есть такая лямбда-функция:

import boto3


def lambda_handler(event, context):
    s3 = boto3.client('s3' ,
        endpoint_url='http://localhost:4572',
        use_ssl=False)
    s3.create_bucket(Bucket="test-bucket")
    #rest of your function here

Последний компонент (может зависеть от вашей настройки Docker) — вам может понадобиться вызвать его следующим образом:

sam local invoke  --docker-network host
person Josh Rumbut    schedule 17.05.2020