読者です 読者をやめる 読者になる 読者になる

続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

ElasticBeanstalkのログ保存方法

BEANSTALK S3 Log

BeanStalk標準で入っているロギング機構についてまとめておきます。公式ドキュメントにも記載が少ないので、難儀しました。注意点とて、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はこれ

f:id:iga-ninja:20141223144822p:plain

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

で行えます。