fluentd + elasticsearch5 + kibana4をvagrantで練習してみた話[centos7]

## はじめに

*導入方法だけ見たい！という人は飛ばしてください*

社内の勉強会で発表する機会があったので、気になっていたfluentd + elasticsearch + kibanaのログ管理について調べて検証してみました。
知ってる人にとっては今更…？と言われてしまうかもしれないけど、業界新人なものでご勘弁を…

ざっとググってみたら、バージョンが結構古いものからニッチな記事もちらほらあって、
(開発状況を含めて)ホットなコンテンツなんだなぁと実感しました。

## 何ができるのか

まずはこのシステムで何ができるのか。

**ログの集中管理・見える化**

たくさんのサーバのいろんなログを、まるっとまとめてブラウザから検索・管理できる。
各種プラグインをうまく使うことで、監視や障害検知が`スマート`に行える。

各サービスの大雑把な役割は以下の通り。  

- fluentd : 各種サーバからログを集める。サーバ-クライアント方式
- elasticsearch : fluentdからのログ受け取り口。kibanaを動かす。全文検索エンジン。
- kibana : elasticsearchのプラグイン。 集めたログをブラウザで見える化する。

あくまでこの構成の場合の役割なので、特徴なんかは割愛します。

## 構成

##### *理想*

- 複数APサーバ(各種サービス+fluentd) + ログ集約サーバ(fluentd+elasticsearch) + 解析サーバ(kibana)

複数サーバ立てて、動くいろんなログを一か所に集約して、ビュー部分だけ外に出してセキュリティ的にも強固！
ログはS3に投げて、それぞれコンテナ化してリソースも効率的に…

##### *今回*

- vagrantサーバ(apache+fluentd+elasticsearch+kibana)

***ホストマシンのメモリ:2G***
時間もお金もスペックも足りなかったので、練習ってことで割り切りました。
とりあえず現バージョンで動かすとこまでやってみます。
※これがタイトルの **練習**　な要因

## 環境

- vagrantサーバ(centos7.3) IP:192.168.33.10
- td-agent(fluentd):2.3.5
- elasticsearch:5.4.1
- kibana:4.1
- ruby:2.1(fluentdに付属)
- OpenJDK:1.8.0
- apache 2.4系


## Apache

``` 
$ sudo yum install httpd
$ sudo systemctl start httpd 
# 192.168.33.10 アクセス -> つながるね。
```

## fluentd

### インストール

もちろんyumで。
公式(treasuredata社)が出してるパッケージ版があるのでささっとリポジトリ追加。

```/etc/yum.repos.d/treasuredata.repo
$ sudo cat /etc/yum.repos.d/treasuredata.repo 
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/2/redhat/7/$basearch
gpgcheck=1
gpgkey=http://packages.treasuredata.com/GPG-KEY-td-agent
```

これで、はい

```
$ sudo yum install td-agent
==============================================================================
 Package                     Arch    Version              Repository     Size
==============================================================================
Installing:
 td-agent                    x86_64  2.3.5-1.el7          treasuredata   53 M
Installing for dependencies:
 at                          x86_64  3.1.13-22.el7        base           51 k
 avahi-libs                  x86_64  0.6.31-17.el7        base           61 k
 bc                          x86_64  1.06.95-13.el7       base          115 k
 cups-client                 x86_64  1:1.6.3-26.el7       base          149 k
 cups-libs                   x86_64  1:1.6.3-26.el7       base          356 k
 ed                          x86_64  1.9-4.el7            base           72 k
 mailx                       x86_64  12.5-12.el7_0        base          244 k
 patch                       x86_64  2.7.1-8.el7          base          110 k
 psmisc                      x86_64  22.20-11.el7         base          141 k
 redhat-lsb-core             x86_64  4.1-27.el7.centos.1  base           38 k
 redhat-lsb-submod-security  x86_64  4.1-27.el7.centos.1  base           15 k
 spax                        x86_64  1.5.2-13.el7         base          260 k
 time                        x86_64  1.7-45.el7           base           30 k

Transaction Summary
==============================================================================
Install  1 Package (+13 Dependent packages)
```
参考　https://goo.gl/yIJiQy


起動・自動起動設定しておく。

```
$ sudo systemctl start td-agent
$ sudo systemctl enable td-agent
```

### td-agent-gem(プラグイン)アップデート・インストール

td-agentのプラグインをインストールするにはtd-agent-gemというものが使えるらしい(以前は無くて大変だった、らしい)  
一応アップデートしておきます(gem updateみたいなもの)

```
$ sudo td-agent-gem update※めっちゃ時間かかった　後回しでもいいかも…
Done installing documentation for tilt after 3 seconds
Gems updated: concurrent-ruby activesupport activesupport activesupport activesupport activesupport arel activesupport aws-sdk aws-sdk-core aws-sdk-resources bigdecimal bson bundler celluloid celluloid-essentials celluloid-extras celluloid-fsm celluloid-pool celluloid-supervision hitimes timers cool.io activesupport fluent-plugin-mongo fluent-plugin-rewrite-tag-filter fluent-plugin-s3 fluent-plugin-webhdfs fluentd serverengine strptime font-awesome-rails haml temple haml-rails html2haml ruby_parser sexp_processor hike httpclient i18n io-console jbuilder jquery-rails json mail minitest mongo fuzzyurl chef-config ffi wmi-lite plist libyajl2 ffi-yajl systemu ohai oj parallel psych puma rack rack rails-dom-testing method_source activesupport rake rdoc sass sass-rails sprockets sprockets-rails string-scrub sucker_punch td-client power_assert test-unit thrift tilt
```
### 必要なプラグインのインストール
必要そうなものをささっと。

```
$ sudo td-agent-gem install fluent-plugin-filter
$ sudo td-agent-gem install fluent-plugin-forest
$ sudo td-agent-gem install fluent-plugin-config-expander
$ sudo td-agent-gem install fluent-plugin-elasticsearch
$ sudo td-agent-gem install fluent-plugin-typecast
$ sudo td-agent-gem install fluent-plugin-parser
```

### config設定

一応収集側(クライアント)と集約側(サーバ)側の設定を分けて書いておいた。後学のために。

```/etc/td-agent/td-agent.conf
##### ログ収集側の設定
<source>
  # データ(ログ)の取得方法 tailが無難
  type tail
  # 起動前に作成(apacheの初回起動をしておく)
  path /var/log/httpd/access_log
  # 出力先のログ
  pos_file /var/log/td-agent/buffer/access_log.pos
  format none
  # タグ付け タグ毎に処理を切り分ける
  tag apache.access
</source>

 # 集約サーバへ送信(今回は同一サーバなのでコメントアウト)
#<match *.**>
#  type forward
#  retry_limit 5
#  # 5秒ごとに送信(検証用 60s,300sくらいが無難？)
#  flush_intarval 5s
#  # 送信先サーバ・ポートを指定
#  <server>
#    host 127.0.0.1
#    port 24224
#  </server>
#</match>

##### 集約サーバ側設定
#<source>
#  type forward
#  port 24224
#</source>

 # こんな感じでタグごとに処理を分けられる
#<match apache.access> 
<match *.**>
  type elasticsearch
  host localhost
  # elasticsearchの標準待ち受けポート
  port 9200
  logstash_format true
  logstash_prefix apache-access
  flush_intarval 30s
</match>
```

起動と自動起動設定

```
$ sudo systemctl start td-agent
$ sudo systemctl status td-agent
```

## Elasticsearch

### java(JDK)のインストール

```
$ sudo yum install java-1.8.0-openjdk
```

### Elasticsearchのインストール

こちらも公式リポジトリから。

```/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

これで、はい。

```
$ sudo yum install elasticsearch
(依存パッケージ多いので略)
```

起動と自動起動設定

```
$ sudo systemctl start elasticsearch.service
$ sudo systemctl enable elasticsearch.service
```

### 動作確認
9200番(elasticsearchデフォルト待ち受け)にcurlして、elasticsearchの情報が取得できればOK

```
$ curl -XGET 'localhost:9200/?pretty'
{
  "name" : "uNl-uRX",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "JdvB1p_hSCisB3dAwNag5Q",
  "version" : {
    "number" : "5.4.1",
    "build_hash" : "2cfe0df",
    "build_date" : "2017-05-29T16:05:51.443Z",
    "build_snapshot" : false,
    "lucene_version" : "6.5.1"
  },
  "tagline" : "You Know, for Search"
}
```

## kibana

### インストール

上記repoファイルにkibanaも追加

```/etc/yum.repos.d/erasticsearch.repo
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

最後のyum

```
$ sudo yum install kibana
==============================================================================
 Package       Arch          Version           Repository                Size
==============================================================================
Installing:
 kibana        x86_64        5.4.1-1           elasticsearch-5.x         54 M

Transaction Summary
==============================================================================
Install  1 Package

```

### config編集
kibanaはyml

```/etc/kibana/kibana.yml 
server.host: 0.0.0.0
# elasticsearchの情報 urlなのでサーバが分かれても簡単！
elasticsearch.url: "http://192.168.33.10:9200"
```

起動と自動起動設定

```
$ sudo systemctl start kibana.service
$ sudo systemctl enable kibana.service
```

### 確認
http://192.168.33.10:5601　にブラウザからアクセス
kibanaの画面がでてきたら成功です。

![kibana初回起動](https://dr5mo5s7lqrtc.cloudfront.net/items/020S0y0F0S3r0J362o34/kibana%E5%88%9D%E5%9B%9E%E8%B5%B7%E5%8B%95.png?X-CloudApp-Visitor-Id=2778450)

***これで各サービスの設定は完了！***


## apacheのaccess_logをkibanaから飛ばしてみる。 

なんのひねりもないですがapacheのデフォルトページにアクセスして
そのログをkibanaから見てみます。

### logを貯めます
192.168.33.10 にアクセス、**F5連打。**

### curlでログがelasticsearchに渡っているか確認
うまく取得できてると apache-access(tag名)のindexが確認できます。

```
$ sudo curl -XGET 'localhost:9200/_cat/indices?v&pretty'
health status index                    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   apache-access-2017.06.04 CxK2KP5AQ-eDRKfCwYuysA   5   1         32            0     63.3kb         63.3kb
yellow open   .kibana                  v_a0BgmPSsGmjtBL6X0buQ   1   1          1            0      3.1kb          3.1kb
```

### いざ、アクセス。

![kibana_apache_log](https://dr5mo5s7lqrtc.cloudfront.net/items/3o273B2q132H230D3i0L/kibana_cap2.png)

こんな感じでログが確認できると思います。
kibanaの各種設定なんかはまた後日。


## おわりに

調べて触ってみて思ったことをつらつらと。

- 導入が簡単

パッケージ版が出たことで導入が非常に簡単になったと思う。
configも分かりやすくて、今回の構成で迷うところがなかった。

- 負荷が気になる。集約サーバのコストが不安。

うちでは100近いサーバを管理してて、多種多様なサービス・アプリが動いている。
本当に必要なものを選んで、いい感じにチューニングしないとだめだと思う。
docker構成でクラスタしてどう変わるかも気になる。

- バージョン管理

どれも伸び盛りのサービスのため、バージョンアップが早い。
最新を追っていくには依存性や連携回りをよく考えないといけない。

- kibanaの可能性

検索して出てくるkibanaのイカしたダッシュボード画面や、
紹介しきれなかったプラグインを使ってもっと色々やれそう。試してみたい。

##### 蛇足

いろんなサービスが増え続ける中、ログの一元管理は運用の人なら皆考えることだと思う。(←新人が何を生意気な)
今回は**練習**ということでほぼ導入しかしていないが、流れと懸念事項は抑えられたかな、と思う
よりセキュアでスマートな構成を組んで、実際に本番運用してみたらまた更新します。

※画像の挿入方法が間違ってたので修正しました。qiita慣れしてない…