このページについて
CloudWatchアラームでメール通知させる場合のメール件名、本文のカスタマイズする方法について、なかなかハマったので今回試してみた3パターンの違いを残しておきます。
- SNSを使う構成
- 入力トランスフォーマーを使う構成①
- 入力トランスフォーマーを使う構成②
やりたいこと
CloudWatchアラームでメール通知させる場合のメール件名、本文のカスタマイズしたい。
- メール件名
- 指定の文言を入れたい。今回はわかりやすくアラーム名を入れたいとする。
- メール本文
- 良い感じに整形したい。
結論
この構成とすることで、メール件名、本文ともにカスタマイズすることができます。
「CloudWatchアラーム → EventBridge(入力トランスフォーマー設定で加工) → SNS → メール通知」
前提
今回は簡単にEC2のCPU使用率のアラームで試したいと思います。
CloudWatchアラーム設定
- アラーム名: Critical CPUUtilization matsuki-test > 90
SNSを使う構成
構成
「CloudWatchアラーム → SNS → メール通知」
CloudWatchアラームでSNS通知を設定する必要があります。
この構成の場合、メール件名、本文ともにカスタマイズはできません。
メール
件名はアラーム名が使用されます。
本文は英語で以下のような文面となっています。
言ってることはわかるんですが、見づらいですよね。。
入力トランスフォーマーを使う構成①
構成
「CloudWatchアラーム → EventBridge(入力トランスフォーマー設定で加工) → SNS → メール通知」
ただし、この構成の場合、メール件名がカスタマイズできません。
その上、「AWS Notification Message」 固定になってしまいます。
EventBridge
- イベントパターン
- CloudWatchアラームが「ALARM」状態になった時と指定
{ "source": ["aws.cloudwatch"], "detail-type": ["CloudWatch Alarm State Change"], "detail": { "state": { "value": ["ALARM"] } } }
入力トランスフォーマー
ターゲットをSNSトピックにして、「追加設定」から「入力トランスフォーマー」の設定を行います。
「CloudWatch Alarm State Change」のサンプルイベントを使って、出力を確認します。
- 入力パス
{ "AlarmName": "$.detail.alarmName", "MetricsName": "$.detail.configuration.metrics[0].metricStat.metric.name", "Reason": "$.detail.state.reason", "Time": "$.time" }
- 入力テンプレート
"関係各位" "アラートを検知しましたのでご連絡させていただきます。" "## アラート詳細" "検知時刻(GMT): <Time>" "アラーム名: <AlarmName>" "メトリクス名: <MetricsName>" "理由: <Reason>"
入力テンプレート入力の際、以下を注意してください。
改行を含むテンプレートを保存したときに Invalid InputTemplate エラーが表示される場合は、各行を二重引用符で閉じます。
https://repost.aws/ja/knowledge-center/eventbridge-human-readable-notifications
最後にサンプル出力の内容を確認してください。
メール
件名は、「AWS Notification Message」 固定。
本文はカスタマイズ可能。
入力トランスフォーマーを使う構成②
構成
「CloudWatchアラーム → EventBridge(入力トランスフォーマー設定で加工) → StepFunctions → SNS → メール通知」
この構成の場合、メール件名、本文がカスタマイズ可能です。
EventBridge
- イベントパターン
- CloudWatchアラームが「ALARM」状態になった時と指定
- ①と同様
入力トランスフォーマー
ターゲットをStepFunctionsステートマシンにして、「追加設定」から「入力トランスフォーマー」の設定を行います。
「CloudWatch Alarm State Change」のサンプルイベントを使って、出力を確認するのは①の時と同様です。
- 入力パス
- ①と同様
{ "AlarmName": "$.detail.alarmName", "MetricsName": "$.detail.configuration.metrics[0].metricStat.metric.name", "Reason": "$.detail.state.reason", "Time": "$.time" }
- 入力テンプレート
- StepFunctionsに渡す「subject」「message」の定義を行う
{ "subject": "<AlarmName>", "message": "関係各位 \n アラートを検知しましたのでご連絡させていただきます。 \n\n ## アラート詳細 \n 検知時刻(GMT): \"<Time>\" \n アラーム名: \"<AlarmName>\" \n メトリクス名: \"<MetricsName>\" \n 理由: \"<Reason>\"" }
StepFunctions
- 定義
- メール通知用のSNSトピックにパブリッシュする定義を行う
- EventBridgeから渡された「subject」「message」を使用する
{ "StartAt": "PublishSns", "States": { "PublishSns": { "Type": "Task", "Resource": "arn:aws:states:::sns:publish", "Parameters": { "TopicArn": "{対象SNSトピックのARN}", "Message.$": "$.message", "Subject.$": "$.subject" }, "End": true } } }
メール
件名をアラーム名に設定できており、本文も良い感じにカスタマイズできました。
おわりに
それぞれの構成でカスタマイズできる・できないは異なりますが、ケースバイケースでどの構成にするか選択すれば良いと思います。
通知メールをカスタマイズしたい人の参考になれば幸いです。