先日ELB(Elastic Load Balancing)のアクセスログがS3に出力できるようになりました。
これによりスケールイン時のログの退避させたりアクセス解析のために各サーバにあるアクセスログを一か所にまとめたりする面倒な手間が省けます。
今回はS3に出力されたログを今流行のfluentd+Elasticsearch+kibanaで解析してみたいと思います。
ELBのログ出力の設定
デフォルトではログ出力はされないのでまずELBがログ出力するようマネジメントコンソールから設定を行います。
- ELBの管理画面に行き対象のELBを選択し、[Edit]をクリック
- 設定画面からアクセスログを有効にし出力間隔やログを保存するS3のバケット等を指定
[Create the location for me] にチェックを入れているとログを出力するS3バケットのACLをよしなに設定してくれるのでお勧めです。
以上でELBのアクセスログ出力設定は完了です。
あとは5分もしくは1時間ほど待っていれば指定したバケットにログが出力されます。
ログ解析のためfluentd+Elasticsearch+kibanaの設定
今回はCentOS6.5にインストールを行います。
Elasticsearchのインストール
公式サイトでRPMパッケージが配布されていますのでそれを利用します。
- rpmをダウンロード
# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.noarch.rpm
- インストール
# rpm -ivh elasticsearch-1.0.1.noarch.rpm
- 自動起動できるよう追加
# chkconfig –add elasticsearch
- サービススタート
# /etc/init.d/elasticsearch start
fluentdのインストール
- インストール用スクリプトをダウンロードして実行
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
- サービスの自動起動するように変更
chkconfig td-agent on
- 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のトップページが表示されます。
無事アクセスできると以下のような画面が出ます。
Blank Dashboard をクリックするとなにもない画面が表示されますのであとは適宜パネルを配置します。
たとえば時系列でアクセス数を見たい場合はHistogramを使います。
するとこのようなグラフが作れます。
この時の注意点として時間軸がデフォルトではログを取り込んだ時間の@timestampになってしまいます。
アクセスがあった時間を時間軸にしたい場合は以下の画像の様にTime Fieldの値をアクセスがあった時刻が記録してあるtimeを指定やればアクセスがあった時間を時間軸として表示できます。
他にもstatuscode毎に表示させるといったこともできます
ELB使ってるけどアクセス解析どうしようかなとお考えの方は一度ご利用されてみてはどうでしょうか。
最後になりましたが、検証時使った fluent-plugin-elb-logのバージョンは0.0.3でしたがつい先日0.0.4にアップデートされてIAM Roleに対応したようです。
0.0.4では検証できていないので今回記載した内容と異なる点があるかも知れません。その点だけご容赦ください。
更新予定は、5月上旬頃です。