Ist es möglich, bei der Erstellung einer CloudFormation-Vorlage ein Lambda auszulösen?

8

Ich habe versucht, eine Reihe von Lambda mit Hilfe von Wolkenbildung zu erstellen. Ich möchte, dass die Lambdas ausgelöst werden, sobald sie erstellt sind. Ich habe in verschiedenen Blogs gesehen, dass ein Trigger auf s3 oder sns erstellt wurde, aber keiner scheint eine Option zu sein, um lambda auszulösen, sobald er erstellt wurde. Irgendwelche Optionen?

    
ZZzzZZzz 27.12.2016, 18:41
quelle

3 Antworten

11

Ja, das ist möglich. Hier sind ein paar Optionen:

  1. Erstellen Sie manuell ein SNS-Thema . Fügen Sie Ihrem Stack mit der Lambda-Funktion einen AWS::SNS::Subscription hinzu als Endpoint und das SNS-Thema als TopicArn . Konfigurieren Sie bei der Stapelerstellung / -aktualisierung Stack-Ereignisbenachrichtigungen, die an dieses SNS-Thema gesendet werden sollen.

    • (Siehe AWS CloudFormation-Stapeloptionen festlegen für die Dokumentation wie Sie dies tun, wenn Sie die AWS-Konsole zum Erstellen Ihres Stacks verwenden, oder verwenden Sie die entsprechende Option wie --notification-arns , wenn Sie Ihren Stack mit AWS CLI oder ein anderes AWS SDK.)
  2. Fügen Sie eine benutzerdefinierte Ressource hinzu, die auf eine Lambda-Funktion verweist, die aufgerufen werden soll bei der Erstellung.

    • Wenn Sie möchten, dass die Lambda-Funktion aufgerufen wird, nachdem eine bestimmte Ressource erstellt wurde, fügen Sie ein DependsOn -Attribut für die benutzerdefinierte Ressource, die auf die Ressource verweist, die Sie sicherstellen möchten, wird zuerst erstellt, bevor die Funktion aufgerufen wird.
    • Damit die benutzerdefinierte Ressource erfolgreich erstellt wird (und keinen Fehler / Rollback in Ihrem Stapel verursacht), müssen Sie Ihre Lambda-Funktion anpassen, um das CloudFormation-Anfrage- / Antwortformat zu unterstützen (siehe Referenz für benutzerdefinierte Ressourcen ).
    • Diese Option ruft die Lambda-Funktion während des Stack-Status auf ist immer noch CREATE_IN_PROGRESS , weil die benutzerdefinierte Ressource Teil des Stapels selbst ist.
    • Die Lambda-Funktion wird auch erneut aufgerufen, wenn der Stapel (und die zugeordnete benutzerdefinierte Ressource) gelöscht wird. Dies muss von Ihrer Lambda-Funktion korrekt gehandhabt werden, oder Ihr Stack könnte im DELETE_FAILED -Zustand hängen bleiben.
  3. Fügen Sie die Lambda-Funktionsreferenz zu einer Stapelausgabe , dann schreibe ein einfaches Skript, das die Stack-Erstellung durchführt und anschließend die Lambda-Funktion manuell aufruft.

wjordan 29.12.2016, 23:16
quelle
1

Für diejenigen, die ähnliche Workarounds suchen.

CloudWatch kann API-Aufrufe von CloudFormation erfassen, das heißt "CreateStack", "UpdateStack" und "DeleteStack", Stapelzustände wie "Create_complete" oder "Complete_Rollback" sind nicht erfassbar, dh Zustandsänderungen können nicht ausgelöst werden Lambda.

Die Problemumgehung ist SNS, Stacks können Benachrichtigungen an SNS senden (Voreinstellungen beim Erstellen eines Stapels) und SNS kann Lambda auslösen, Sie können jedoch nicht für bestimmte Status auswählen. Die Lambda-Funktion übernimmt also die Aufgabe, um herauszufinden, welcher Zustand im "Message" -Inhalt eines Ereignisses ist. Jeder, nur codieren.

    
Larry Song 06.07.2017 00:39
quelle
0

Sie haben die Möglichkeit, ein SNS-Thema zu benachrichtigen, und Sie können ein Lambda erstellen, das das Thema abhört. Der Workflow würde also wie folgt aussehen: Cloudformation-Start - & gt; SNS-Thema - & gt; Lambda.

    
Conti 28.12.2016 09:40
quelle