web-dev-qa-db-fra.com

Est-il possible de déclencher un lambda lors de la création à partir du modèle CloudFormation

J'ai essayé de créer un ensemble de lambdas en utilisant cloudformation. Je veux que les lambdas se déclenchent une fois qu'ils sont créés. J'ai vu sur divers blogs créer un déclencheur pour s3 ou sns mais aucun ne semble être une option pour déclencher lambda une fois qu'il a été créé. Des options?

15
ZZzzZZzz

Oui c'est possible. Voici quelques options:

  1. Manuellement créer un sujet SNS . Ajoutez un AWS::SNS::Subscription à votre pile avec la fonction lambda comme Endpoint et la rubrique SNS comme TopicArn . Lors de la création/mise à jour de la pile, configurez les notifications d'événements de pile à envoyer à cette rubrique SNS.

    • (Voir Définition des options de pile AWS CloudFormation pour la documentation sur la façon de procéder lors de l'utilisation de la console AWS pour créer votre pile, ou utilisez l'option équivalente comme --notification-arns si vous créez/mettez à jour votre pile à l'aide de AWS CLI ou d'un autre SDK AWS.)
  2. Ajoutez un Ressource personnalisée référençant une fonction Lambda à appeler lors de la création.

    • Si vous avez besoin que la fonction Lambda soit appelée après création d'une ressource spécifique, ajoutez un attribut DependsOn sur la ressource personnalisée référençant la ressource dont vous voulez vous assurer qu'elle est créée en premier avant l'appel de la fonction.
    • Pour que la ressource personnalisée se crée correctement (et ne provoque pas d'échec/restauration dans votre pile), vous devrez adapter votre fonction Lambda pour prendre en charge le format de demande/réponse CloudFormation (voir Référence de ressource personnalisée ).
    • Cette option appellera la fonction Lambda pendant que état de la pile est toujours CREATE_IN_PROGRESS, car la ressource personnalisée fait partie de la pile elle-même.
    • La fonction Lambda sera également appelée à nouveau lorsque la pile (et la ressource personnalisée associée) est supprimée. Cela devra être géré correctement par votre fonction Lambda, sinon votre pile pourrait se coincer dans le DELETE_FAILED Etat.
  3. Ajoutez la référence de la fonction Lambda à un Stack Output , puis écrivez un script simple qui effectue la création de la pile, puis invoque manuellement la fonction Lambda par la suite.

24
wjordan

Pour ceux qui recherchent la solution de contournement similaire.

CloudWatch est capable de capturer les appels d'API de CloudFormation, qui sont "CreateStack", "UpdateStack" et "DeleteStack", les états de pile comme "Create_complete" ou "Complete_Rollback" ne sont pas capturables, ce qui signifie que ces changements d'état ne peuvent pas déclencher lambda.

La solution de contournement est SNS, les piles peuvent envoyer des notifications à SNS (dans les paramètres à l'avance lorsque vous créez une pile) et SNS peut choisir de déclencher lambda, cependant, vous ne pouvez pas choisir pour des états spécifiques. Ainsi, la fonction lambda prend le travail pour découvrir quel état dans le contenu "Message" d'un événement. Tout le monde, juste du codage.

1
Larry Song

Vous avez la possibilité de notifier un sujet SNS, et vous pouvez créer un lambda qui écoute le sujet, de sorte que le flux de travail serait: Lancement Cloudformation -> Sujet SNS -> Lambda.

0
Conti

Le modèle suivant doit appeler le lambda:

"InvokeLambda": {"Type": "Custom :: InvokeLambda", "Version": "1.0", "Propriétés": {"ServiceToken": {"Fn :: GetAtt": ["InitFunction", "Arn"] }}},

0
Bobby Thomas