🐭

AmazonCloudWatchアラームのアラーム状態が続く限り、繰り返し通知されるように実装してみた

2024/11/07に公開

こんな方向けの記事です。

・CloudWatchAlarmを繰り返し通知させたい!
・CloudWatchアラームの1回の通知じゃ気付けない!
・CloudWatchがアラーム状態である限り、決められた間隔で何度も通知が来るようにしたい!
・CloudWatchアラームのリマインド通知を実装したい!
(全部同じこと言ってますね笑)

前提

・Yaml形式のCloudFormationで記述しています。
・Python3.12を使用しています。
・リマインド通知をさせたいCloudWatchアラームが存在していること。
・サブスクリプション登録済みのSNSトピックがあること

イメージ図

1、 CloudWatchアラームがアラーム状態が変わる。
2、EventBridgeEventsがCloudWatchアラームのイベントを受け取りLambdaに渡す
3、Lambdaが受け取ったデータを元に、EventBridgeSchedulerを起動する
4、EventBridgeSchedulerが決められた間隔でLambdaを起動する
5、LambdaがCloudWatchアラームのデータを取得してSNSにデータを送る
6、SNSが受け取ったデータを登録されているサブスクリプションに送信する。

今回のCloudFormationで作られるリソース

・IAMロール 3つ
・IAMPolicy 3つ
・EventBridgeEvents
・EventBridgeSchedulerGroup
・EventBridgeScheduler
・Lambda 2つ

さっそくご紹介

下記GitHubからYamlテンプレートを使ってCloudFormationのスタックを作成してください。
https://github.com/MOKOMAP/AmazonCloudWatchAlarm_remind-Notification

パラメータ補足
AWSAccountID:AWSのアカウントIDの12桁の数字を入力
CloudWatchAlarmArn:繰り返し通知させたいCloudWatchAlarmのARN
CloudWatchAlarmName:繰り返し通知させたいCloudWatchAlarmのアラーム名
RegionName:デプロイしたいリージョンID(東京Rの場合はap-northeast-1)
SNSTopicArn:メールを飛ばしたいSNSトピックのARN

検証

CloudWatchをアラーム状態にしてみましょう!

 
 
EventBridgeSchedulerがちゃんと有効化されましたね!

 
 
ちゃんと1分間隔でメールも届いています!(今回はschedulerを1分間隔にしています)



 
 
 
 
正常性が確認できたところで、今度はCloudWatchをOK状態にしてみましょう!

 
 
EventBridgeSchedulerがちゃんと無効化されてますね!
これでリマインドメールは止まります!

完璧ですね~。

補足

アラーム名とメール本文はLambdaのコードの改修が必要になりますが
お望みのものに柔軟に変更できると思います。
CloudWatch→SNSに直接飛ぶ構文と完全に同じにすることも可能でした。
※今回は「Alarm Details」のみ取得して本文に反映させています。

コードの補足

encoded_alarm_nameはアラーム名に日本語が入っている場合を想定して入れています。
アラーム名が英文の場合でも、そのまま使用できます。

あとがき

一応Amazon Web Services ブログにも繰り返し通知の記事があります。
今回の私の記事の方法とは異なりこちらの記事ではStepFunctionを使って行うものですが、
内包されているコード量が膨大で、読み解くのが面倒だったのと、カスタムするのが難しいな
と思ったので今回、作成しました。
今回も自己満足ですね笑
https://aws.amazon.com/jp/blogs/news/how-to-enable-amazon-cloudwatch-alarms-to-send-repeated-notifications/

Discussion