web-dev-qa-db-ja.com

Cloudwatchアラームをラムダ関数に接続する方法

Awsクラウドウォッチアラームをラムダ関数呼び出しにどのように接続しますか?

AWS CloudFormationテンプレートを使用してクラウド形成スタックの一部として作成したELBにプログラムでクラウド監視アラームを追加しています。 Slackにメッセージを送信するラムダ関数にアラートを送信したいのですが。アラートは機能し、SNS構成は私には正しいようですが、ラムダ関数が呼び出されることはありません。

ラムダ関数は次の例に従います。

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

http://inopinatus.org/2015/07/13/hook-aws-notifications-into-slack-with-a-lambda-function/

ラムダ関数が機能し、awsコンソールを介してテストデータを送信できるため、Slackにメッセージが投稿されます。

ロードバランサーは、正しく見えるクラウドウォッチアラームで作成されます。

enter image description here

アラームは、正しいSNSトピックにアラートを送信するように設定されているようです:

enter image description hereenter image description here

そのトピックへのSNSサブスクリプションがあり、ラムダ関数がエンドポイントになっています。

enter image description here

アラームがトリガーされると、アラームがトリガーされ、メッセージが正しいトピックに送信されます。

enter image description here

しかし、ラムダ関数は決して呼び出されません:

enter image description here

ただし、ラムダ関数の「イベントソース」としてSNSトピックを手動で追加すると、アラームが発生し、Slackメッセージが投稿されたときに呼び出されます。

enter image description here

クラウドウォッチアラームをラムダ関数に接続する方法を誤解していますか?または、私が見逃している小さな詳細はありますか?

このアプローチが機能せず、ラムダ関数をクラウドウォッチアラームに接続する唯一の方法がSNSトピックを「イベントソース」として追加することである場合、AWS CloudFormationテンプレートを介してそれを行う適切な方法は何ですか?固定ラムダ関数などの既存のリソースを変更する明白な方法がわかりません。

これが私の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

14
Neil Cronin

AWSは(〜3日前)、pythonおよびnodejs: https://aws.Amazon.com/blogs/ aws/new-slack-integration-blueprints-for-aws-lambda /

とはいえ、私もあなたと同じ問題を抱えていたので、青写真に記載されている手順に従って、ラムダ関数の「イベントソース」としてSNSトピックを手動で追加するまで、アラームは表示されません。詳細な調査により、次の質問につながりました: CloudFormationを使用してLambda関数でSNSイベントソースを作成できません

そして最後にAWSドキュメントを読みます:1) http://docs.aws.Amazon.com/lambda/latest/dg/intro-core-components.html

Amazon SNSは、トピックサブスクリプション構成を介してイベントソースマッピングを維持します(このマッピングを構成するAWS Lambda APIはありません)。

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

AWSマネジメントコンソールでLambdaエンドポイントを使用してAmazon SNSを設定する

現時点でのサブスクリプションはAWSマネジメントコンソールから行う必要があると結論付けました

概要:現在のところ、Lambdaエンドポイントを使用してAmazon SNSを構成する唯一の方法は、AWSマネジメントコンソールを使用することです

ボーナス:同じ答えのある同様の質問: cloudformationを介したAWS Lambdaスケジュールされたイベントソース

6
Enrique Saez

CloudWatchのスケジュールされたイベントに、ネイティブターゲットであるLambdaが追加されました。 enter image description here

また、ラムダのcloudformationにスケジュールされたイベントを追加できます

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

Lambda関数を呼び出すためのアクセス許可をSNSトピックに必ず付与してください。権限の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" }
    }
}
0
BrianV