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
なにはともあれ最新のパッケージに更新しよう。

```bash
$ 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"
```

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

```bash
$ 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を欲していたので別途インストール。

```bash
$ sudo yum install java-1.8.0-openjdk.x86_64
```

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

```bash
$ 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インストール

```bash
$ 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を押す。

<img width="752" alt="スクリーンショット 2017-09-17 21.39.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/5804/a9d54f33-7dc9-4968-5b2c-7e00ad55361f.png">

## 完成

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

<img width="1052" alt="スクリーンショット 2017-09-17 21.41.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/5804/d9d53f90-0d59-1bdd-104d-babd17739dab.png">