web-dev-qa-db-de.com

so verbinden Sie einen Cloudwatch-Alarm mit einer Lambda-Funktion

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: 

https://medium.com/cohealo-engineering/how-set-up-a-slack-channel-to-be-an-aws-sns-subscriber-63b4d57ad3ea#.x2j9apedu

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:

 enter image description here

Der Alarm scheint so konfiguriert zu sein, dass er Alarme an das richtige SNS-Thema sendet:

 enter image description here  enter image description here

Zu diesem Thema gibt es ein SNS-Abonnement, dessen Endpunkt die Lambda-Funktion ist:

 enter image description here

Alarme werden ausgelöst und Meldungen werden an das richtige Thema gesendet, wenn der Alarm ausgelöst wird:

 enter image description here

Die Lambda-Funktion wird jedoch nie aufgerufen:

 enter image description here

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.

 enter image description here

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

10
Neil Cronin

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

5
Enrique Saez

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" }
    }
}
0
BrianV

Das geplante CloudWatch-Ereignis hat jetzt ein natives Ziel für Lambda.  enter image description here

Sie können auch ein geplantes Ereignis zur Cloudformation für Lambda hinzufügen

EventListFunction:
  Type: 'AWS::Serverless::Function'
  Properties:
    ...
    Events:
      Schedule1:
        Type: Schedule
        Properties:
          Schedule: rate(1 day)
0
Eric Nord