CloudWatchAlarmにLambdaでダウンタイム設定をいれてみた

2020.10.16

この記事は公開されてから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の監視もしっかりするようにして頂ければと思います。