前提
- 先日、実務で運用しているRailsアプリケーションをEC2からECSへ移行しました
- 移行自体は比較的スムーズに完了したものの、CloudWatch Logsのコストが爆増し、めっちゃ焦る
- レアケースだとは思いますが、メモとして残します
急激なCloudWatch Logsコストの増加
具体的には記載できませんが、CloudWatch Logsの使用料金が想定を遥かに超えていました。Cost Explorerで調査すると、ほぼ全てが以下の操作によるものでした。
- PutLogEvents
こちらの記事を参考に、出力したログの配分を確認したところ、
Railsからの大量のログ(特に本番環境)がCloudWatchへ送信されていることが原因でした。
原因:本番のRailsのログレベルがDEBUGになっていた
おそらく先人たちが本番環境でログの詳細調査を行った際?、RailsのログレベルをDEBUGに変更したままとなっていた模様。
そのため、膨大なログがCloudWatchに記録されていました。(お恥ずかしい話、今回の件まで、ログレベルそのものについてあまり考えたことがなく、全く違和感に気づきませんでした...)
本番環境では、通常infoまたはそれ以上のレベルが推奨される(Railsガイドより)ということも今回知りました。
対策:ログレベルをINFOへ変更
とりあえず、ログレベルを本来のINFOに修正してみました。
config/environments/production.rb
- config.log_level = :debug
+ config.log_level = :info
効果:CloudWatch Logsコストが90%削減
設定変更後の翌日、Billingダッシュボードを確認したところ、CloudWatch Logsのコストが劇的に低下しました。
結果として、約90%**のコスト削減に成功しました。
教訓
- ECS移行時や運用変更時は、環境設定を必ず再確認するべきでした
- 不要な詳細ログをCloudWatchに送信すると、予期せぬコストが発生します
- 本番環境のログレベルはinfo以上を推奨
- 同じような問題に遭遇した際は、ぜひログレベル設定を確認してみてください