AWS Elastic Beanstalk(以降EB) 標準で入っているロギング機構についてまとめておきます。公式ドキュメントにも記載が少ないので、難儀しました。注意点とて、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への書き込み権限もつける。
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
とか絶対にローテーションする設定へ
/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
で行えます。
元記事はこちらです。
「ElasticBeanstalkのログ保存方法」