7

Come si collega un allarme watch cloud aws a una chiamata di funzione lambda?come connettere un allarme cloudwatch a una funzione lambda

Aggiungo programmaticamente un allarme orologio cloud agli ELB che creiamo come parte di uno stack di formazione cloud tramite AWS CloudFormation Templates. Voglio che gli avvisi vengano inviati a una funzione lambda che pubblicherà il messaggio su Slack. Sebbene l'avviso funzioni e la configurazione SNS mi sembra corretta, la funzione lambda non viene mai richiamata.

La funzione lambda segue questi esempi:

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 funzione lambda funziona, e posso inviarlo testare i dati tramite la console AWS risultante in un messaggio postato a Slack.

Il bilanciamento del carico viene creato con una nuvola di allarme orologio corretta di aspetto:

enter image description here

sembra essere configurato l'allarme per inviare gli avvisi per il corretto tema SNS:

enter image description here enter image description here

C'è un abbonamento SNS a quell'argomento, con la funzione lambda come endpoint:

enter image description here

allarmi vengono attivati ​​ei messaggi inviati al tema corretto quando i fuochi d'allarme:

enter image description here

ma la funzione lambda non viene mai richiamato:

enter image description here

Tuttavia , se aggiungo manualmente l'argomento SNS come "origine evento" sulla funzione lambda, lo è invocato quando si attiva l'allarme e vengono inviati messaggi Slack.

enter image description here

Am I equivoco come collegare un allarme di orologio nuvola a una funzione lambda? O c'è un piccolo dettaglio che mi manca?

Se questo approccio non può funzionare e l'unico modo per collegare una funzione lambda a un allarme di sorveglianza cloud è aggiungere l'argomento SNS come "origine evento", qual è il modo appropriato per farlo tramite i modelli AWS CloudFormation? Non vedo un modo ovvio per modificare una risorsa esistente come una funzione lambda fissa.

Ecco il mio CloudFormation Template:

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

Grazie!

-Neil

+0

Oggi stavo impostando questo da solo così posso confermare che funziona. Non vedo perché quello che hai fatto non lo sia. –

+0

Grazie. Non è un processo di creazione di CloudFormation, ho accumulato uno stack circa 10 volte e il risultato è lo stesso (cioè nessuna chiamata di funzione lambda) –

+0

Vai in CloudFormation nella console e verifica che l'argomento SNS sia impostato. Se si è verificato un errore, dovrebbe apparire lì. A parte questo, mi sembra corretto ... –

risposta

4

AWS rilasciati (~ 3 giorni fa) un progetto per l'integrazione molle con AWS CloudWatch utilizzando lambda sia in pitone e nodejs: https://aws.amazon.com/blogs/aws/new-slack-integration-blueprints-for-aws-lambda/

Detto questo, ho anche avuto lo stesso problema mentre tu, seguendo i passaggi menzionati nel progetto, non ricevo gli allarmi finché non aggiungo manualmente l'argomento SNS come "sorgente di eventi" sulla funzione lambda. Ulteriori indagini mi portano a questa domanda: Can't create a SNS Event source on a Lambda function using CloudFormation

E infine la lettura della documentazione AWS: 1) http://docs.aws.amazon.com/lambda/latest/dg/intro-core-components.html

Amazon SNS mantiene la mappatura di origine dell'evento tramite la configurazione di sottoscrizione argomento (non v'è alcuna API AWS Lambda a configurare questa mappatura).

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

Configurazione Amazon SNS con Lambda endpoint con l'AWS gestione Console

concluso che la sottoscrizione al momento dovrebbe essere fatto tramite la console AWS gestione

Riepilogo: al momento l'unico modo per configurare Amazon SNS con Lambda Endpoint è tramite AWS Management Console

Bonus: domanda simile con la stessa risposta: AWS Lambda scheduled event source via cloudformation

0

CloudWatch evento pianificato ha ora Lambda un bersaglio nativo. enter image description here

inoltre è possibile aggiungere un evento in programma per cloudformation per lambda

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

Assicurati di dare l'argomento permesso di SNS per richiamare la funzione lambda. Il CloudFormation per l'autorizzazione sarà simile al seguente:

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