💬

【アップデート】AWS Chatbot でカスタム通知が可能に

2023/09/13に公開

ごあいさつ

おばんです。
AWS Chatbot でカスタム通知が可能になりました。
https://aws.amazon.com/jp/about-aws/whats-new/2023/09/custom-notifications-aws-chatbot/

助かる人

  • 今までAWS Chatbot が生成していた謎のメッセージをLambdaとIncomming Webhook 使って頑張ってカスタマイズしていた人
  • Lambdaコードが書けなくて謎の英語メッセージ通知を頑張って見ていた人(アタシだよ)

AWS Chatbot は様々なAWSサービスと統合し、Slack などで自動通知を受けることが出来たのですが、決まったメッセージ(しかも英語)しか受け取れないのが難点でした。
なのでアラートが埋もれたりオオカミ少年化したりして、結局独自にWebhookで実装するという 蛮行 が横行してました。
今回のアップデートでは、お作法.jsonに則れば任意のメッセージを通知することが出来るようになりました。特定の人やチームにメンションしたり、Slack絵文字を使ったりも可能です。最高や。
https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/custom-notifs.html

CloudWatch Alarm を料理

前提として、CloudWatch Alarm と AWS Chatbot は簡単に接続出来ます。アラームのアクションでChatbot用SNSトピックを指定するだけです。

実際アラームが上がるとこのような通知が届きますね。

これでも分かりやすいし良いんですが、もうちょっとカスタマイズしてみたいなって思いますよね。
今回のアップデートでそれが出来るようになったのでやっていきます。

EventBridgeルールを使います

Amazon EventBridgeルールと入力トランスフォーマーを使います。

イベントパターンで検知するアラームを指定

まず適当にルールを作成したら、「イベントパターン」の編集をします。

こちらに、通知したいCloudWatch Alarm からコピーしてきたイベントパターンを貼り付けます。

そうすると、EventBridgeくんがresourcesで指定したアラームの状態変化を自動検知してくれます。ワイルドカードも行けるみたいです。
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns.html

EventBridge は、イベントパターンに含まれていないフィールドをイベント内で無視します。
実際には、"": "" とワイルドカードを指定すると、イベントパターンに含まれないフィールドにも一致します。

また、detail.stateキーを指定すると、指定した状態のみを検知することも可能です。

次のイベントパターンは、Amazon EC2 の instance-termination イベントすべてを処理します。

{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["terminated"]
  }
}

入力トランスフォーマーでJSONメッセージをアレンジ

次に、入力トランスフォーマーを使用して、CloudWatch Alarm が発行するJSONをChatbotのお作法.jsonに強制返還してあげます。EventBridgeルールの編集から「ターゲットを選択」画面の追加設定で「入力トランスフォーマーを設定」を選択します。

サンプルイベントでCloudWatch Alarm State Changeを選んだうえで、テンプレートにお作法.jsonに則った通知したいメッセージをJSON形式で書いてあげます。
例えば今回は超簡単に、こんな感じで設定しました。

入力パス

{
    "MetricsInstance":"$.detail.configuration.metrics[0].metricStat.metric.dimensions.InstanceId",
    "detail":"$.detail.state.reason"
}

テンプレート

{
    "version": "1.0", 
    "source": "custom",    
    "content": {
        "textType": "client-markdown", 
        "title": ":warning: CPU使用率 90%超過",  
        "description": " @here: <MetricsInstance> のCPU使用率が90%を超えました。\n理由: <reason>"
        }
}

これで設定完了です。

Slackでテスト

無事に通知を確認できました。@here でメンショングループも正常に動作してます。

ちなみに個別ユーザーへのメンションは出来ません。API経由でも難しかったです。(@文字列 と UserIDという別の情報がありこれを紐づけないと個人メンションされない)
スコココッが聞きたい場合はユーザーグループでまとめると可能です。ただ有料プランのみらしい。

さいごに

もうちょっと汎用性高いテンプレートに見直してみます。
次回はConfig かSecurity Hub からきた通知をこれで受けてみようと思います。

参考にした記事

#DevelopersIO CloudWatch アラームの通知メールを少しでも読みやすくしたい https://dev.classmethod.jp/articles/human-readable-mail-from-cloudwatch/

Discussion