Возможно ли запустить lambda при создании из шаблона CloudFormation

Я попытался создать набор lambdas, используя cloudformation. Я хочу, чтобы лямбды срабатывали после их создания. Я видел в разных блогах, чтобы создать триггер для s3 или sns, но ни один из них не может запускать lambda после его создания. Любые варианты?

Ответ 1

Да, это возможно. Вот несколько вариантов:

  1. Вручную создайте тему SNS. Добавьте AWS::SNS::Subscription в свой стек, используя лямбда-функцию в качестве TopicArn Endpoint и тему SNS в качестве TopicArn. При создании/обновлении стека настройте уведомления о событиях стека для отправки в этот раздел SNS.

  2. Добавьте пользовательский ресурс, ссылающийся на лямбда-функцию, которая будет вызываться при создании.

    • Если вам нужно, чтобы лямбда-функция вызывалась после создания какого-то определенного ресурса, добавьте атрибут DependsOn в пользовательский ресурс, ссылающийся на ресурс, который вы хотите удостовериться, что он создан в первую очередь перед вызовом функции.
    • Чтобы пользовательский ресурс успешно создавался (и не вызывал сбой/откат в вашем стеке), вам нужно будет адаптировать свою функцию Lambda для поддержки формата запроса/ответа CloudFormation (см. Ссылку на пользовательский ресурс).
    • Эта опция будет вызывать лямбда-функцию, пока статус стека все еще CREATE_IN_PROGRESS, потому что пользовательский ресурс является частью самого стека.
    • Лямбда-функция также будет вызываться снова при удалении стека (и связанного с ним пользовательского ресурса). Это должно быть правильно обработано вашей лямбда-функцией, иначе ваш стек может застрять в состоянии DELETE_FAILED.
  3. Добавьте ссылку на функцию 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"] }}},