higehikiのブログ

iPhoneアプリ「ログ雀」の中の人です。

ログをS3に保存する際にサーバーのIP毎に管理する方法

こういうことがしたい!
S3 Bucket / logs / 20140707 / [サーバーA] / access.log
S3 Bucket / logs / 20140707 / [サーバーB] / access.log
S3 Bucket / logs / 20140707 / [サーバーC] / access.log

fluentdでログをS3に流していますが、frontサーバーにオートスケールを設定していると、サーバー毎の設定を動的に行う必要があります。

そこで、td-agentが起動されるタイミングで、設定ファイルを動的に生成する方式を採ってみました。

まずは動的に生成する基となる設定ファイルを用意します。

$ vim /etc/td-agent/td-agent.conf.tpl

# ad access log
<source>
  type tail
  format json
  path XXXXXXXXXXXXX
  pos_file /var/log/td-agent/access.pos
  tag xxx.access
</source>

# S3 Output
<match xxx.access>
  type copy
  <store>
    type s3
    aws_key_id YYYYYYYYYY
    aws_sec_key ZZZZZZZZZZZZ
    s3_bucket AAAAAAAAAAA
    s3_endpoint s3-ap-northeast-1.amazonaws.com
    path logs                      # S3に格納するディレクトリ先
    buffer_path /var/log/fluent/s3/deliver           # S3にflushするまでのbufferファイル格納先
    buffer_chunk_limit 1g                    #リミット値を変更
    time_slice_format  %Y%m%d/${hostname}/%H/%M          #分単位でファイル作成
    time_slice_wait 1m                      # flushまでの待ち時間
    flush_interval 30s                      #これを書くと、timesliceを無視して指定したインターバルごとにs3にflushされる。
  </store>
</match>

こんな感じに。
${hostname} に動的にサーバーのローカルIPが入ればOKです。


続いて、td-agentの起動スクリプトに以下を追加します。

$ vim /etc/init.d/td-agent

sed -e "s/\${hostname}/`hostname`/g" /etc/td-agent/td-agent.conf.tpl > /etc/td-agent/td-agent.conf

これで起動するタイミングで、設定ファイルに動的にIPを取得、置換して生成することができます。