web-dev-qa-db-fra.com

comment connecter une alarme cloudwatch à une fonction lambda

Comment connecter une alarme de surveillance aws cloud à une invocation de fonction lambda?

J'ajoute par programme une alarme de surveillance en nuage aux ELB que nous créons dans le cadre d'une pile de formation en nuage via des modèles AWS CloudFormation. Je souhaite que les alertes soient envoyées à une fonction lambda qui enverra le message à Slack. Bien que l'alerte fonctionne et que la configuration SNS me semble correcte, la fonction lambda n'est jamais invoquée.

La fonction lambda suit ces exemples: 

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/

La fonction lambda fonctionne et je peux lui envoyer des données de test via la console aws, ce qui génère un message envoyé à Slack.

L'équilibreur de charge est créé avec une alarme de surveillance en nuage d'aspect correct:

 enter image description here

L'alarme semble être configurée pour envoyer des alertes à la rubrique SNS appropriée:

 enter image description here  enter image description here

Il existe un abonnement SNS à ce sujet, avec la fonction lambda comme noeud final:

 enter image description here

Les alarmes sont déclenchées et les messages envoyés au bon sujet lorsque l'alarme se déclenche:

 enter image description here

Mais la fonction lambda n’est jamais invoquée:

 enter image description here

Cependant, si j'ajoute manuellement la rubrique SNS en tant que "source d'événement" sur la fonction lambda, elle est appelée lorsque l'alarme se déclenche et que les messages Slack sont publiés.

 enter image description here

Est-ce que je comprends mal comment connecter une alarme de surveillance en nuage à une fonction lambda? Ou y a-t-il un petit détail qui me manque?

Si cette approche ne peut pas fonctionner et que le seul moyen de connecter une fonction lambda à une alarme de surveillance du cloud consiste à ajouter le sujet SNS en tant que "source d'événement", quelle est la manière appropriée de le faire via les modèles AWS CloudFormation? Je ne vois pas de moyen évident de modifier une ressource existante telle qu'une fonction lambda fixe.

Voici mon modèle CloudFormation:

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

Merci!

-neil

10
Neil Cronin

AWS a publié (il y a environ 3 jours) un plan directeur pour l'intégration souple avec AWS Cloudwatch en utilisant lambda à la fois en python et en nœuds: https://aws.Amazon.com/blogs/aws/new-slack-integration-blueprints-for -aws-lambda/

Cela dit, j'ai également eu le même problème que vous, en suivant les étapes mentionnées dans le plan, je ne reçois pas les alarmes avant d’ajouter manuellement le sujet SNS en tant que "source d’événement" sur la fonction lambda. Une enquête plus poussée m'amène à cette question: Impossible de créer une source d'événements SNS sur une fonction Lambda à l'aide de CloudFormation

Et enfin, lecture de la documentation AWS: 1) http://docs.aws.Amazon.com/lambda/latest/dg/intro-core-components.html

Amazon SNS gère le mappage de la source d'événements via la configuration de l'abonnement à la rubrique (Aucune API AWS Lambda ne permet de configurer ce mappage).

2) http://docs.aws.Amazon.com/sns/latest/dg/sns-lambda.html

Configuration d'Amazon SNS avec des points de terminaison Lambda avec la console AWS Management

A conclu que l'abonnement pour le moment devrait se faire via la console de gestion AWS

Résumé: pour le moment, la seule façon de configurer Amazon SNS avec des points de terminaison Lambda consiste à utiliser AWS Management Console.

Bonus: question similaire avec la même réponse: Source d'événements planifiés AWS Lambda via cloudformation

5
Enrique Saez

Assurez-vous d'accorder à la rubrique SNS l'autorisation d'appeler votre fonction Lambda. La CloudFormation pour l'autorisation ressemblera à ceci:

"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

L'événement CloudWatch Scheduled a maintenant Lambda comme cible native.  enter image description here

Vous pouvez également ajouter un événement planifié à cloudformation pour lambda

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