·조회수 44
CloudWatch + Lambda + S3でログを収集する
はじめに
サーバーレスでウェブサービスを実装しています。サーバーレスは使用した分だけお金を支払うサービスなので、ユーザーがどれだけAPIを使用したかを測定したかった。最も簡単な方法は、APIを呼び出すたびにDBに記録する方法ですが、これは非効率的です。そこで、CloudWatchに蓄積されたログを一定時間ごとに取得して処理した後、処理された情報のみをDBに保存することにしました。
サーバーレスでAPIはAPI Gateway + Lambdaを介して実行されます。そして、API呼び出し中に生成されたすべてのログは特別な措置を取らなくても自動的にCloudWatchに記録されます。これを1時間ごとにS3に移動するように設定しました。そして移動が完了したら、S3から1時間分のログを読み取ってAPI呼び出し回数をまとめてDBに保存すれば終わりです。
このように構成した理由は次のとおりです。
- CloudWatchのログをS3に移動した理由は、S3の保管コストがCloudWatchよりも安価であるためです。
- 1時間ごとにユーザーの利用量を計算してDBに保存する理由は特にありません。私のサービスのダッシュボードでユーザーごとの利用量を表示する際、最小単位が1時間であるためです。
進行方法
-
CloudWatchに保存されたログをS3に移動する際は、aws-sdkでサポートされているCloudWatch.createExportTaskを使用しました。cronスケジュール表現を使用して1時間ごとにLambdaを実行して簡単に移動しました。
-
ログは分析と管理を容易にするためにJSON形式で保存しました。lambda-logライブラリを使用してJSON形式で保存しました。
その後は簡単です。ログファイルを必要な形式に加工して保存すれば終わりです。
結局、何もないように見えますが、AWSの権限の問題や、LambdaログがどのようにCloudWatchに保存されるかを調べるのに多くの時間を費やしました。

김지식
웹, 앱 개발자입니다.