雑多なインフラエンジニア日記

技術ブログでっす~

S3でログ収集(logrotate)

セキュリティ要件等で、各サーバのログを長期保存しなければいけない場合、
サーバ上(EBS)に全ログを保存するとエライことになるので、S3に退避する
方法をメモ。

Linux標準の logrotate + s3cmd を駆使して実現できます。

# 巷で話題のfluentdやfluent-agent-liteも検討しましたが、やりたい事は
# 単純で、EC2外に大量の過去ログを保存したいだけなので、logrotateでさく
# っと実装。

/etc/logrotate.d/syslog の場合
/var/log/messages /var/log/xxxx
{
    copytruncate
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript

    lastaction
    HOSTNAME=`hostname`
    DATE=`date -I`
       for LOGS in $1 ; do
         FILE=`basename ${LOGS}`
         /usr/bin/s3cmd put --config /xxx/.s3cfg ${LOGS}.1 s3://log-backup/${HOSTNAME}/${DATE}/syslog/${FILE}.1 > /dev/null 2>&1
       done
    endscript

}


ポイントは、postrotateではなく、lastaction内で s3cmd を使う点です。
postrotateの場合、ローテートがされる前(xxx.1作成前)に実行されてしまいます。
lastactionであれば、ローテート後(xxx.1作成後)に実行されます。
http://ken-etsu-tech.blogspot.jp/2011/11/logrotatepostrotate.html

/xxx/.s3cfg には s3cmd実行に必要な設定をして下さい。
http://xoxo-infra.hatenablog.com/entry/2013/02/06/020930

$LOGS には、ローテート対象のログ(フルパス)
$FILE には、パスを除いたログ名
が入ります。

/var/log/messages であれば、 ローテート直後の /var/log/messages.1 を
S3の log-backup/サーバ名/YYYY-MM-DD/syslog に messages.1として転送(保存)します。
↓こんな感じです。

f:id:jinjin252525:20130513182759j:plain


・転送コマンド実行時に以下の警告が出る場合は、yumでpython-magicをインストールして下さい。

WARNING: Module python-magic is not available. Guessing MIME types based on file extensions.

$ yum -y install python-magic.x86_64


・参考
http://aws.clouddesignpattern.org/index.php/CDP:Web_Storage_Archive%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

・他の方法ですが、S3のバケットをマウントしてログをコピーでも良さそうです。
http://lab.eli-sys.jp/2013/02/03/amazon-s3%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B/


未実装のパージ処理がめんどくさい・・・