CloudWatchアラームの静観
CloudWatchメトリクスをCloudWatchアラームで監視し、アクションとしてSNSのメール通知を使用することで、メール等を利用したアラート監視が可能です。
この場合、メンテナンスなどでアラートの静観を行いたい場合は、アラートアクションの有効化・無効化で対応が可能です。また、先日リリースされたCloudWatchアラームミュートルール機能を利用すれば、予め予定していたスケジュールでのアラート静観設定が可能です。
EventBridgeでの監視
CloudWatchアラームでの監視とは別に、EventBridgeを使用してCloudWatchメトリクスを監視する方法もあります。
この場合、CloudWatchではアクションは何も指定せず、EventBridge側でCloudWatchのステータスを監視して、ステータスに変化が発生した際にSNSなどの次のアクションを実行します。
{ "detail-type": ["CloudWatch Alarm State Change"], "source": ["aws.cloudwatch"] }
この方法では、CloudWatch側の設定(有効化・無効化)ではアラート静観を行うことができません。EventBridgeの検知条件で特定のアラートを除外する設定は可能ですが、都度条件を書き換えるのは大変です。そこで今回は、EventBridgeでCloudWatchメトリクスを監視する際に、DynamoDBと組み合わせて静観設定を行う仕組みを作成しました。
事前にDynamoDBに静観対象のアラート名を追加しておきます。CloudWatchのステータスをEventBridgeで検知する箇所は同様ですが、ステータス変化を検知後、Lambdaを実行します。このLambdaでは、DynamoDBに登録されたアラートを静観対象とします。
コードは下記の通りです。alarm-mute-tableというテーブル内にMute=Trueのアラートは、後続のSNS送信を実行せず、アラート静観を行います。
import json
import boto3
sns_client = boto3.client('sns')
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('alarm-mute-table')
def lambda_handler(event, context):
alarm_name = event.get('detail', {}).get('alarmName')
# DynamoDBでミュート確認
response = table.get_item(Key={'AlarmName': alarm_name})
if response.get('Item', {}).get('Mute') == True:
return {'statusCode': 200, 'body': 'Muted'}
# SNS送信
sns_client.publish(
TopicArn='arn:aws:sns:ap-northeast-1:123456789012:alert-topic',
Message=json.dumps(event, indent=2),
Subject=f"CloudWatch Alarm: {alarm_name}"
)
return {'statusCode': 200, 'body': 'Sent'}
DynamoDBのレコードですが、下記のように静観対象としたいアラートを登録して、Muteをtrueとしておきます。
よく使用するものに関してはDynamoDBに登録しておき、普段はfalseの状態で通常監視、メンテナンス時はtrueのステータスに変更することで、アラート静観設定を行うことが可能です。





