目次
はじめに
こんにちは、ディーネットの山田です。
2023年12月にCloudWatch AlarmからAWS Lambdaをアクションとして実行できるようになったのは、小耳に挟んでおりましたが、実際に使ったことなかったので、触れてみました。
Amazon CloudWatch アラームにアラーム状態変更アクションとして AWS Lambda が追加
前提条件
- AWS Lambda関数は、簡易的なもの(どういったイベント内容が送信されるかをチェックする)を作成しました。
作業手順
1. AWS Lambda関数を作成
AWS Lambda関数を作成してください。
ランタイムは、Python系で最新の3.12を利用しました。
コードソースには、以下の内容を利用しました。
event で受け取った内容をloggingで出力するだけのコードです。
loggingで出力された内容は、CloudWatch Logsで確認ができます。
import json
import logging
# ログ出力の設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
# 受信したイベントの内容をログに出力
logger.info("Received event: " + json.dumps(event, indent=2))
# 関数を終了
return True
2. Lambda関数のポリシーステートメントを作成
Lambda関数を作成しただけでは、CloudWatch AlarmからLambdaアクションとして利用できないので、アクセス権限を付与します。
ステートメントIDは、任意のもので構いませんが、プリンシパルには、「lambda.alarms.cloudwatch.amazonaws.com」を入力してください。
3. CloudWatch AlarmからLambdaアクションでLambda関数を関連付け
CloudWatch Alarmで、Lambdaアクションからトリガーにしたいアラーム状態を選択し、関数に先ほど作成したLambda関数を選択します。
動作結果
実際にアラームのしきい値を超過させて動作を見てみました。
アクションが実行されたときにどういった履歴が残るか見てみました
Lambda関数を正しく実行できたら、アクションに対象Lambda関数のARNが表示されました。
Lambda関数のポリシーステートメントを設定しなかったらどうなるか見てみました
エラーが発生したときは、Lambda関数の実行ができなかったと表示されました。
Lambda関数にはどういったイベントが送信されるのか見てみました
CloudWatch Alarmがアラーム状態になった際の、イベント内容です。
[INFO] 2024-10-22T08:36:51.881Z 35f6224a-6c0a-4598-95da-448087af0871 Received event: {
"source": "aws.cloudwatch",
"alarmArn": "arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:CPU",
"accountId": "123456789012",
"time": "2024-10-22T08:36:51.543+0000",
"region": "ap-northeast-1",
"alarmData": {
"alarmName": "CPU",
"state": {
"value": "ALARM",
"reason": "Threshold Crossed: 1 out of the last 1 datapoints [100.0 (22/10/24 08:31:00)] was greater than or equal to the threshold (80.0) (minimum 1 datapoint for OK -> ALARM transition).",
"reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-10-22T08:36:51.541+0000\",\"startDate\":\"2024-10-22T08:31:00.000+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[100.0],\"threshold\":80.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-10-22T08:31:00.000+0000\",\"sampleCount\":2.0,\"value\":100.0}]}",
"timestamp": "2024-10-22T08:36:51.543+0000"
},
"previousState": {
"value": "OK",
"reason": "Threshold Crossed: 1 out of the last 1 datapoints [70.09106131652571 (22/10/24 08:24:00)] was not greater than or equal to the threshold (80.0) (minimum 1 datapoint for ALARM -> OK transition).",
"reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-10-22T08:29:51.539+0000\",\"startDate\":\"2024-10-22T08:24:00.000+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[70.09106131652571],\"threshold\":80.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-10-22T08:24:00.000+0000\",\"sampleCount\":5.0,\"value\":70.09106131652571}]}",
"timestamp": "2024-10-22T08:29:51.542+0000"
},
"configuration": {
"metrics": [
{
"id": "e6c9599d-424d-8e86-7535-f9de81256443",
"metricStat": {
"metric": {
"namespace": "AWS/EC2",
"name": "CPUUtilization",
"dimensions": {
"InstanceId": "i-12345678901234567"
}
},
"period": 300,
"stat": "Average"
},
"returnData": true
}
]
}
}
}
CloudWatch AlarmがOK状態になった際の、イベント内容です。
[INFO] 2024-10-22T08:29:51.886Z 63ded7cd-73ac-4ffd-9a4c-7f16b74674e4 Received event: {
"source": "aws.cloudwatch",
"alarmArn": "arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:CPU",
"accountId": "123456789012",
"time": "2024-10-22T08:29:51.542+0000",
"region": "ap-northeast-1",
"alarmData": {
"alarmName": "CPU",
"state": {
"value": "OK",
"reason": "Threshold Crossed: 1 out of the last 1 datapoints [70.09106131652571 (22/10/24 08:24:00)] was not greater than or equal to the threshold (80.0) (minimum 1 datapoint for ALARM -> OK transition).",
"reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-10-22T08:29:51.539+0000\",\"startDate\":\"2024-10-22T08:24:00.000+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[70.09106131652571],\"threshold\":80.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-10-22T08:24:00.000+0000\",\"sampleCount\":5.0,\"value\":70.09106131652571}]}",
"timestamp": "2024-10-22T08:29:51.542+0000"
},
"previousState": {
"value": "ALARM",
"reason": "Threshold Crossed: 1 out of the last 1 datapoints [90.42669630112837 (22/10/24 08:16:00)] was greater than or equal to the threshold (80.0) (minimum 1 datapoint for OK -> ALARM transition).",
"reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-10-22T08:21:51.544+0000\",\"startDate\":\"2024-10-22T08:16:00.000+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[90.42669630112837],\"threshold\":80.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-10-22T08:16:00.000+0000\",\"sampleCount\":2.0,\"value\":90.42669630112837}]}",
"timestamp": "2024-10-22T08:21:51.548+0000"
},
"configuration": {
"metrics": [
{
"id": "e6c9599d-424d-8e86-7535-f9de81256443",
"metricStat": {
"metric": {
"namespace": "AWS/EC2",
"name": "CPUUtilization",
"dimensions": {
"InstanceId": "i-12345678901234567"
}
},
"period": 300,
"stat": "Average"
},
"returnData": true
}
]
}
}
}
まとめ
- CloudWatch AlarmからLambdaアクションを実行した際にどういったイベント情報が送られるかわかりました。
- Lambda関数に送られるイベント内容の所感としては、Amazon SNSに通知している内容と同じように感じました。
- 使い道としては、CloudWatch Alarmのアクションを一つのLambda関数に集約して、プログラム処理を行い通知内容のカスタマイズや一括管理が行いやすいといったところでしょうか。
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ