如何将AWS CloudWatch警报连接到Lambda函数调用?
我正在通过AWS CloudFormation模板以编程方式向我们创建的ELB添加CloudWatch警报,作为CloudFormation堆栈的一部分。我希望将警报发送到一个Lambda函数,该函数将把消息发布到Slack。虽然警报起作用,并且SNS配置对我来说似乎是正确的,但Lambda函数从未被调用。
Lambda函数遵循这些示例:
http://inopinatus.org/2015/07/13/hook-aws-notifications-into-slack-with-a-lambda-function/
Lambda函数已经运行,我可以通过AWS控制台发送测试数据并将其发布到Slack。负载均衡器已创建,并配备了正确的Cloud Watch警报。 警报似乎已配置为将警报发送到正确的SNS主题:
有一个针对该主题的 SNS 订阅,其中 Lambda 函数是其终端点:
警报被触发并发送到正确的主题,当警报触发时: 但是 lambda 函数从未被调用: 然而,如果我在Lambda函数上手动将SNS主题添加为“事件源”,则当警报触发并发布Slack消息时,它会被调用。 我是否误解了如何将 CloudWatch 警报连接到 Lambda 函数?还是有一些细节我忽略了?如果这种方法行不通,而将 Lambda 函数连接到 CloudWatch 警报的唯一方法是将 SNS 主题添加为“事件源”,那么通过 AWS CloudFormation 模板应该如何适当地完成呢?我没有看到明显的方法来修改现有资源,如固定 Lambda 函数。
以下是我的 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"
}
}
谢谢!
-neil