fluentdを使ってS3へログを送る

記事タイトルとURLをコピーする
テクニカルグループの宮澤です。 今回は、fluentdとS3を使ってS3にログをアーカイブする手順を紹介します。 fluentdとは、ログを収集し格納するためのログ収集基盤ソフトウェアです。 fluentdに読み込まれたログはJSON形式に変換され、指定の場所にアウトプットされます。 ※fluentdの安定稼働版はtd-agentとなります。

fluentdのインストール

リポジトリの追加

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
$ sudo vi /etc/yum.repos.d/td.repo
 ---
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0

インストール

$ sudo yum install td-agent -y
$ sudo service td-agent start
$ sudo chkconfig td-agent on

プラグインの追加

今回は、タグを動的に扱うプラグインとプレースホルダを扱えるようにするプラグインをインストールします。
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem update
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-config-expander

権限設定

fluentdを使って出力を行う、元ディレクトリの権限を変更します。
$ sudo chgrp td-agent /var/log/httpd/
$ sudo chgrp td-agent /var/log/messages

$ sudo chmod g+rx /var/log/httpd/
$ sudo chmod g+rx /var/log/messages

設定

$ sudo vi /etc/td-agent/td-agent.conf
---
<source>
  type config_expander
  <config>
    type tail
    format apache
    pos_file /tmp/access.log.pos
    path /var/log/httpd/access_log
    tag ${hostname}/apache.access
  </config>
</source>
<source>
  type config_expander
  <config>
    type tail
    format /^[[^ ]* (?<time>[^]]*)] [(?<level>[^]]*)] (?<message>.*)$/
    time_format %b %d %H:%M:%S
    pos_file /tmp/error.log.pos
    path /var/log/httpd/error_log
    tag ${hostname}/apache.error
  </config>
</source>

<source>
  type config_expander
  <config>
    type tail
    format syslog
    pos_file /tmp/syslog.pos
    path /var/log/messages
    tag ${hostname}/syslog.messages
  </config>
</source>

<match *.**>
  type forest
  subtype s3
   <template>
    aws_key_id アクセスキーID
    aws_sec_key シークレットキー
    s3_bucket バケット名
    s3_endpoint s3-ap-northeast-1.amazonaws.com

    path
    buffer_path /var/log/td-agent/buffer/${tag}
    time_slice_format %Y/%m/%d/${tag}/ec2-%Y-%m-%d-%H
    retry_wait 30s
    retry_limit 5
    flush_interval 1s
    flush_at_shutdown true
   </template>
</match>

ログの確認

S3を確認すると、以下のようにログが出力されていました。 また、S3のDirectoryツリーは以下のようになりました。
バケット名
│
├─Year
│  └─Month
|        └─Day
|            └─Hostname
|                   ├─apache.access
│                   │       └─ec2-2013-06-19-00_0.gz・・・
│                   │
|                   ├─apache.error
│                   │       └─ec2-2013-06-19-00_0.gz・・・
│                   │
│                   └─syslog.messages
│                            └─ec2-2013-06-19-00_0.gz・・・

 

まとめ

fluentdとS3をうまく使うことで、ログをS3にアーカイブすることができます。また、再送機能を使用すればログを失う可能性を極限まで低くできます。 そしてfluentdには、サーバのシャットダウンシグナルを受け取った際に、自動的にログを出力する機能があるため、AutoScalingで増減したインスタンスのログを確実に転送することができます。