ようへいの日々精進XP

よかろうもん

Apache アクセスログを fluentd で S3 に保存する(chef cookbook 版)

要件

前回の記事を読んでくださった @repeatedly さんから

というご指摘を頂きましたので、改めて検証しつつ、セットアップを chef のレシピで書いてみました。

手順

  • 今回は knife ec2 を使って全ての設定を行います。
  • Chef は Hosted Chef を使うので、Hosted Chef が利用出来る状態になっておくことが前提となります。

knife ec2 の準備

knife ec2 のセットアップ
sudo gem install knife-ec2 --no-ri --no-rdoc
AWS のアクセスキーとシークレットキーの設定
vim ~/.chef/knife.rb
knife[:solo_path] = '/tmp/chef-solo'
knife[:aws_access_key_id] = "xxxxxxx"
knife[:aws_secret_access_key] =  "xxxxxxxxxxxxxxx"
確認
knife ec2 server list -u inokara --region ap-northeast-1

f:id:inokara:20130422235750p:plain

cookbook の作成

こちらに公開致しました。

Apache インストール
package "httpd" do
	action :install
end

directory "/var/log/httpd" do
	mode "00755"
end

service "httpd" do
	supports :status => true, :restart => true, :reload => true
	action [ :enable, :start ]
end
td-agent をインストールする為の yum リポジトリ設定
cookbook_file "/etc/yum.repos.d/td.repo" do
	source "td.repo"
	mode 00644
end

以下のファイルを files/default/td.repo に設定する。

[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
td-agent インストール
package "td-agent" do
	action :install
end

cookbook_file "/etc/td-agent/td-agent.conf" do
	mode "00644"
	source "td-agent.conf"
	action :create
end

directory "/var/log/fluent" do
	mode "00775"
	action :create
end

directory "/tmp/td-agent" do
	mode "00777"
end

service "td-agent" do
        supports :status => true, :restart => true, :reload => true
        action [ :enable, :start ]
end
td-agent.conf

td-agent.conf を file/default/td-agent.conf として用意する

<source>
        type tail
        format apache
        path /var/log/httpd/access_log
        tag apache.access
        pos_file /tmp/td-agent/apache.pos
</source>

<match apache.access>
        type s3
        aws_key_id ${your_key_id}
        aws_sec_key ${your_sec_key}
        s3_bucket ${your_bucket}
        s3_endpoint s3-ap-northeast-1.amazonaws.com
        path logs/
        buffer_path /var/log/fluent/s3
        time_slice_format %Y%m%d/ip-%H
        time_slice_wait 10m
        #flush_interval 5s
</match>
  • 下記の三つは適宜設定します。
    • aws_key_id ${your_key_id}
    • aws_sec_key ${your_sec_key}
    • s3_bucket ${your_bucket

レッツクッキング

Hosted Chef に cookbook を登録
cd ${your_cookbook_path}
knife cookbook upload ${cookbook_name} -o ./
レッツクッキング

knife ec2 コマンドを使ってインスタンスの作成後に Apache と td-agent のインストールを行なってしまいます。

knife ec2 server create -r 'recipe[fluentd_apache::repos_setting],recipe[fluentd_apache::apache_install],recipe[fluentd_apache::fluentd_install]' -Z ap-northeast-1a -I ami-4e6cd34f -f t1.micro -G quick-start-4 -i ~/.ssh/${your_aws_ssh_key_file} -x ec2-user -VV -S ${your_aws_ssh_key_name}
オプション ざっくりとした解説
-r 'recipe...' Hosted Chef に登録した cookbook のレシピを設定
-Z... AWS の Availability Zone を指定
-I... AWS の AMI を指定
-f... AWS の flavor を指定
-G... AWS の Security Group を指定
-i ... AWS の秘密鍵ファイルパスを指定
-x ... AWS のインスタンス ssh ユーザー名を指定
-S ... AWS の秘密鍵名を指定

尚、今回は .chef/knife.rb に region の設定が無い場合に以下のエラーが出て泣きそうになりました。

ERROR: You have not provided a valid image (AMI) value.  Please note the short option for this value recently changed from '-i' to '-I'.

ということでこちらを参考に knife.rb に以下のようなリージョン設定を行いました。

knife[:region] = 'ap-northeast-1'

確認

f:id:inokara:20130427004634p:plain

  • 暫く経過してから S3 にログが放り込まれていることを確認する

f:id:inokara:20130427005506p:plain

まとめ

  • td-agent は前回の記事同様に S3 プラグインは同梱されている
  • td-agent に関しては S3 以外にも様々なプラグインがあるので試してみる
  • cookbook は美しくはないが、とりあえず目的は達成されていると思われる