Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何将cloudwatch警报连接到lambda函数_Amazon Web Services_Amazon Sns_Amazon Cloudformation_Aws Lambda_Amazon Cloudwatch - Fatal编程技术网

Amazon web services 如何将cloudwatch警报连接到lambda函数

Amazon web services 如何将cloudwatch警报连接到lambda函数,amazon-web-services,amazon-sns,amazon-cloudformation,aws-lambda,amazon-cloudwatch,Amazon Web Services,Amazon Sns,Amazon Cloudformation,Aws Lambda,Amazon Cloudwatch,如何将aws cloud watch报警连接到lambda函数调用 我正在以编程方式向ELBs添加一个cloud watch警报,我们通过AWS CloudFormation模板将其创建为云形成堆栈的一部分。我希望将警报发送到lambda函数,该函数将向Slack发布消息。虽然警报可以工作,而且SNS配置在我看来是正确的,但lambda函数从未被调用 lambda函数遵循以下示例: lambda函数可以工作,我可以通过aws控制台将测试数据发送给它,从而向Slack发送一条消息 创建负载平衡

如何将aws cloud watch报警连接到lambda函数调用

我正在以编程方式向ELBs添加一个cloud watch警报,我们通过AWS CloudFormation模板将其创建为云形成堆栈的一部分。我希望将警报发送到lambda函数,该函数将向Slack发布消息。虽然警报可以工作,而且SNS配置在我看来是正确的,但lambda函数从未被调用

lambda函数遵循以下示例:

lambda函数可以工作,我可以通过aws控制台将测试数据发送给它,从而向Slack发送一条消息

创建负载平衡器时,会出现外观正确的cloud watch报警:

警报似乎被配置为向正确的SNS主题发送警报:

该主题有一个SNS订阅,lambda函数作为其端点:

当警报触发时,会触发警报并将消息发送到正确的主题:

但lambda函数从未被调用:

但是,如果我在lambda函数上手动添加SNS主题作为“事件源”,则会在发出警报和发布松弛消息时调用它

我是否误解了如何将云监视警报连接到lambda函数?还是我遗漏了一个小细节

如果这种方法无法工作,并且将lambda函数连接到云监视警报的唯一方法是将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

AWS发布了(大约3天前)一份在python和nodejs中使用lambda与AWS Cloudwatch进行松散集成的蓝图:

话虽如此,我也遇到了与您相同的问题,按照蓝图中提到的步骤,直到我在lambda函数上手动添加SNS主题作为“事件源”,我才收到警报。进一步的调查使我想到了这个问题:

最后阅读AWS文档: (一)

Amazon SNS通过主题订阅维护事件源映射 配置(没有AWS Lambda API来配置此映射)

(二)

使用AWS管理配置带有Lambda端点的Amazon SNS 控制台

得出结论认为,目前的订阅应通过AWS管理控制台完成

摘要:目前,使用Lambda端点配置Amazon SNS的唯一方法是通过AWS管理控制台


奖励:回答相同的类似问题:

CloudWatch计划事件现在有一个本地目标Lambda。

您还可以为lambda向cloudformation添加计划事件

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

确保您为SNS主题授予了调用Lambda函数的权限。权限的CloudFormation将如下所示:

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

在编写时,为了将cloudwatch警报连接到lambda,您需要一个SNS主题

cloudwatch警报将SNS主题作为警报操作,SNS主题需要具有lambda:Invoke权限,此外还需要lambda订阅指定主题

云信息模板

如果您在cloudformation模板中有cloudwatch报警和lambda arn(arn字符串或同一模板中的资源),您可以将它们与资源AWS::lambda::PermissionAWS::SNS::Topic连接

例如,在本例中(添加默认的lambda arn值):

  • aws cloudformation创建堆栈--堆栈名称MyTest--模板正文file://mytest.yaml

这个问题不是Cloudwatch特有的,而是SNS主题/Lambda权限问题

另见:


我今天自己设置了这个,以便确认它是否有效。我不明白为什么你所做的事情没有成功。谢谢。这不是一个CloudFormation创建的小问题,我已经旋转了10次堆栈,结果是相同的(即,没有lambda函数调用)。在控制台中进入CloudFormation并验证SNS主题是否已设置。如果发生错误,它应该显示在那里。除此之外,我认为这是正确的……CloudFormation“事件”选项卡中没有记录任何错误。14:53:34 UTC-0800创建_COMPLETE AWS::SNS::Topic GenericSlackAlertSNSTopic物理ID:arn:AWS:SNS:us-east-1:[…]:v[…]-GenericSlackAlertSNSTopic-[…]8ZEX@JamesOgden如果你们有一个可以共享的工作cloudformation模板,您介意编辑并发布它吗?蒂亚!
AWSTemplateFormatVersion: '2010-09-09'

Parameters:

  LambdaArn:
    Type: String
    Description: The lambda arn, if lambda resource is in template change !Ref LambdaArn with !GetAtt LogicName.Arn
    Default: "[YOUR ARN]"

Resources:

  DummyTopic:
    Type: "AWS::SNS::Topic"
    Description: "sns topic to complete this dummy template, remove it when changing the cloudwatch alarm"
    Properties:
      TopicName: "mytest"

  CloudWatchAlarmInvocationAlarm:
    Type: "AWS::CloudWatch::Alarm"
    Description: "DummyAlarm change it (mainly Namespace, MetricName and Dimensions) to achieve your goal"
    Properties:
      Namespace: "AWS/SNS"
      AlarmDescription: "Dummy alarm"
      AlarmActions:
        - !Ref NotificationTopic
      MetricName: NumberOfMessagesPublished
      Statistic: "Sum"
      Dimensions:
        - Name: TopicName
          Value: !GetAtt DummyTopic.TopicName
      Period: 60
      EvaluationPeriods: 1
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: notBreaching   # missing data points will not trigger the alarm => maintain

  NotificationTopic:
    Type: "AWS::SNS::Topic"
    Description: "Sns topic that communicates directly with the lambda"
    Properties:
      TopicName: "MyNotificationTopic"
      Subscription:
        - Endpoint: !Ref LambdaArn
          Protocol: "lambda"

  LambdaInvokePermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      FunctionName: !Ref LambdaArn
      Action: "lambda:InvokeFunction"
      Principal: "sns.amazonaws.com"
      SourceArn:  !Ref NotificationTopic