こんにちは、cloudpack今岡 です。

AWS Elastic Beanstalk(以降EB) 標準で入っているロギング機構についてまとめておきます。公式ドキュメントにも記載が少ないので、難儀しました。注意点とて、EBのバージョン次第で詳細な数字が変わっています。(例えば10MBのローテーションは、以前は30MBでした。ファイル名も変わってます)よって、ある程度わかってらっしゃる人向けのネタになってますので、その点よろしく。

ログの種類

EBには4種類のログがあります。

  1. bundle-log
    • マネジメントコンソール(以降MC)のebの画面から取得できるログです。ユーザーが取りたいときに 能動的に取る ログとなります。Fullを指定した場合はこちら。
  2. tail-log
    • マネジメントコンソール(以降MC)のebの画面から取得できるログです。こちらも能動的取るログですが、bundlelogと違って直近100行のみとなります。
  3. publish-log
    • 一般的にログローテーションの直後にS3へpublishされるログです。
  4. 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はこれ
ElasticBeanstalkのログ保存方法: publishlogについて設定する (Log Options)

IAMロールも自動でつけてくれればいいのですが、、自前でやらないと多分ダメ。デフォルトだと aws-elasticbeanstalk-ec2-role を参照しているので、これにS3への書き込み権限を追加します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1419320256000",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

2) logrotateDaily => Hourly

mv /etc/cron.daily/logrotate /etc/cron.hourly/

3) webapp.conf10MB => 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 の設定ファイルで重要なのは、 dateextdateformat -%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のログ保存方法