ELBのアクセスログをfluent-plugin-elb-logを使ってkibanaで表示する
はじめに
先日お伝えしました通り、ELBのアクセスログが取得出来るようになったのですが、すぐさまfluent-plugin-elb-logというfluentプラグインがリリースされました。さすがfluentd界隈、対応が早いです。
ということで、今回はELBのアクセスログをfluentd経由でElasticsearchに取り込み、それをKibanaで表示したいと思います!
セットアップ
Elasticsearch
Elasticsearchは最新のrpmパッケージを更新サイトから取得し、rpmコマンドでインストールします。
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.0.noarch.rpm $ sudo rpm -ivh ./elasticsearch-1.0.0.noarch.rpm $ sudo /sbin/chkconfig --add elasticsearch $ sudo service elasticsearch start
fluentd
fluentdは以下コマンドにてインストールします。またpluginとしてfluent-plugin-elasticsearchとfluent-plugin-elb-logをインストールします。
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elb-log
/etc/td-agent/td-agent.confを編集します。
- type ... “elb_log”を指定します。
- access_key_id ... ACCESS_KEYを指定します。
- secret_access_key ... SECRET_ACCESS_KEYを指定します。
- s3_endpoint ... S3のEndpointを指定します。デフォルト値は”s3.amazonaws.com”ですが、これはus-east-1でのEndpointなので、リージョンによって変える必要があります。リージョン毎のS3 Endpointは公式ドキュメントを参照。
- s3_bucketname ... ELBのアクセスログ設定で指定したS3のBucket名を指定します。
- s3_prefix ... ELBのアクセスログ設定で指定したPrefix(ディレクトリ)名を指定します。
- timestamp_file ... ログ取得時のタイムスタンプを記録するファイルを指定します。ファイル書込権限が必要です。
- refresh_interval ... 取り込みのリフレッシュ間隔を指定します。ELBのアクセスログが5分or60分で指定可能なので、そちらに合わせれば良いでしょう。
<source> type elb_log access_key_id XXXXXXX secret_access_key ZZZZZZZZZZZZZZZZZ s3_endpoint s3-ap-northeast-1.amazonaws.com s3_bucketname myelblog s3_prefix logs timestamp_file /tmp/elb_last_at.dat refresh_interval 300 </source> <match **> type elasticsearch type_name access_log host localhost port 9200 logstash_format true include_tag_key true tag_key @log_name </match>
設定後、td-agentをサービス起動します。
$ sudo chkconfig td-agent on $ sudo service td-agent start
nginx
yumコマンドでnginxをインストール後、nginxの設定でElasticsearchへのアクセスをReverse Proxy経由で行えるようにしておきます。
$ sudo yum install nginx $ sudo vi /etc/nginx/conf.d/virtual.conf server { listen *:10080 ; server_name localhost; access_log /var/log/nginx/kibana.access.log; location /kibana/ { root /usr/share/nginx/html; index index.html index.htm; } location / { proxy_pass http://127.0.0.1:9200; proxy_read_timeout 90; } }
設定後、nginxをサービス起動します。
$ sudo chkconfig nginx on $ sudo service nginx start
Kibana
Kibanaを公式サイトからダウンロードし、nginxの公開フォルダに展開します。
$ wget -P /home/ec2-user http://download.elasticsearch.org/kibana/kibana/kibana-latest.tar.gz $ sudo tar xvzf /home/ec2-user/kibana-latest.tar.gz -C /usr/share/nginx/html/ $ sudo mv /usr/share/nginx/html/kibana-latest /usr/share/nginx/html/kibana
Kibanaのconfig.jsを編集し、Elasticsearchの接続先をnginx経由にします。
$ vi /usr/share/nginx/html/kibana/config.js define(['settings'], function (Settings) { return new Settings({ elasticsearch: "http://"+window.location.hostname+":10080", default_route: '/dashboard/file/default.json', kibana_index: "kibana-int", panel_names: [ 'histogram', 'map', 'pie', 'table', 'filtering', 'timepicker', 'text', 'hits', 'dashcontrol', 'column', 'trends', 'bettermap', 'query', 'terms', 'sparklines' ] }); } );
結果
KibanaのURLにアクセスしてみると…ちゃんと表示されてますね!
ログはこんな感じで取り込まれています。
{"account_id":"0123456789","region":"ap-northeast-1","logfile_date":"2014/03/12","logfile_elb_name":"elber","elb_ip_address":"54.199.XXX.XXX","logfile_hash":"33do6pcs","time":"2014-03-12T04:55:01.634415Z","elb":"elber","client":"59.146.XXX.XXX","client_port":"50117","backend":"172.31.26.XX","backend_... {"account_id":"0123456789","region":"ap-northeast-1","logfile_date":"2014/03/12","logfile_elb_name":"elber","elb_ip_address":"54.199.XXX.XXX","logfile_hash":"6cjdjtzp","time":"2014-03-12T04:44:10.726571Z","elb":"elber","client":"59.146.XXX.XXX","client_port":"36245","backend":"172.31.26.XX","backend_... {"account_id":"0123456789","region":"ap-northeast-1","logfile_date":"2014/03/12","logfile_elb_name":"elber","elb_ip_address":"54.199.XXX.XXX","logfile_hash":"35hgif68","time":"2014-03-12T04:58:07.083799Z","elb":"elber","client":"59.146.XXX.XXX","client_port":"48068","backend":"172.31.4.XX","backend...
一点注意点として、Kibanaは時系列の判断に@timestampフィールドを使用するのですが、この構成の場合@timestampフィールドにはアクセスされた時刻ではなくログが取り込まれた時刻が設定されています。このため以下のようにtimeフィールドにtime(ELBのアクセスログに記録されたアクセス日時)を指定すると、ちゃんとアクセス日時を時系列にして表示されます。
まとめ
こうやってELBのアクセスログが出力可能になったことでKibanaのようなアクセス解析ツールを使って確認出来るようになったのはとても素晴らしいし、ELBのアクセスログが対応されるとすぐさまfluent-plugin-elb-logがリリースされたのはすごいと思います(@shinsakaさん、素晴らしいプラグインをありがとうございます!)
ところでfluent-plugin-elb-logを実際に使ってみたところ、以下2点が対応されると嬉しいなと思いました。
- IAM Roleで使いたい ... td-agent.confの設定でaccess_key_idとsecret_access_keyが設定されていないとConfigErrorになるのですが、IAM Roleを設定したEC2ではアクセスキーの設定をしなくても使えると思うので、非必須になると良いと思いました。
- tagが設定出来るようになって欲しい ... 複数のELBのアクセスログをまとめて取得したい場合などtagで分けたい場合があるので、tagが設定出来ると良いなと思いました。
こういうときにプルリク出来るようなRuby力を付けないとダメですねぇ。頑張ります。
とにかく、fluent-plugin-elb-log、とても良いです!
追記(2014/04/09)
使ってくださってて感動なう。IAMは対応済みですー /ELBのアクセスログをfluent-plugin-elb-logを使ってkibanaで表示する|クラスメソッド株式会社 開発ブログ 書いた人 > @smokeymonkey http://t.co/Tymslfltrw
— しんさか (@kasanshi) April 8, 2014
ということでIAM Roleに対応済みだそうです!