このページについて
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
}
}
}
メール
件名をアラーム名に設定できており、本文も良い感じにカスタマイズできました。

おわりに
それぞれの構成でカスタマイズできる・できないは異なりますが、ケースバイケースでどの構成にするか選択すれば良いと思います。
通知メールをカスタマイズしたい人の参考になれば幸いです。