きっかけ
先月CloudFrontのアクセス数などはCloudWatchで見れるようになりました。
しかしS3のアクセス状況はそのようなMetricsがなく、ログを解析するしかありません。
アクセス規模が小さくてEMRを持ち出すほど大げさではない場合、lambdaで処理すれば楽に可視化まで持って行けるのではないかと考えました。
実装
lambda2cw
ログファイルがPUTされた時にフックして、ログを解析してCloudWatchのカスタムメトリクスとしてPutMericDataを行います。
想定としては、bucket内のlogs/ から始まるキーがログファイルとなります。
デモ
負荷を発生
適当にabで負荷をかけます。
$ while [ 1 ] ; do ( ab -c 4 -n $(echo $[ $RANDOM % 100 ]) http://lambda2cw.s3-us-west-2.amazonaws.com/index.html & ); sleep 60 ; done
ローカル実行
$ node invoke.js input.json
lambda2cw Started
processing s3://lambda2cw/logs/2014-12-07-20-17-45-0C579438788F858B
20 metrics pushed. 46 left
20 metrics pushed. 26 left
20 metrics pushed. 6 left
6 metrics pushed. 0 left
SUCCESS undefined
lambda上で実行
2014-12-08 06:18:22 UTC 2014-12-08T06:18:22.723Z 6alf80tr75guxrdo lambda2cw Started
2014-12-08 06:18:24 UTC START RequestId: 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15
2014-12-08 06:18:24 UTC 2014-12-08T06:18:24.262Z 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 processing s3://lambda2cw/logs/2014-12-08-06-18-18-EF79DF76713F7118
2014-12-08 06:18:25 UTC 2014-12-08T06:18:25.563Z 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 20 metrics pushed. 38 left
2014-12-08 06:18:26 UTC 2014-12-08T06:18:26.742Z 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 20 metrics pushed. 18 left
2014-12-08 06:18:27 UTC 2014-12-08T06:18:27.903Z 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 18 metrics pushed. 0 left
2014-12-08 06:18:27 UTC END RequestId: 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15
2014-12-08 06:18:27 UTC REPORT RequestId: 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 Duration: 3798.96 ms Billed Duration: 3800 ms Memory Size: 128 MB Max Memory Used: 18 MB