Я попытался создать набор lambdas, используя cloudformation. Я хочу, чтобы лямбды срабатывали после их создания. Я видел в разных блогах, чтобы создать триггер для s3
или sns
, но ни один из них не может запускать lambda
после его создания. Любые варианты?
Возможно ли запустить lambda при создании из шаблона CloudFormation
Ответ 1
Да, это возможно. Вот несколько вариантов:
-
Вручную создайте тему SNS. Добавьте
AWS::SNS::Subscription
в свой стек, используя лямбда-функцию в качествеTopicArn
Endpoint
и тему SNS в качествеTopicArn
. При создании/обновлении стека настройте уведомления о событиях стека для отправки в этот раздел SNS.- (См. Раздел Настройка параметров стека AWS CloudFormation для получения документации о том, как это сделать при использовании консоли AWS для создания стека, или используйте эквивалентную опцию, например
--notification-arns
при создании/обновлении стека с помощью интерфейса командной строки AWS или другого пакета AWS SDK. )
- (См. Раздел Настройка параметров стека AWS CloudFormation для получения документации о том, как это сделать при использовании консоли AWS для создания стека, или используйте эквивалентную опцию, например
-
Добавьте пользовательский ресурс, ссылающийся на лямбда-функцию, которая будет вызываться при создании.
- Если вам нужно, чтобы лямбда-функция вызывалась после создания какого-то определенного ресурса, добавьте атрибут
DependsOn
в пользовательский ресурс, ссылающийся на ресурс, который вы хотите удостовериться, что он создан в первую очередь перед вызовом функции. - Чтобы пользовательский ресурс успешно создавался (и не вызывал сбой/откат в вашем стеке), вам нужно будет адаптировать свою функцию Lambda для поддержки формата запроса/ответа CloudFormation (см. Ссылку на пользовательский ресурс).
- Эта опция будет вызывать лямбда-функцию, пока статус стека все еще
CREATE_IN_PROGRESS
, потому что пользовательский ресурс является частью самого стека. - Лямбда-функция также будет вызываться снова при удалении стека (и связанного с ним пользовательского ресурса). Это должно быть правильно обработано вашей лямбда-функцией, иначе ваш стек может застрять в состоянии
DELETE_FAILED
.
- Если вам нужно, чтобы лямбда-функция вызывалась после создания какого-то определенного ресурса, добавьте атрибут
-
Добавьте ссылку на функцию Lambda в вывод стека, затем напишите простой скрипт, который выполняет создание стека, а затем вручную вызывает функцию Lambda.
Ответ 2
Для тех, кто ищет аналогичное обходное решение.
CloudWatch способен захватывать вызовы API CloudFormation, которые являются "CreateStack", "UpdateStack" и "DeleteStack", состояния стека, такие как "Create_complete" или "Complete_Rollback", являются недоступными, что означает, что такие изменения состояния не могут запускаться лямбда.
Обходной путь - SNS, стеки могут отправлять уведомления SNS (в предварительных настройках при создании стека), а SNS может выбрать запуск лямбда, однако вы не можете выбрать для определенных состояний. Таким образом, лямбда-функция выполняет задание, чтобы узнать, какое состояние в "сообщении" содержимого события. Все, просто кодирование.
Ответ 3
У вас есть возможность уведомлять тему SNS, и вы можете создать лямбду, которая прослушивает тему, поэтому рабочий процесс будет следующим: запуск Cloudformation → тема SNS → Lambda.
Ответ 4
Следующий шаблон должен вызывать лямбду:
"InvokeLambda": {"Type": "Custom :: InvokeLambda", "Version": "1.0", "Properties": {"ServiceToken": {"Fn :: GetAtt": ["InitFunction", "Arn"] }}},