Amazon CloudWatch Logsからslackにエラーログを投稿する
今回は、うまく行った構成と、うまくいかなかった構成を記述しています。
目的
AWS上のアプリケーションが、エラーログを吐いたときに、Slackにエラー情報を通知し、運用の迅速化を図る。
準備
- AWS上のアプリケーションがAmazon CloudWatch Logsに出力するように設定しておいてください。この部分は割愛します。
- また、ログの出力をJSON形式で出力します。それにより、クエリが使用できるようになります。
うまくいかなかった構成
Amazon CloudWatch Alarmsの構成
Amazon CloudWatch Logs -> Amazon CloudWatch メトリクス -> Amazon CloudWatch Alarms -> Amazon SNS Topics -> AWS Chatbot Slack
で通知するように設定してみました。
通知はできたのですが、エラーがあったことしか通知されず。
通知でありメッセージ投稿ではない。
メッセージのカスタマイズなど必要な情報を伝えることができませんでした。
そんな気が初めからしていましたが。
lambda to AWS Chatbot Slack
Amazon CloudWatch Logs -> Amazon CloudWatch サブスクリプションフィルタ -> AWS Lambda -> Amazon SNS Topics -> AWS Chatbot Slack
エラーログの内容が送れなかったので、サブスクリプションフィルタとLambdaを使用してみました。
しかし、Amazon SNS Topics -> AWS Chatbot Slack
の部分は、上の通知には使用できるが、Lambdaから自由なメッセージの送信には現時点では対応しておらず、いろいろなパターンで出力してみましたが、ダメでした。
Event received is not supported (see https://docs.aws.amazon.com/chatbot/latest/adminguide/related-services.html ):
というメッセージがチャネルのログに出力されました。
うまく行った構成
Amazon CloudWatch Logs -> Amazon CloudWatch サブスクリプションフィルタ -> AWS Lambda -> Slack incoming webhook
AWS Chatbot Slack がうまくいかなかったので、直接Slackに送るようにしました。
AWSだけで完結したかったのですが。
それぞれの設定の資料は以下です。
Amazon CloudWatch サブスクリプションフィルタ
フィルターに
{ $.level= "ERROR" }
に設定する。ログレベルがERRORの場合に出力されるようになります。
AWS Lambda
Amazon CloudWatch サブスクリプションフィルタ
からエラーログを受け取り、整形し、
Slack incoming webhook
にわたす処理が必要です。
ログ受け取りは、base64とgzipを使用します。
下記参照
Slack
下記ページから設定し、
URLを取得し、
URLにメッセージを送れば連携が完成します。