このページについて

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
    }
  }
}

メール

件名をアラーム名に設定できており、本文も良い感じにカスタマイズできました。

おわりに

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