CloudWatchLogsの内容をフィルタリングしてLambdaで通知させたい

posted in: AWS | 0

こんにちは。Amazonの犬、サカイです。
Dashボタンは我が家に2つあります。(じゃがりこ、柿の種)

AWSでWindows Serverを使用していて、イベントログ監視をするために、
CloudWatchLogsを使いたいな~、って人は少なく無いと思います。
ただ、SSMエージェント等を使えば今では簡単に実現可能ですね。

それに留まらず、WarningやError系のレベルだったらメール通知なんかもしたいな~、なんて欲張りな人も
いると思います。

そんな欲張りさんな人向けに、優しい方がLambdaで実現方法を共有して下さっています。

cloudwatchlogs -> lambda -> SNSを試してみた
https://qiita.com/sadayuki-matsuno/items/83b70ee97755e534764f

ただ、僕はもっと欲張りさんなので
通知される内容で、特定の文字が入ったメッセージは送信されないようにフィルタしたいな~、と思っちゃいました。
※CloudWatchLogsのメトリクスフィルタで実現出来ない事はないのですが、
省きたい文字列がフィルタパターンの上限に達しちゃったので他には方法は無いかを考えました。

思っちゃったものは仕方ないので、上記のLambdaでのメール送信スクリプトをベースに改良を加えました。

関数を作る

メール送信スクリプトのフローと併せて、どういう事がしたいかをまとめると

  1. WindowsServer上でError系レベルのイベントログが書き込まれる
  2. CloudWatchLogsへと転送される
  3. CloudWatchLogsへと転送されてきたイベントをトリガーにLambdaが発火
  4. AWSのSNSトピックに登録されているメーリングリスト宛にイベントログ内容なんかを送信
  5. ただ、特定の文字列がイベントログに入っている場合はメール送信しない!

参考にさせて頂いたメール送信プログラムでは、4番までしか実現されていないため、5番目を実現する関数を作りました。

やっていることは至極簡単で、省きたい文字列を配列に入れ、forで回しているだけです。
後は動作確認をします。
下記コマンドをコマンドプロンプトから実行して、強制的にエラーを出してみましょう!

メール送信がされなくなったら大成功です。
なお、省きたいメッセージ全てを入れる必要は無く、一部分だけでも一致すればフィルタされます。

LINEで送る
Pocket