ちょっと話題の記事

ELBのアクセスログをfluent-plugin-elb-logを使ってkibanaで表示する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

先日お伝えしました通り、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-elasticsearchfluent-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にアクセスしてみると…ちゃんと表示されてますね!

Kibana_3_-_Logstash_Search

ログはこんな感じで取り込まれています。

{"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のアクセスログに記録されたアクセス日時)を指定すると、ちゃんとアクセス日時を時系列にして表示されます。

kibana_time

まとめ

こうやって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 Roleに対応済みだそうです!