takuroooのブログ

勉強したこととか

Lambdaがエラーレベルのログを出力したらTeamsにメッセージを通知する

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のメッセージ上でチケット作成ボタンを配置したい。チケットを自動作成するという方法もあるが、同じエラーが大量に発生した場合に困りそうなのでまずは自動化しないほうが良さそう。