アラームからの Lambda 関数の呼び出し - Amazon CloudWatch

アラームからの Lambda 関数の呼び出し

CloudWatch アラームは、次の場合を除き、特定の状態変化に対して Lambda 関数の非同期呼び出しを保証します。

  • 関数が存在しない場合。

  • CloudWatch が Lambda 関数を呼び出す権限がない場合。

CloudWatch が Lambda サービスに到達できない場合、または別の理由でメッセージが拒否された場合、CloudWatch は呼び出しが成功するまで再試行します。Lambda はメッセージをキューに入れ、実行の再試行を処理します。Lambda がエラーを処理する方法など、この実行モデルの詳細については、「AWS Lambda デベロッパーガイド」の「非同期呼び出し」を参照してください。

Lambda 関数は、同じアカウントまたは他の AWS アカウントで呼び出すことができます。

アラームアクションとして Lambda 関数を呼び出すアラームを指定する場合、関数名、関数エイリアス、または関数の特定のバージョンを指定することもできます。

アラームアクションとして Lambda 関数を指定する場合は、関数のリソースポリシーを作成して、CloudWatch サービスプリンシパルによる関数の呼び出しを許可する必要があります。

これを行う 1 つの方法は、次の例のように AWS CLI を使用することです。

aws lambda add-permission \ --function-name my-function-name \ --statement-id AlarmAction \ --action 'lambda:InvokeFunction' \ --principal lambda.alarms.cloudwatch.amazonaws.com \ --source-account 111122223333 \ --source-arn arn:aws:cloudwatch:us-east-1:111122223333:alarm:alarm-name

または、次の例のいずれかに似たポリシーを作成し、それを関数に割り当てることもできます。

次の例では、アラームが配置されているアカウントを指定して、そのアカウント (111122223333) のアラームだけが関数を呼び出せるようにします。

JSON
{ "Version": "2012-10-17", "Id": "default", "Statement": [{ "Sid": "AlarmAction", "Effect": "Allow", "Principal": { "Service": "lambda.alarms.cloudwatch.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:444455556666:function:function-name", "Condition": { "StringEquals": { "AWS:SourceAccount": "111122223333" } } }] }

次の例では対象範囲が狭いため、指定したアカウントの指定したアラームだけが関数を呼び出せるようになっています。

JSON
{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "AlarmAction", "Effect": "Allow", "Principal": { "Service": "lambda.alarms.cloudwatch.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:444455556666:function:function-name", "Condition": { "StringEquals": { "AWS:SourceAccount": "111122223333", "AWS:SourceArn": "arn:aws:cloudwatch:us-east-1:111122223333:alarm:alarm-name" } } }] }

ソースアカウントを指定しないポリシーは、混乱した代理問題に対して脆弱であるため、作成することはお勧めしません。

CloudWatch 調査に Lambda メトリクスを追加する

Lambda メトリクスをアクティブな CloudWatch 調査に追加できます。問題を調査する際、Lambda メトリクスは関数のパフォーマンスと動作に関する貴重なインサイトを提供できます。例えば、アプリケーションのパフォーマンスの問題を調査する場合、期間、エラー率、スロットリングなどの Lambda メトリクスが根本原因を特定するのに役立ちます。

CloudWatch 調査に Lambda メトリクスを追加するには:

  1. AWS Lambda コンソールの https://console.aws.amazon.com/lambda/ を開いてください。

  2. [モニタリング] セクションで、メトリクスを見つけます。

  3. メトリクスのコンテキストメニューを開き、[調査][調査に追加] を選択します。次に、[調査] ペインで、調査の名前を選択します。

CloudWatch から Lambda に送信されたイベントオブジェクト

Lambda 関数をアラームアクションとして設定すると、CloudWatch は Lambda 関数を呼び出したときに JSON ペイロードを Lambda 関数に配信します。この JSON ペイロードは、関数のイベントオブジェクトとして機能します。この JSON オブジェクトからデータを抽出して、関数で使用できます。以下は、メトリクスアラームのイベントオブジェクトの例です。

{ 'source': 'aws.cloudwatch', 'alarmArn': 'arn:aws:cloudwatch:us-east-1:444455556666:alarm:lambda-demo-metric-alarm', 'accountId': '444455556666', 'time': '2023-08-04T12:36:15.490+0000', 'region': 'us-east-1', 'alarmData': { 'alarmName': 'lambda-demo-metric-alarm', 'state': { 'value': 'ALARM', 'reason': 'test', 'timestamp': '2023-08-04T12:36:15.490+0000' }, 'previousState': { 'value': 'INSUFFICIENT_DATA', 'reason': 'Insufficient Data: 5 datapoints were unknown.', 'reasonData': '{"version":"1.0","queryDate":"2023-08-04T12:31:29.591+0000","statistic":"Average","period":60,"recentDatapoints":[],"threshold":5.0,"evaluatedDatapoints":[{"timestamp":"2023-08-04T12:30:00.000+0000"},{"timestamp":"2023-08-04T12:29:00.000+0000"},{"timestamp":"2023-08-04T12:28:00.000+0000"},{"timestamp":"2023-08-04T12:27:00.000+0000"},{"timestamp":"2023-08-04T12:26:00.000+0000"}]}', 'timestamp': '2023-08-04T12:31:29.595+0000' }, 'configuration': { 'description': 'Metric Alarm to test Lambda actions', 'metrics': [ { 'id': '1234e046-06f0-a3da-9534-EXAMPLEe4c', 'metricStat': { 'metric': { 'namespace': 'AWS/Logs', 'name': 'CallCount', 'dimensions': { 'InstanceId': 'i-12345678' } }, 'period': 60, 'stat': 'Average', 'unit': 'Percent' }, 'returnData': True } ] } } }

以下は、複合アラームのイベントオブジェクトの例です。

{ 'source': 'aws.cloudwatch', 'alarmArn': 'arn:aws:cloudwatch:us-east-1:111122223333:alarm:SuppressionDemo.Main', 'accountId': '111122223333', 'time': '2023-08-04T12:56:46.138+0000', 'region': 'us-east-1', 'alarmData': { 'alarmName': 'CompositeDemo.Main', 'state': { 'value': 'ALARM', 'reason': 'arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild transitioned to ALARM at Friday 04 August, 2023 12:54:46 UTC', 'reasonData': '{"triggeringAlarms":[{"arn":"arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild","state":{"value":"ALARM","timestamp":"2023-08-04T12:54:46.138+0000"}}]}', 'timestamp': '2023-08-04T12:56:46.138+0000' }, 'previousState': { 'value': 'ALARM', 'reason': 'arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild transitioned to ALARM at Friday 04 August, 2023 12:54:46 UTC', 'reasonData': '{"triggeringAlarms":[{"arn":"arn:aws:cloudwatch:us-east-1:111122223333:alarm:CompositeDemo.FirstChild","state":{"value":"ALARM","timestamp":"2023-08-04T12:54:46.138+0000"}}]}', 'timestamp': '2023-08-04T12:54:46.138+0000', 'actionsSuppressedBy': 'WaitPeriod', 'actionsSuppressedReason': 'Actions suppressed by WaitPeriod' }, 'configuration': { 'alarmRule': 'ALARM(CompositeDemo.FirstChild) OR ALARM(CompositeDemo.SecondChild)', 'actionsSuppressor': 'CompositeDemo.ActionsSuppressor', 'actionsSuppressorWaitPeriod': 120, 'actionsSuppressorExtensionPeriod': 180 } } }