読者です 読者をやめる 読者になる 読者になる

/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

ELBのログをLambda、Norikra、Mackerelを使っていい感じに処理する

AWS Lambda Norikra Mackerel

ELBが結構504を返したりしていたりするので、Lambda、Norikra、Mackerelを使ってモニタリングできるように処理してみました。

S3 -> Norikra

ELBは適当に5分ぐらいの間隔でS3にログを出力するようにしておき、 S3のオブジェクト作成イベントをトリガに起動、Norikraに突っ込むLambdaを作成します。

ELBのログフォーマット*1は スペース区切りでrequestとuser-agentのみダブルクオートで囲まれる形でパースがめんどくさそうですが、 それってdelimiterにスペース、quotecharにダブルクオートを指定したcsvフォーマットではってことで、csvモジュールを使って読み込むとパースが楽です。(csvモジュールは文字コードの扱いがアレだったりしますが、ELBのログであれば文字コードでハマることはなさそうかなと思います)
Norikraへの投入はRestAPI経由で、RequestsでJSONを投げるだけです。

Norikraで集計

Norikra側で適当にELB単位で500系エラーを集計してみます。

その他ステータスコードでまとめて集計したり、レスポンスタイムの最大値、最小値、平均値を集計したりするのも良いですね。

Norikra -> Mackerel

Norikraから集計結果を取得、Mackerelのサービスメトリックに突っ込むLambdaを作成して、5分おきに実行するようにしておきます。 Mackerelのサービスメトリックは事前にWebコンソールから作成しておかないと404になるので作成を忘れずに。(適当なサービス名で投げれば自動で作ってくれると思っていてハマった。。。)

まとめ

Norikra以外の部分はサーバレスに実装できていい感じです。Norikraはメモリをモリモリ使うのでR3インスタンスで、ECSやBeanstalkを使ってDockerで構築すると捗ります。JVMの設定を弄るのを忘れずに。
ELBのログをいい感じに処理できました!

Enjoy!