EC2インスタンス1台にまとめてkibana+fluentd+elasticsearchを入れたときのメモ


やること

EC2のインスタンス1台にApacheをインストールして、そのアクセスログをFluentdでパース、Elasticsearchに転送し、Kibanaで可視化することをやってみる。

AWS

EC2

t2.microのしょっぱいやつを利用。AMIはAmazon Linux。

Security Group

Inboundを設定。

Type Protocol Port Range Source Description
Custom TCP 80 Anywhere apache
Custom TCP 5601 Anywhere kibana
Custom TCP 9200 Anywhere elasticsearch

パッケージインストール

もろもろUpdate

なにはともあれ最新のパッケージに更新しよう。

$ sudo yum update

Kibana

https://www.elastic.co/guide/en/kibana/current/rpm.html を見ながらインストール。

設定ファイルは /etc/kibana/kibana.yml にあるので server.host を書き換えて外部からアクセスできる状態でスタートできるようにする。
また、ElasticsearchのURLについてもlocalhostでアクセスできなくなるので書き換える。

server.host: "ec2-xxx-xxx-xxx-xxx.ap-northeast-x.compute.amazonaws.com"

...

elasticsearch.url: "http://ec2-xxx-xxx-xxx-xxx.ap-northeast-x.compute.amazonaws.com:9200"

設定が書き換えられたらスタート。

$ sudo /etc/init.d/kibana start

Elasticsearch

https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html を見ながらインストール。ドキュメントをみたところrpmは用意されておらずtarを解凍して頑張るっぽい。とりあえずホームディレクトリに展開して使う。

Amazon LinuxはJava7しか入っておらず、ElasticsearchがJava8を欲していたので別途インストール。

$ sudo yum install java-1.8.0-openjdk.x86_64

OSデフォルトのJavaがJava8になるように alternatives コマンドで切り替える。

$ sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2

設定ファイルは ~/elasticsearch-5.6.0/config/elasticsearch.yml にあるので外部から通信できるようホストの設定を以下のように書き換える。
transport.hostはlocalhostでないと動作しなかったので固定する設定を入れておく。

network.host: ec2-xxx-xxx-xxx-xxx.ap-northeast-x.compute.amazonaws.com

...

transport.host: localhost

以下のコマンドでElasticsearchが立ち上がる。が、メモリ不足で立ち上がらない。(t2.microだしね)

$ ~/elasticsearch-5.6.0/bin/elasticsearch
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/ec2-user/hs_err_pid31308.log

仕方がないので ~/elasticsearch-5.6.0/config/jvm.options にヒープメモリを設定する部分があるので書き換える。デフォルト2Gだったのを256MBに変更。

-Xms256m
-Xmx256m
#-Xms2g
#-Xmx2g

これで動くようになる。nohupをつけてログアウトしても動き続けるようにデーモン化して起動。

$ nohup ~/elasticsearch-5.6.0/bin/elasticsearch &

Fluentd

https://docs.fluentd.org/v0.12/articles/install-by-rpm を見ながらインストール。one-linerでサクッと。

$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

インストール後動作確認

以下のアドレスにブラウザからアクセスできれば上々。

  • Kibana
    • ttp://ec2-xxx-xxx-xxx-xxx.ap-northeast-x.compute.amazonaws.com:5601/
  • Elasticsearch
    • ttp://ec2-xxx-xxx-xxx-xxx.ap-northeast-x.compute.amazonaws.com:9200/

Apacheログの転送設定

Apacheインストール

$ sudo yum install httpd

httpdログが格納されているディレクトリの所有者やパーミッションがrootで700という厳しい感じになっているので、権限を修正しapacheユーザーとそのグループユーザーが見れるようにする。

$ sudo chown -R apache:apache /var/log/httpd/
$ sudo chmod g+rx /var/log/httpd/

また、Fluentdがログを参照できるようFluentdの実行ユーザーであるtd-agentをapacheグループに入れる。

$ sudo usermod -G apache td-agent

httpdを起動させる。

$ sudo /etc/init.d/httpd start

Fluentd設定

/etc/td-agent/td-agent.conf に以下を追記。

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

<match apache.**>
  @type copy

  <store>
    @type stdout
  </store>

  <store>
    @type elasticsearch
    host EC2のIPアドレス
    port 9200
    type_name access_log
    logstash_format true
    logstash_prefix apache_access
    logstash_dateformat %Y%m
  </store>
</match>

このconfの中のlogstash_prefixは後述のKibanaの設定で利用するので頭の片隅に入れておく。また、Elasticsearchのプラグインが必要なのでインストール。

$ sudo td-agent-gem install fluent-plugin-elasticsearch

Fluentdを起動させて準備完了。

$ sudo /etc/init.d/td-agent start

Kibana上でグラフが見れるようにする

Apacheサーバーにアクセス

適当にサーバーへブラウザでアクセスしてアクセスログを落としておく。
設定がうまくいっていると /var/log/td-agent/td-agent.log にFluentdがapacheのアクセスログをパースしたデータが落ちているはず。

Kibanaのindex parttern設定

ある程度ページにアクセスしたら今度はKibanaにアクセス。すると以下のようにElasticsearchのデータソース指定の画面になるので、Index partternにapache_access-*と入力。これはFluentdのconfファイルで触れたlogstash_prefixと同じものを指定する。入力し終えたらCreateを押す。

完成

これでKibanaで遊べるようになった。