CloudWatch Logsをさわってみたメモを残す。
CloudWatch Logsの位置付け
今までログ収集のベストプラクティスは最終的にS3に収集 → Glacierだったのが、収集場所としてCloudWatch Logsという選択肢が増えた感じ。
料金
- 今のところ以下のような感じらしい。
- 料金 - Amazon CloudWatch (リソースとアプリケーションのモニタリング) | アマゾン ウェブ サービス(AWS 日本語)
$0.50 per GB ingested
$0.03 per GB archived per month**
- 1ヶ月で100GBのログデータを取り込み、ログが圧縮されて20GBになるとすると、$50.60/月くらい。
- おそらくS3がバックエンドで使われており、保存の料金は安い感じ。
- ぱっと見で結構かかる気はするけど、EC2とEBSでログを保管することに比べたら安い感じ(運用保守もいらないし)。
100GB x $0.50 + 20GB x $0.03 = $50.60
収集したログの分類
収集されたログはLogStreamとLogGroup(LogStreamの集合)で分類される。
フィルタがLogGroup単位なので、LogGroupの中に別の種類のログ混ぜるのは止めた方が良さそう。
CloudWatch Logs Agentでのログ収集をやってみた
- CloudWatch Logsエージェントを検証してみた | mooappの検証見てるとログ収集まかせて良さそう。
# インストールスクリプト取得
$ wget https://s3.amazonaws.com/aws-cloudwatch/downloads/awslogs-agent-setup-v1.0.py
# インストール
# 対話モードでも可だけど以下のようにするとサイレントなので自動化に向きそう。
# 設定のプロトは対話モードで作るとか
$ sudo python awslogs-agent-setup-v1.0.py --configfile https://gist.githubusercontent.com/mechamogera/aa03714bede13b8c535f/raw/c24c3f51b6591a09cb815d337df9e60643d3ac98/awslogs.conf --region us-east-1 --non-interactive
Step 1 of 5: Installing pip ...DONE
Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE
Step 5 of 5: Setting up agent as a daemon ...DONE
------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo ./awslogs-agent-setup.py --region us-east-1 --only-generate-config'
------------------------------------------------------
# 最初から起動していて自動的に起動するようにもなっている
$ sudo service awslogs status
(pid 5795) is running...
$ sudo chkconfig awslogs --list
awslogs 0:on 1:on 2:on 3:on 4:on 5:on 6:on
# 設定ファイルの変更時はrestartすると反映された
AutoScaling対応について
一工夫必要そう。
- LogGroupでまとめておくと、フィルタがあるのでその範囲でリアルタイム監視できるし、現状動いている単体インスタンスのログも調べるのは出来そう。
- ただ、インスタンスが多かったり、入れ替わりが多かったりするとLogStreamが多くなって目的のログを捜すのが大変になりそう。
- 現状のAPIではLogGroup中のLogStream全てに対するSearchがない
- CloudWatch Logs Agentは複数ソースからの単一LogStreamをサポートしていない(CloudWatch Logs Agent Reference - Amazon CloudWatchのFAQs)
- 今のCloudWatch Logs Agentでは対応してないがLogStreamを日付別でわけて同じLogStreamに各インスタンスのログをソース情報を付与した上で集約できるといい?
ログ取得用のRubyスクリプトを作ってみた
LogGroupにLogStreamが多くなる場合、Management Console上でLogGroupから該当のログを見つけ出すのが大変そうなので作ってみた。
ただ、LogStreamが増えれば増えるほど取得に時間がかかりそう。