AWS上のアプリの障害監視をAIに任せる(DevOps Guru + Chatbotのカスタム通知)
はじめに
AWSでアプリケーションを運用中の皆様、Amazon DevOps Guruはご存知でしょうか。
細かい挙動は置いておいてこのサービスに期待できることを簡単に書くと、サービスを有効化するだけでAIがアプリケーションの障害を自動検知してくれるサービスです。
AIがやることなので全てを検知してくれる保証はないですが、CloudWatch等で障害通知の設定を手動でするだけでは漏れてしまう想定外の問題も検知できますので、有効化しておくと運用が捗ります。
この記事では以下のことを実施します。
- Amazon DevOps Guruで障害を自動検知する
- 検知した障害をChatbotのカスタム通知でSlack通知する
詳細は後で書きますがカスタム通知を使う理由は、AIによるDevOps Guruの通知は可読性が低いので運用する人間が耐えられない為です。
通知のアーキテクチャ
アイコンを見るとChatbotがAIっぽいですが実際はDevOps GuruがAIです。
Amazon DevOps Guru について
ドキュメントを見てみよう
達人???
ののの???
・・・どなたか翻訳していただけないでしょうか
機能を有効化しよう
ドキュメントを読んでもイマイチ内容が分かりませんでしたが、使い方は簡単です。
AWSのコンソールからご利用開始にあたって
のボタンを押下して有効化するだけです。
通知をしよう
DevOps Guruから直接SNSへの通知を設定をするこが出来ますが、今回はこれは使用しません。というのも、、、
- 通知のフォーマットが謎のJSONになるのでChatbotに対応していない
- メールで送るとしても、人間が謎のJSONを読むのはツラい
ではどうするかですが、最初に構成図を書いた通りEventBridgeからSNSとChatbotを経由してSlackに通知を設定します。
SNSのトピックとChatbotを設定する
Slackに配信する為のSNSやChatbotの設定はググればやり方が出てくるのでこの記事では記載は省略します。設定しておいてください。
Amazon EventBridgeを設定する
EventBridgeのルールを作成し、イベントパターンを次のように設定してください。
(詳しい方は、通知したい内容に応じて自由にカスタマイズしてください。)
また、ターゲットはChatbotと連携させたSNSトピックを指定してください。
{
"source": ["aws.devops-guru"],
"detail-type": ["DevOps Guru New Insight Open"],
"detail": {
"insightSeverity": ["high"]
}
}
障害を発生させよう
障害が発生するとSlackに通知が飛びます。
はい。EventBridge経由にすることでSlackへ通知することはできました。しかし謎フォーマットの改善はされていないので、私には内容の解読が困難です。
実際にこの状態でしばらく運用をしていましたが、通知が意味不明で放置されてしまい、しかも他の有効な通知も埋もれてしまって誰も通知を見なくなるという、とても良くない状態に陥りました。
AWS Chatbotの通知をカスタマイズしよう
カスタマイズした通知がこちらです。
これは、Lambdaがエラーになったときの通知です。
また、別の通知も貼っておきます。
これは、DBで書き込み遅延が発生したときの通知です。
元の通知と比べると、かなりマシになったのではないでしょうか。
Chatbotのカスタム通知とは?
2023年9月に導入されたChatbotの新機能になります。
かつては、AWS Chatbotの通知内容はカスタマイズすることが出来ず、通知元のAWSのサービス毎に決まったフォーマットに当てはめなければ、Slackに通知することが出来ませんでした。
このため、Amazon DevOps Guruの通知も先程貼った読解困難な通知しか送ることが出来ませんでした。
カスタム通知機能が導入されたことで、(ある程度)カスタムした内容でSlack通知が出来るようになりました。概要はクラメソさんの記事をみれば、大体分かります。詳細は公式のドキュメントを読みましょう。
設定方法
クラメソさんの記事を読めば分かりますが、EventBrigeルールのターゲットで入力トランスフォーマーを使うことで、元の通知をカスタム通知に変換することが出来ます。
具体的には
ターゲット入力トランスフォーマーを次のように設定しました。
{
"0-ResourceId": "$.detail.anomalies[0].sourceDetails[0].dataIdentifiers.ResourceId",
"0-ResourceType": "$.detail.anomalies[0].sourceDetails[0].dataIdentifiers.ResourceType",
"0-name": "$.detail.anomalies[0].sourceDetails[0].dataIdentifiers.name",
"0-namespace": "$.detail.anomalies[0].sourceDetails[0].dataIdentifiers.namespace",
"insightName": "$.detail.insightName",
"insightUrl": "$.detail.insightUrl",
"time": "$.time"
}
テンプレートを次のように設定しました。
{
"version": "1.0",
"source": "custom",
"content": {
"textType": "client-markdown",
"title": "DevOpsGuruがお怒りです :face_with_symbols_on_mouth: <insightName>",
"description": ":face_vomiting: なにか問題が発生したみたい[<time>]",
"nextSteps": [
"ココを見る : <insightUrl>"
],
"keywords":[
"<0-name>",
"<0-namespace>",
"<0-ResourceType>",
"<0-ResourceId>"
]
}
}
配列のデータを1つしか拾っていないですが、複数個拾っても中身が同じことが殆どで冗長でした。今後、実際に運用しながら通知の調整やカスタマイズはしていきたいと思います。
以上です。
関連記事
AWS Chatbotのカスタム通知に関する関連記事
2年以上前に書いた記事をChatbotにカスタム通知が追加されたことを受けて更新しました。
過去の記事は更新しても読まれない寂しさがあるので、宣伝のためにここに貼っておきます。
運用に便利なAWSサービスの記事
ONにするだけで使える運用系サービスをまとめています。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion