Lambdaがエラーレベルのログを出力したらTeamsに通知する仕組みを作ってみたので関連情報をまとめておく。
目次
構成図
ポイント解説
エラーレベルのログ検出方法
Lambdaが出力したログ(CloudWatch Logs)が特定の条件にマッチしたら、CloudWatch Metricsにメトリクスを送信する仕組み(メトリクスフィルター)があるので、エラーレベルのログの検出はこれを使う。
フィルターを使用したログイベントからのメトリクスの作成 - Amazon CloudWatch Logs
LambdaのログをJSON形式で出力しておけば、「特定のキーの文字列が~だったら」という条件でメトリクスを送信できる。下記のようにlevel
というキーを出力しておけば、「levelがERRORだったら」メトリクスとして出力が可能になる。
{ "level" : "ERROR", "message" : "xxxxxxxxx" }
メトリクスフィルターの条件は
{ $.level = "ERROR" }
のように書けばOK。
フィルターとパターンの構文 - Amazon CloudWatch Logs
Teamsにメッセージを送信する方法
まずはTeams側でWebHookを作成して、TeamsのWebhookのURLを取得する。
TeamsのWebhookの作り方
受信 Webhook を作成する - Teams | Microsoft Learn
learn.microsoft.com
SNSのメッセージをTeamsに送信する方法はここにサンプルコードがある。
repost.aws
Teamsのメッセージ仕様
Teamsにそのまま文字列を送信しても問題ないが、メッセージをカスタマイズしてカード形式で送信することもできる。
ここではコネクタカードとアダプティブカードの2種類のメッセージ形式が紹介されている。
アダプティブカードはメッセージのカスタマイズが柔軟にできる。今回はコネクタカードでもやりたいことはできそうなので、コネクタカードを選択した。
コネクタカードだとこんな感じのカードが作れる。
learn.microsoft.com
その他にも色々なカードがある。違いは下記リンクを参照
learn.microsoft.com
コネクタカードの詳細な仕様はこちら
learn.microsoft.com
Playgroundがあるので、仕様を見ながらここでメッセージの形式を整える。
messagecardplayground.azurewebsites.net
今後の改善でやりたいこと
- 今は通知受信後にユーザーがエラーログを手動で検索するようになっているが、出力されたエラーログをプログラムで検索して、Teamsのメッセージに送信したい。エラーログを確認して、さらに詳細な解析が必要であれば、ログ検索サービスを使うイメージ。
- エラーが通知されたらJIRAやRedmineでチケットを作成して調査するのが基本なので、Teamsのメッセージ上でチケット作成ボタンを配置したい。チケットを自動作成するという方法もあるが、同じエラーが大量に発生した場合に困りそうなのでまずは自動化しないほうが良さそう。