AWS EC2上にfluentd + fluent-plugin-twitter + elasticsearch + kibana インストールするメモ

AWS EC2上にfluentd + fluent-plugin-twitter + elasticsearch + kibana インストールするメモ。


# 0. instance立ち上げ

EC2上にinstanceを立ち上げる。
とりあえず、お試しならt2.microでも良いかも。

AWS t2.micro
OS: Amazon Linux AMI (HVM)

ツール、データはS3上に上げておくと、外部からダウンロードするより少し早いし、お財布にも少し優しい。


# 1. yum update

```bash
$ sudo yum update -y
```

# 2. swap設定

EC2instanceがt2.microのときswap領域を設定する

```bash
$ sudo dd if=/dev/zero of=/swap.img bs=1M count=2048
$ sudo chmod 600 /swap.img
$ sudo mkswap /swap.img
$ sudo bash -c 'echo "/swap.img    swap    swap    defaults    0    0" >> /etc/fstab'
```

swapを有効にする

```bash
$ sudo swapon -a
```

# 3. 日本時間に設定

```bash
$ sudo vi /etc/sysconfig/clock
```
ZONE="Asia/Tokyo"
に書き換える。

```bash
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ sudo reboot
```

# 4. 開発環境インストール

```bash
$ sudo yum -y install gcc* make
```


# 5. TreasureDataレポジトリの追加。

install-redhat.sh によりyumレポジトリの登録と、td-agentのrpmパッケージのインストールが行える。

```bash
$ sudo bash -c 'curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh'
$ sudo service td-agent start
$ sudo chkconfig td-agent on
```

タグを動的に扱うプラグインとプレースホルダを扱えるようにするプラグインを追加でインストール。

```bash
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem update
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-config-expander
```

# 6. Elasticsearchインストール

ElasticsearchにJavaが必要だが、Amazon Linux AMI (HVM)にはJavaがインストール済み。

[公式サイト](http://www.elasticsearch.org/download/) からダウンロード

```bash
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.2.2.noarch.rpm
$ sudo rpm -ivh elasticsearch-1.2.2.noarch.rpm
$ sudo chkconfig elasticsearch on
```

```bash
$ sudo service elasticsearch status
```
動いていないようなら、起動

```bash
$ sudo service elasticsearch start
```

Elasticsearchの動作確認

テストデータ登録

```bash
$ curl -XPUT http://localhost:9200/mytest/test/1 -d '
> {
>   "title" : "test_title",
>   "text"  : "test_text"
> }'
```

データを検索

```bash
$ curl -XGET http://localhost:9200/mytest/test/_search -d '
> {
>   "query":
>   { "match":{"title":"test_title"}}
> }'
```

Kuromojiプラグインインストール

Kuromojiプラグインは、Elasticsearch用の日本語解析プラグインである。

[elasticsearch/elasticsearch-analysis-kuromoji](https://github.com/elasticsearch/elasticsearch-analysis-kuromoji)

Elasticsearchのバージョンによって、インストールするバージョンが異なるので注意。

```bash
$ sudo /usr/share/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.2.0
```

ElasticSearchの再起動

```bash
$ sudo service elasticsearch restart
```

テスト用の登録

```bash
$ curl -XPUT 'http://localhost:9200/kuro_test/' -d'
  {
      "index":{
          "analysis":{
              "tokenizer" : {
                  "kuromoji" : {
                     "type" : "kuromoji_tokenizer"
                  }
              },
              "analyzer" : {
                  "analyzer" : {
                      "type" : "custom",
                      "tokenizer" : "kuromoji"
                  }
              }
          }
      }
  }'
```

テスト

```bash
$ curl -XPOST 'http://localhost:9200/kuro_test/_analyze?analyzer=analyzer&petty' -d '貴社の記者'
```


ElasticsearchとKuromojiプラグインで日本語全文検索

```bash
$ sudo vi /etc/elasticsearch/elasticsearch.yml
```

```
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer
```

```bash
$ sudo service elasticsearch restart
```

テスト用の登録

```bash
$ curl -XPUT http://localhost:9200/jptest/test/1 -d '
>  {
>    "title" : "メモ",
>    "text"  : "梅酒は水"
>  }'
```

```bash
$ curl -XPUT http://localhost:9200/jptest/test/1 -d '
>  {
>    "title" : "メモ",
>    "text"  : "梅酒は水"
>  }'
```

梅酒で検索

```bash
$ curl -XGET http://localhost:9200/jptest/test/_search -d '
>    {
>      "query":
>      { "match":{"text":"梅酒"}}
>    }'
```

梅酒はで検索

```bash
$ curl -XGET http://localhost:9200/jptest/test/_search -d '
>    {
>      "query":
>      { "match":{"text":"梅酒は"}}
>    }'
```

両者のスコアの違いを確認する。

Elasticsearchをfluentdで利用するためにfluent-plugin-elasticsearchをインストール

```bash
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
```


登録されているすべてのインデックスを表示

```bash
$ curl -X GET http://localhost:9200/_aliases
```

次の作業のために、テストデータを削除しておく

```bash
$ curl -XDELETE 'http://localhost:9200/*'
```

# 7. fluent-plugin-twitterインストール

[y-ken/fluent-plugin-twitter](https://github.com/y-ken/fluent-plugin-twitter)

```bash
$ sudo yum install openssl-devel libcurl libcurl-devel
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install eventmachine
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-twitter
```

dev.twitter.comでアプリ登録し、以下の情報を入手する。

- API key
- API secret
- Access token
- Access token secret


```bash
$ sudo vi /etc/td-agent/td-agent.conf
```


```
<source>
  type twitter
  consumer_key        xxxxxxxx # API key
  consumer_secret     yyyyyyyy # API secret key
  oauth_token         zzzzzzzz # Access token
  oauth_token_secret  pppppppp # Access token secret
  tag                 input.twitter.sampling
  timeline            sampling
  keyword             daihyo
  lang                ja,en
  output_format       nest
</source>

<match input.twitter.sampling>
  type copy
  <store>
    type file
    path /tmp/twitter
  </store>
  <store>
    type elasticsearch
    include_tag_key true
    tag_key @log_name
    host 127.0.0.1
    port 9200
    logstash_format true
    logstash_prefix twitter
    flush_interval 10s
  </store>
</match>
```

```bash
$ sudo service td-agent restart
```

process finished code=6でtd-agentが落ちてしまう場合、openssl-devel, eventmachineをインストールすると解決する（ことがある？）

twitter-2014.07.15はfluent-plugin-twitterが作ってくれるはず。
分からなければ、登録されているすべてのインデックスを表示して確認すると良い。


```bash
$ curl -X GET http://localhost:9200/twitter-2014.07.15/_search -d '
{
"query":
{ "match":{"text":"daihyo"}}
}'
```

# 8. Kibana

KibanaはElasticsearchのフロントエンドとして動作するソフトウェアで、Kibanaを使う事によって、ストリーミングデータをリアルタイムで分析することができるようになる。

Kibanaは9200ポート経由でElasticsearchに接続しようとするので、Apacheのリバースプロキシを経由するようにする。
kibana.example.comはヴァーチャルホスト用のアドレス。各自の環境に合わせて変更すること。

```bash
$ sudo useradd kibana
$ sudo chmod +x /home/kibana
$ sudo su - kibana
# curl -LO http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip
# unzip kibana-latest.zip
# ln -s /home/kibana/kibana-latest ./kibana
# vi /home/kibana/kibana/config.js
# grep okochang /home/kibana/kibana/config.js
    elasticsearch: "http://kibana.example.com/es/",
# exit
```

```bash
$ sudo yum install httpd -y
```

digest認証をするなら

```bash
$ sudo htdigest -c /etc/httpd/conf/htdigest "Required authentication" kibana
```

```bash
$ sudo vi /etc/httpd/conf.d/kibana.conf
```

```apache:/etc/httpd/conf.d/kibana.conf
NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /home/kibana/kibana
    ServerName kibana.example.com
    ProxyPass /es/ http://localhost:9200/
    ProxyPassReverse /es/ http://localhost:9200/
    CustomLog logs/access_log custom
    ErrorLog logs/error_log
    Options FollowSymLinks
#    <Location />
#        AuthType Digest
#        AuthName "Required authentication"
#        AuthUserFile /etc/httpd/conf/htdigest
#        require valid-user
#        Satisfy any
#        Order deny,allow
#        Deny from all
#        Allow from 127.0.0.1
#    </Location>
</VirtualHost>
```

必要ならヴァーチャルホスト用のサーバ名をDNS登録する。

ブラウザで http://kibana.example.com にアクセスして、Dashboardからデータが閲覧できることを確認する。

# やり残し
- データをs3にも保存しておく
- td-agent2への対応 http://qiita.com/repeatedly/items/5904e81e1856e0671684

# 参考にしたWebページ

- Installing Fluentd Using rpm Package | Fluentd http://docs.fluentd.org/articles/install-by-rpm
- fluentdでログをS3に格納する - OpenGroove http://open-groove.net/fluentd/fluentd-s3/
- Kuromojiで日本語全文検索 – AWSで始めるElasticSearch(1) ｜ Developers.IO http://dev.classmethod.jp/cloud/aws/use-elasticsearch-1-use-kuromoji/
- fluentd と Elasticsearch と kibana の組み合わせがとても気に入ったのでメモ - ようへいの日々精進 XP http://inokara.hateblo.jp/entry/2013/09/07/122149
- fluentd + fluent-plugin-twitter + elasticsearch + kibana でお手軽にツイートを可視化する試み - ようへいの日々精進 XP http://inokara.hateblo.jp/entry/2013/12/05/072519
- プラグインの設定を入れると、「process finished code=6」で落ちます · Issue #3 · y-ken/fluent-plugin-twitter https://github.com/y-ken/fluent-plugin-twitter/issues/3
- FluentdからElasticsearchに転送してKibanaで可視化する - okochangのインフラ日誌 http://okochang.hatenablog.jp/entry/2014/03/21/191523
- Elasticsearch - Elastic Searchで全てのデータ(index)を削除する - Qiita http://qiita.com/bounscale/items/c2d2eb6cf61bb1fa8e1b