Wie verbinden Sie einen aws cloud watch Alarm mit einem Aufruf der Lambda-Funktion?
Ich füge den ELBs, die wir als Teil eines Cloud-Formationsstapels erstellen, per Cloud Cloud-Alarm per AWS CloudFormation-Vorlagen programmgesteuert hinzu. Ich möchte, dass die Alarme an eine Lambda-Funktion gesendet werden, die die Nachricht an Slack sendet. Obwohl die Warnung funktioniert und die SNS-Konfiguration für mich richtig erscheint, wird die Lambda-Funktion niemals aufgerufen.
Die Lambda-Funktion folgt diesen Beispielen:
http://inopinatus.org/2015/07/13/hook-aws-notifications-into-slack-with-a-lambda-function/
Die Lambda-Funktion funktioniert, und ich kann Testdaten über die aws-Konsole senden, wodurch eine Nachricht an Slack gesendet wird.
Der Load Balancer wird mit einem korrekt aussehenden Cloud-Watch-Alarm erstellt:
Der Alarm scheint so konfiguriert zu sein, dass er Alarme an das richtige SNS-Thema sendet:
Zu diesem Thema gibt es ein SNS-Abonnement, dessen Endpunkt die Lambda-Funktion ist:
Alarme werden ausgelöst und Meldungen werden an das richtige Thema gesendet, wenn der Alarm ausgelöst wird:
Die Lambda-Funktion wird jedoch nie aufgerufen:
Wenn ich jedoch das SNS-Thema manuell als "Ereignisquelle" für die Lambda-Funktion hinzufüge, wird es aufgerufen, wenn der Alarm ausgelöst wird und Slack-Nachrichten gesendet werden.
Verstehe ich falsch, wie ich einen Cloud-Watch-Alarm mit einer Lambda-Funktion verbinden kann? Oder fehlt mir ein kleines Detail?
Wenn dieser Ansatz nicht funktioniert und der einzige Weg, eine Lambda-Funktion mit einem Cloud-Watch-Alarm zu verbinden, darin besteht, das SNS-Thema als "Ereignisquelle" hinzuzufügen, wie können Sie dies über AWS CloudFormation-Vorlagen tun? Ich sehe keine offensichtliche Möglichkeit, eine vorhandene Ressource wie eine feste Lambda-Funktion zu ändern.
Hier ist meine CloudFormation-Vorlage:
"GenericSlackAlertSNSTopic" : {
"Type" : "AWS::SNS::Topic",
"Properties" : {
"Subscription" : [ {
"Endpoint" : "arn:aws:lambda:us-east-1:[...]:function:snsToSlack",
"Protocol" : "lambda"
} ]
}
},
"ELBNoTrafficAlarm": {
"Type": "AWS::CloudWatch::Alarm",
"Properties": {
"Namespace" : "AWS/ELB",
"AlarmDescription": "Alarm for no apparent traffic on an ELB.",
"AlarmActions": [{
"Ref": "GenericSlackAlertSNSTopic"
}],
"InsufficientDataActions": [{
"Ref": "GenericSlackAlertSNSTopic"
}],
"MetricName": "RequestCount",
"Statistic": "Sum",
"Dimensions" : [ {
"Name" : "LoadBalancerName",
"Value" : { "Ref" : "ElasticLoadBalancer" }
} ],
"Period": "60",
"EvaluationPeriods": "3",
"Threshold" : "10",
"ComparisonOperator": "LessThanOrEqualToThreshold"
}
}
Vielen Dank!
-neil
AWS veröffentlichte (~ 3 Tage) einen Entwurf für die lockere Integration von AWS Cloudwatch mit Lambda sowohl in Python als auch in nodejs: https://aws.Amazon.com/blogs/aws/new-slack-integration-blueprints- für-aws-lambda/
Nachdem ich das gesagt habe, hatte ich auch das gleiche Problem wie Sie. Nach den im Entwurf genannten Schritten bekomme ich die Alarme nicht, bis ich das SNS-Thema manuell als "Ereignisquelle" für die Lambda-Funktion hinzufüge. Weitere Untersuchungen führen mich zu dieser Frage: Es kann keine SNS-Ereignisquelle für eine Lambda-Funktion mithilfe von CloudFormation erstellt werden.
Und schließlich lesen Sie die AWS-Dokumentation: 1) http://docs.aws.Amazon.com/lambda/latest/dg/intro-core-components.html
Amazon SNS verwaltet die Ereignisquellenzuordnung über die Konfiguration der Themensubskription (Es gibt keine AWS Lambda-API zum Konfigurieren dieser Zuordnung).
2) http://docs.aws.Amazon.com/sns/latest/dg/sns-lambda.html
Konfigurieren von Amazon SNS mit Lambda-Endpunkten mit der AWS Management Konsole
Daraus geschlossen, dass das Abonnement derzeit über die AWS Management Console erfolgen sollte
Zusammenfassung: Die einzige Möglichkeit, Amazon SNS mit Lambda-Endpunkten zu konfigurieren, ist über die AWS Management Console
Bonus: ähnliche Frage mit derselben Antwort: AWS Lambda geplante Ereignisquelle über Cloudformation
Stellen Sie sicher, dass Sie dem SNS-Thema die Berechtigung zum Aufrufen Ihrer Lambda-Funktion erteilen. Die CloudFormation für die Berechtigung sieht etwa so aus:
"LambdaInvokePermission": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName" : "arn:aws:lambda:us-east-1:[...]:function:snsToSlack",
"Action": "lambda:InvokeFunction",
"Principal": "sns.amazonaws.com",
"SourceArn": { "Ref": "GenericSlackAlertSNSTopic" }
}
}