Я попытался создать набор lambdas, используя cloudformation. Я хочу, чтобы лямбды срабатывали после их создания. Я видел в разных блогах, чтобы создать триггер для s3 или sns, но ни один из них не может запускать lambda после его создания. Любые варианты?
Возможно ли запустить lambda при создании из шаблона CloudFormation
Ответ 1
Да, это возможно. Вот несколько вариантов:
-
Вручную создайте тему SNS. Добавьте
AWS::SNS::Subscriptionв свой стек, используя лямбда-функцию в качествеTopicArnEndpointи тему 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"] }}},