CloudWatchAlarmにLambdaでダウンタイム設定をいれてみた
こんにちは、リサリサです。
料金的な問題や制約などでMackerel等を使わず、CloudWatchのみで監視を行いたいこともありますよね。
でも、CloudWatchAlarmではダウンタイムなど、監視の時間指定ができません。なので、Lambdaから監視したくない時間にアラームを無効化するようにしてみました。
※LambdaからCloudWatchAlarmの無効化、有効化をする方法です。Lambdaが正しく動かず有効化が出来なかった場合、そのアラームは無効化されたままの状態となってしまう危険性があります。この危険性をご理解頂いたうえで、参考にしていただければ幸いです。
やりたい事
CloudWatchAlarmのダウンタイムを作りたい。一時的にアラームの対象外にしたい。
ダウンタイムの開始時に対象のCloudWatchAlarmを無効化、ダウンタイムの終了時に対象のCloudWatchAlarmを有効化したい。
Lambdaを作る
Lambdaのサンプルコード
import boto3 def check_cloudwatch_alarm(alarm_name): client = boto3.client('cloudwatch') response = client.describe_alarms(AlarmNames=[alarm_name]) #Trueなら有効、Falseなら無効 print(f"ActionsEnabled:{response['MetricAlarms'][0]['ActionsEnabled']}") def lambda_handler(event, context): alarm_name = event['alarm_name'] action = event['action'] print("処理前") check_cloudwatch_alarm(alarm_name) cloudwatch = boto3.resource('cloudwatch') if action == 'enable': cloudwatch.Alarm(alarm_name).enable_actions() elif action == 'disable': cloudwatch.Alarm(alarm_name).disable_actions() print("処理後") check_cloudwatch_alarm(alarm_name)
Lambda実行パラメーター
有効化
{ "action": "enable", "alarm_name": "アラーム名" }
無効化
{ "action": "disable", "alarm_name": "アラーム名" }
Lambdaに追加するポリシー
「cloudwatch:EnableAlarmActions」と「cloudwatch:DisableAlarmActions」が必要です。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "cloudwatch:EnableAlarmActions", "cloudwatch:DisableAlarmActions", "cloudwatch:DescribeAlarms" ], "Resource": "arn:aws:cloudwatch:*:123456789012:alarm:*" } ] }
実行してみる
実行前
Lambda実行
以下のパラメーターで↑のLambda実行
{ "action": "disable", "alarm_name": "TestDowntimeAlarm" }
実行後
無効になりました。
時間起動の設定をする
CloudWatchEventsを設定します。
※入力パラメーターを指定しないといけないので、Lambdaの編集画面から「トリガーを追加」では設定できません。
CloudWatchEventsからイベントを作成。入力の設定の「定数(JSONテキスト)」に入力パラメータを設定します。
最後に
冒頭にも書きましたが、Lambdaが正しく動かず有効化が出来なかった場合、そのアラームは無効化されたままの状態となってしまう危険性があります。サンプルのコードはシンプルにするために、正しく動いたかどうかの確認等いれていませんが、ActionsEnabledが正しく変更されたかを確認するようにして、Lambdaの監視もしっかりするようにして頂ければと思います。