Как развернуть стек SAM с помощью localstack?

Я написал стек SAM и могу собрать, упаковать и развернуть его на AWS. Я также могу использовать start-local или invoke для тестирования. Теперь мне нужно протестировать на других ресурсах AWS. Я добавил эти ресурсы в свой шаблон SAM. Он хорошо работает на AWS, но я ищу способ развернуть свой стек SAM в локальном стеке (например, локальный динамодб). Теперь мне нужно создать ресурсы с помощью интерфейса командной строки, и после этого я могу развернуть свой стек SAM (в данном случае только лямбда, API GW). Как я могу это сделать?


person mealesbia    schedule 05.02.2020    source источник
comment
Какие ресурсы вам конкретно нужны? И как вы пытаетесь получить к ним доступ? Если это через код, можете ли вы опубликовать соответствующий фрагмент кода?   -  person Andrew A.    schedule 05.02.2020
comment
В настоящее время я использую шаблон SAM с потоками lambda, dyamodb, s3, Dynamodb и пожарным шлангом. Он работает на AWS, но я не могу развернуть шаблон SAM с помощью localstack. (github.com/localstack/localstack/issues/632). Сейчас я ищу другой способ сделать это. Я могу развернуть часть с обычной облачной информацией и часть с SAM, но тогда мне нужно импортировать и экспортировать ресурсы, и это не будет работать (экспорт в localstack в докере и импорт в SAM)   -  person mealesbia    schedule 05.02.2020
comment
Я думаю, что это неправильное использование обоих инструментов. Вы должны запускать SAM отдельно, sam local start-api ...<options>. Затем в вашем лямбда-коде обратитесь к ресурсам localstack по их локальному адресу, то есть DynamoDB по адресу localhost: 4569. Не следует пытаться развернуть приложение SAM в локальном стеке, это не то, для чего оно предназначено.   -  person Andrew A.    schedule 05.02.2020
comment
По сути, вы можете развернуть свой SAM с помощью докера sam-cli plus, а затем в localstack создать потоки Dynamodb и пожарный шланг. Я считаю, что вы можете получить только шлюз lambda + api в sam local.   -  person Andrew A.    schedule 05.02.2020
comment
Вы можете развернуть, используя облачную информацию aws cloudformation deploy ..., но, честно говоря, я бы не предлагал использовать localstack, это очень ошибочно.   -  person Madeo    schedule 19.11.2020
comment
Да, LocalStack очень глючит ... Я не думаю, что он не должен был обрабатывать развертывания. Он утверждает, что поддерживает CloudFormation и поддерживает бессерверную AWS, поэтому я ожидаю, что он будет хорошо справляться с развертыванием приложений SAM. Оказалось, что это невозможно, поэтому мне пришлось вернуться к ручному кодированию AWS SDK для локального развертывания моих ресурсов.   -  person Renato Byrro    schedule 25.01.2021


Ответы (3)


Я только что прошел через это. Я думаю, что верно следующее.

AWS SAM - это оболочка облачной информации. Итак, ваш шаблон SAM на самом деле является шаблоном Cloudformation. Ваш шаблон Cloudformation определяет ваши лямбда-выражения, динамодб и т. Д. Когда вы развертываете в AWS, все ваши лямбда-выражения и динамодезы переходят в AWS, и вы можете тестировать их в облаке.

Когда вы запускаете AWS SAM локально, вы запускаете свою лямбду локально (в контейнере докеров), но она по-прежнему получает доступ к ресурсам в облаке AWS.

LocalStack имеет интерфейс CloudFormation, поэтому должно быть возможно развернуть файл шаблона CloudFormation. Но я столкнулся с некоторыми проблемами и сдался.

Serverless Framework похожа на AWS SAM в том смысле, что это платформа для разработки вашего безобслуживаемого (лямбда-кода) кода и его развертывания в AWS. Serverless имеет собственную спецификацию yaml для определения стека. Преобразование облачной информации в бессерверный yaml - это немного работы.

Для localstack существует бессерверный плагин. Затем можно развернуть ваш код в localstack. Если у вас есть шлюз API перед вашими лямбдами, тогда будет локальный URL-адрес, который вы можете нажать, который запускает ваши лямбды. Это полностью внутри локального стека и без использования AWS SAM.

На этом этапе вы можете обнаружить, что ваш код по-прежнему попадает в реальные сервисы AWS. Поэтому вам нужно изменить URL-адрес конечной точки, чтобы он указывал локально, как сказал Эндрю А.. Для этого и для того, чтобы ваш код был одинаковым для тестирования и производства, вы можете использовать переменные среды для каждой из конечных точек службы.

Как отмечает Эндрю А., должна быть возможность запускать код с использованием SAM local, который обращается к ресурсам, предоставляемым localstack. Однако может быть предпочтительнее использовать один инструмент, если это было сделано, скажем, в рамках конвейера тестирования.

person LazyBrush    schedule 18.02.2020
comment
Единственный способ, которым это работает для меня, - использовать AWS SDK для создания ресурсов вручную в LocalStack. Не удалось заставить развертывание шаблона SAM работать на LocalStack. - person Renato Byrro; 25.01.2021
comment
pip install aws-sam-cli-local, затем samlocal deploy - person Michael Armitage; 21.05.2021

После некоторого исследования самый надежный способ -

  1. sam build и zip ваш код в .aws-sam/build
$ cd .aws-sam/build
$ zip -qr MyLambda.zip MyLambda
$ tree .aws-sam -L 2
.aws-sam
├── build
│   ├── MyLambda.zip
│   ├── MyLambda
│   └── template.yaml
└── build.toml

2 directories, 3 files
  1. Разверните заархивированный код в лямбда локального стека, скажем, у меня есть кодовая база nodejs
aws --endpoint-url=http://localhost:4566 lambda create-function \
    --function-name "my-lambda" --runtime=nodejs12.x --role dummy \
    --zip-file=fileb:.aws-sam/build/MyLambda.zip \
    --handler MyLambda/src/index.handler
person kigawas    schedule 20.04.2021

Создатели Localstack создали легкую оболочку для sam cli. Просто используйте pip для установки samlocal как библиотеки Python на ваш компьютер:

pip install aws-sam-cli-local

Затем вы можете развернуть в локальном стеке, используя samlocal deploy вместо обычного sam deploy. Примерно так:

samlocal deploy --stack-name sam-app --capabilities CAPABILITY_IAM --guided

Дополнительные сведения о параметрах, доступных при развертывании Sam, см. В документации здесь.

person Michael Armitage    schedule 20.05.2021