[技術ブログVol.11] ELBのアクセスログをfluentd+Elasticsearch+kibanaで解析

先日ELB(Elastic Load Balancing)のアクセスログがS3に出力できるようになりました。

これによりスケールイン時のログの退避させたりアクセス解析のために各サーバにあるアクセスログを一か所にまとめたりする面倒な手間が省けます。

今回はS3に出力されたログを今流行のfluentd+Elasticsearch+kibanaで解析してみたいと思います。

ELBのログ出力の設定

デフォルトではログ出力はされないのでまずELBがログ出力するようマネジメントコンソールから設定を行います。

  1. ELBの管理画面に行き対象のELBを選択し、[Edit]をクリック
  2. 設定画面からアクセスログを有効にし出力間隔やログを保存するS3のバケット等を指定

[Create the location for me] にチェックを入れているとログを出力するS3バケットのACLをよしなに設定してくれるのでお勧めです。

以上でELBのアクセスログ出力設定は完了です。
あとは5分もしくは1時間ほど待っていれば指定したバケットにログが出力されます。

ログ解析のためfluentd+Elasticsearch+kibanaの設定

今回はCentOS6.5にインストールを行います。

Elasticsearchのインストール

公式サイトでRPMパッケージが配布されていますのでそれを利用します。

  1. rpmをダウンロード
    # wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.noarch.rpm
  2. インストール
    # rpm -ivh elasticsearch-1.0.1.noarch.rpm
  3. 自動起動できるよう追加
    # chkconfig –add elasticsearch
  4. サービススタート
    # /etc/init.d/elasticsearch start
    fluentdのインストール
  5. インストール用スクリプトをダウンロードして実行
    # curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
  6. サービスの自動起動するように変更
    chkconfig td-agent on
  7. ELBとElasticsearch用のプラグインをインストール
    # /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
    # /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elb-log
    ログ取得用の設定

    fluentdの設定ファイルは /etc/td-agent/td-agent.conf です。

今回はこれに以下の内容を書きこみます

/etc/td-agent/td-agent.conf
<source>
type elb_log
access_key_id <access_key_id>
secret_access_key <secret_access_key>
s3_endpoint s3-ap-northeast-1.amazonaws.com
s3_bucketname <s3_bucketname>
s3_prefix <s3_prefix>
timestamp_file /tmp/elb_last_at.dat
refresh_interval 300
</source>

<match elb.access>
type elasticsearch
type_name access_log
host localhost
port 9200
logstash_format true
include_tag_key true
tag_key @log_name
</match>

設定の各項目についてざっくりと説明すると以下のような感じです。

  • <source> ~ </source>
    名前の通りどこからログを取ってくるかの設定です。
  • type
    ログ取得に利用するプラグインを指定。
    今回はelb_logを指定します。
  • access_key_id
    AWSのaccess_keyを書き込みます。
  • secret_access_key
    AWSのsecret_access_keyを書き込みます
  • s3_endpoint
    S3のバケットのエンドポイントを指定します。今回は東京リージョンにbucketが作られているので
    s3-ap-northeast-1.amazonaws.comと指定しています。
    尚デフォルトではs3.amazonaws.comです。
    各リージョンのエンドポイントはAWSの公式ドキュメントに詳しく書いてあります。
  • s3_bucketname
    ログが保存してあるバケット名を記入します。
  • s3_prefix
    bucket内のログ保存先のディレクトリを記入します。
  • timestamp_file
    どの時間までのログを読み込んだか記録しておくためのファイルの出力先を指定します。
    td-agentユーザの書き込み権限があるディレクトリを指定する必要があります。
    今回はとりあえず/tmp以下に出力するよう設定しています。
  • refresh_interval
    S3にログを取得しに行く間隔を秒単位で指定します。
    ELBからS3にログが出力される間隔が5分または60分なのでそれに合わせるよう設定すればよいでしょう。
    あまりにも短時間で読み込みに行ってもログはありませんので無意味にAPIを叩くことになります。
    今回はELBからの出力間隔を5分にしているのでこちらも5分(300秒)にしています。
  • <match elb.access> ~ </match>
    matchの後に指定されたタグをもったログをどのように出力するかの設定をします。
    今回elb.accessというタグでログが出力されるのでそれをelasticsearchに格納するよう設定していきます。
  • type elasticsearch
    利用するプラグインを指定。今回はelasticsearchを指定
  • type_name
    elasticsearchのタイプ名今回はaccess_logとします。
  • host
    格納先のelasticsearchがどこにあるのか指定。今回は同じホストにあるのでlocalhost
  • port
    elasticsearchのポート番号を指定。今回はデフォルトのまま使っているの9200
  • logstash_format
    logstashフォーマットで出力するオプション。trueにしているとindex名が「logstash-YYYY.mm.dd」となります。
    また取りこんだレコードに@timestampとして時刻が追加されます。
    ただしこの時刻はログを取り込んだ時刻となりelbにアクセスのあった時間ではないので注意が必要です。
  • include_tag_key
    elasticsearchにログを格納する際にtag_keyで指定したタグ情報を自動でつけるかどうかのオプション
  • tag_key
    格納するログにつけるタグを指定

設定が完了すれば /etc/init.d/td-agent start で起動します。
これで起動して5分後にはログが取得されます。

kibanaでログ表示

今回はnginxを使ってkibanaを表示させます。
まずはnginxのインストールから

nginxのインストール

レポジトリはnginx公式のものを使います。

# rpm -ivh
http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install -y nginx

これでnginxのインストールは完了です。

nginxの設定

今回はとりあえず表示させるだけの設定を行います。
本番でがっつり使う場合は[elasticsearchのgithub]にconfigのサンプルがありますのでこちらを参考に設定したほうがいいでしょう。

# cd /etc/nginx/conf.d
# mv default.conf default.conf.org
# vim virtual.conf
virtual.conf
server {
listen *:80 ;
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;
}
}

kibanaのダウンロードと設置

# cd /usr/local/src
# wget http://download.elasticsearch.org/kibana/kibana/kibana-latest.tar.gz
# tar zxvf kibana-latest.tar.gz
# mv kibana-latest /usr/share/nginx/html/kibana
# vi /usr/share/nginx/html/kibana/config.js

elasticsearchにもnginx経由でアクセスするためにちょこっと手を入れます。

config.js
/** @scratch /configuration/config.js/5
*
* ==== elasticsearch
*
* The URL to your elasticsearch server. You almost certainly don’t
* want +http://localhost:9200+ here. Even if Kibana and Elasticsearch are on
* the same host. By default this will attempt to reach ES at the same host you have
* kibana installed on. You probably want to set it to the FQDN of your
* elasticsearch host
*/
elasticsearch: “http://”+window.location.hostname+”:80″,

これでhttp://<hostname>/kibana/とアクセスするとkibanaのトップページが表示されます。

無事アクセスできると以下のような画面が出ます。

kiban-top

Blank Dashboard をクリックするとなにもない画面が表示されますのであとは適宜パネルを配置します。

たとえば時系列でアクセス数を見たい場合はHistogramを使います。

するとこのようなグラフが作れます。

histogram

この時の注意点として時間軸がデフォルトではログを取り込んだ時間の@timestampになってしまいます。

アクセスがあった時間を時間軸にしたい場合は以下の画像の様にTime Fieldの値をアクセスがあった時刻が記録してあるtimeを指定やればアクセスがあった時間を時間軸として表示できます。

kibana-panel

他にもstatuscode毎に表示させるといったこともできます

histogram2

ELB使ってるけどアクセス解析どうしようかなとお考えの方は一度ご利用されてみてはどうでしょうか。

最後になりましたが、検証時使った fluent-plugin-elb-logのバージョンは0.0.3でしたがつい先日0.0.4にアップデートされてIAM Roleに対応したようです。

0.0.4では検証できていないので今回記載した内容と異なる点があるかも知れません。その点だけご容赦ください。

技術ブログ中の人
更新予定は、5月上旬頃です。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA