こんにちは。エキサイト株式会社の三浦です。
クラウド化・コンテナ化が普及してきた昨今、AWS ECSでWebアプリケーションを構築する場面が増えてきているのではないでしょうか。 また、Webアプリケーションを構築する際にアクセスログやエラーログを保存しておくことは、サービスの運営のためにほぼ必須と言っても良いでしょう。
ECSでアプリケーションを構築する場合、デフォルトではCloudWatchにログを流すことになりますが、CloudWatchへのログの保存は思いの外コストが掛かってしまうものです。
そこでここでは、ログ保存のコスト削減のためにどんな方法があるのか、そしてそれぞれにどんなメリット・デメリットがあるのかを紹介していきます。
ログ保存の流れ
ログの保存は、
- コンテナからログを送信する
- ログを保存しておく
という流れになっています。 この内、
2. ログを保存しておく
については、特別な理由がなければS3に保存するということで構わないと思います。 CloudWatchに比べてS3のほうが保存コストが安く、また Amazon Athena を利用することで、SQLクエリを使ってファイルの中身を閲覧することが可能です。
CloudWatchにもデフォルトで「S3にログをエクスポートする」機能が存在するので、Lambdaの定期実行等で一定時間以上経ったログをS3にエクスポートすることができます。
今回は、
1. コンテナからログを送信する
に焦点を当てていきます。
ログ流し先を変更する方法
ECSではデフォルトでCloudWatchにログを流してくれますが、CloudWatch以外にログを流すためには一工夫必要です。
Fluent Bit をログルータとして利用することで、Fluent Bitで提供している向き先にログを流すことができるようになります。
大量のログでも大してCPUやメモリを使うことはないので、気にせず使ってよいのではないでしょうか。
ログ流し先3選
ここからは実際に私が試したログ流し先3つと、それぞれのメリット・デメリット紹介します。
CloudWatch
CloudWatchを使用するのも、必ずしも悪いわけではありません。
メリット
- 欠損なくログを流すことができる
- 準備がほとんど必要ない
デメリット
- コストが掛かる
- S3にログをエクスポートする場合、ひと手間掛かる
S3
Fluent Bitを使えば、CloudWatchを使用せず直接S3にログを流すことが可能です。
メリット
- コストが非常に安い
デメリット
- EFSなどの共通ストレージ等を使用しないと、コンテナの破棄のタイミングによってはログが欠損する可能性がある
Firehose -> S3
Fluent Bitから Amazon Kinesis Data Firehose にログを流し、それを今度はFirehoseからS3に流す方法です。
メリット
- CloudWatchを使う方法に比べてコストが安い
- 欠損なくログを流すことができる
デメリット
- あらかじめFirehoseの準備をしておく必要がある
- ログが大量にある場合、デフォルトのFirehoseのスペックでは不足する場合があり、その場合はAWS側に申請してスペックを上げて貰う必要がある
- S3に直接流す方法に比べてコストがかかる
まとめ
以上から、ユースケースとして、
- ログの欠損が絶対に起きてはならない場合 -> CloudWatchかFirehose - 多少ならログが欠損しても良い場合 -> S3
を選ぶのが良いかと思います。
また、今回はこの3つのみを紹介しましたが、サードパーティのアプリケーションを使用するなどログの保存方法は他にも存在します。 場合によってはそちらを検討してみても良いでしょう。
ログの保存は必須であるからこそ、可能な限りコスパよく保存していきたいものです。 特にサービスへのアクセスが増え、ログのコストが気になりだした方は、一度検証してみると良いのではないでしょうか。