ElasticBeanstalkのログ保存方法
BeanStalk標準で入っているロギング機構についてまとめておきます。公式ドキュメントにも記載が少ないので、難儀しました。注意点とて、EBのバージョン次第で詳細な数字が変わっています。(例えば10MBのローテーションは、以前は30MBでした。ファイル名も変わってます)よって、ある程度わかってらっしゃる人向けのネタになってますので、その点よろしく。
ログの種類
EBには4種類のログがあります。
- bundle-log マネジメントコンソール(以降MC)のebの画面から取得できるログです。ユーザーが取りたいときに 能動的に取る ログとなります。Fullを指定した場合はこちら。
- tail-log マネジメントコンソール(以降MC)のebの画面から取得できるログです。こちらも能動的取るログですが、bundlelogと違って直近100行のみとなります。
- publish-log 一般的にログローテーションの直後にS3へpublishされるログです。
- systemtail-log よくわかりません。。
各種ログファイルを設定するファイルが、EBのインスタンス上にあります。その場所は
[root@host-a logrotate.d]# ls /opt/elasticbeanstalk/tasks/ bundlelogs.d publishlogs.d systemtaillogs.d sytemtaillogs.d taillogs.d
です。個々の設定は.exextensions等で変更することにより、ログ取得方法をコントロール可能です。
publishlogについて詳しく
EBはAutoScaling等を自動でやってくれるのはいいですが、何も設定していない状態だと、スケールイン(サーバーが減った時)に、ログファイルなどもそのままターミネイトされます。ログ消失ということです。デフォルトのApache/Accesslogの設定は下記
- ローテーションがかかったファイルのみをS3に上げる
- ローテーションのサイクルは1日 さらに圧縮前の容量で10MBを超えていない場合はローテーションしない
正直、気の利かない設定です。せめてHourlyでS3に保存するように変更します。
1) ebのMCで下記の設定をしておく。IAMロールもS3への書き込み権限もつける。
eb上での設定のSSはこれ
IAMロールも自動でつけてくれればいいのですが、、自前でやらないと多分ダメ。デフォルトだとaws-elasticbeanstalk-ec2-roleを参照しているので、これにS3への書き込み権限を追加します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1419320256000", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "*" ] } ] }
2) logrotateをDaily => Hourlyへ
mv /etc/cron.daily/logrotate /etc/cron.hourly/
3) webapp.confを10MB => 1Bとか絶対にローテーションする設定へ
/etc/logrotate.d/logrotate.elasticbeanstalk.httpd.conf /var/log/httpd/* { daily size 1 missingok notifempty rotate 10 sharedscripts compress dateext dateformat -%s create postrotate /sbin/service httpd reload > /dev/null 2>/dev/null || true endscript olddir /var/log/httpd/rotated }
logrotateの設定ファイルで重要なのは、 dateext と dateformat -%s です。logrotateの標準は、 hoge.log.1, hoge.log.2のように、連番となり番号付け替えを行いますが、この設定だとS3へアップロードするときに、削除、再作成は行わないため、アップロードができません。S3へのアップロードを行っているEBのジョブがあるのですが、それがそれほど賢くないので、S3上に同じ名前のファイルがある場合は、アップロードはできません。ですので、アクセスログ以外をアップロードしたい場合は、ローテーション後にユニークな名前になるように、logrotation側を仕込んでやる必要があります。
最後に、 /opt/elasticbeanstalk/tasks/publishlogs.d/httpd.confを見てみると
/var/log/httpd/rotated/*
と書いてあります。ここに他のファイルも追加したら、Publishの対象となります。ただし、S3へのアップロードは追記しないので、ローテーション後のファイルとなり、かつローテーション後のファイル名かぶりもNGです。よって、上記のように、UNIXタイムスタンプによるサフィックスをつけたローテーションとする必要があります。動作確認は
$ less /var/log/eb-publish-logs.log
で行えます。