この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、リサリサです。
料金的な問題や制約などで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の監視もしっかりするようにして頂ければと思います。