【AWS】ログの可視化してますか？ElasticsearchServiceを使ってログを可視化する（2015/12/17時点ではElasticsearchServiceにバグがあるので要注意！回避策あり）

# ログの可視化

ログの可視化してますか？

ログの可視化とは、様々な場所に散っているログを一か所に集めて見やすくする事です。
Webアプリケーションを例に考えてみます。
Webアプリケーションの場合、以下のログがあると思います。

* アプリケーションログ
* DBのクエリログ
* ロードバランサーのアクセスログ
* などなど

障害が発生して、その解析のためにログを見たいとなったとき、それぞれのサーバーにアクセスしてログを見るのは手間がかかります。
また、生のログは人にとって読みにくい事も多いです。
ブルーグリーンデプロイメントを行っている場合、見たいログがそもそもすでになくなっているかもしれません。
そこで、ログの可視化です。
ログを一か所に集積しておき、専用のビューアーで全てのログを見れるようにします。
人が見やすいようにログを整形し、時系列による絞込みや、キーワード検索まで出来るようにしておくのが一般的です。
障害解析のユースケースで考えると、時系列で絞り込みをしてやれば、障害発生時間の前後の各種ログを簡単に見る事ができます。

障害発生時に、ログ解析がスムーズに出来ると嬉しいですね！
やっていない方は、ぜひ、ログの可視化をやりましょう。
この記事では、AWSのElasticsearchServiceを使ってログの可視化を行う方法を解説します。
オンプレミスでサービスを運用している方も、ログの可視化にのみElasticsearchServiceを使う事ができます。

# ElasticsearchServiceの概要

## ログ可視化の一般的な構築方法

ElasticsearchServiceの概要について説明する前に、一般的なログ可視化方法について説明しておきます。
ログの可視化は、以下の3つの構成で構築するのが一般的です。

* ログ収集
    * 様々な場所に散っているログを収集する仕組み
* バックエンド
    * ログを集積する場所。検索エンジンを持つ事も多い
* ビューアー
    * 収集したログを見せるビューアー

3つそれぞれ、多くのツールが世に出ています。
例えば、ログ収集ではFluentdが有名です。

## AWSのElasticsearchService

ElasticsearchServiceとは、上記の3つの構成のうちの「バックエンド」と「ビューアー」をセットで提供してくれているサービスです。
「バックエンド」にはElasticsearchが、「ビューアー」にはKibanaが使われています。
両方ともElastic社がOSSで開発を行っているツールで、Githubでソースコードを見る事ができます。
https://github.com/elastic/elasticsearch
https://github.com/elastic/kibana

ElasticsearchとKibanaの特徴を簡単に書いておきます。

* Elasticsearch
    * RESTAPIでデータの操作を行う事ができます
    * 簡単にクラスタ構成を組む事ができます
* Kibana
    * Elasticsearchとセットで使う事が一般的なビューアーです
    * Kibana自体はただのHTMLです
    * グラフなどを簡単に作る事ができて、データの見せ方の自由度が高いです

ElasticsearchServiceの利用を開始すると、ElasticsearchとKibanaがセットで構築され、Elasticsearchにログを送ってやれば、そのログをKibanaで見る事ができます。

利用が簡単で便利なサービスですので、ログの可視化時にはぜひ利用を検討してみて下さい。
ただし、ElasticsearchServiceには致命的なバグがあるので注意が必要です。（2015/12/17時点）
回避策はあります。
バグについては後述します。

# ElasticsearchServiceを使ってみる

ElasticsearchServiceを使ってみます。
ここでは、CloudWatchLogsのログをElasticsearchServiceに送ります。

### 1. ElasticsearchServiceのインスタンスを作成する

サービス一覧からElasticsearchSearviceを選択します。
![es1.png](https://qiita-image-store.s3.amazonaws.com/0/20223/23e8a9b9-b43f-f221-b654-7c1466afdcc8.png)

「Create a new domain」から新しいインスタンスを作成します。
![es2.png](https://qiita-image-store.s3.amazonaws.com/0/20223/4d9bfb46-817d-bc0c-ec24-07dc3fda979f.png)


インスタンスを識別する名前を入力して、「Next」を押します。
![es3.png](https://qiita-image-store.s3.amazonaws.com/0/20223/48654761-9191-ac77-be24-0cd89db105b6.png)


ここでは一番安いインスタンスタイプを選択して、「Next」を押します。
![es8.png](https://qiita-image-store.s3.amazonaws.com/0/20223/598a085a-fc3c-c53b-60ad-be91c8437718.png)

アクセスポリシーの設定をします。
アカウントや、IPアドレスによるアクセス制限を行う事ができます。
ここでは、全てのアクセスを許可する設定を行って「Next」を押します。
![es5.png](https://qiita-image-store.s3.amazonaws.com/0/20223/97981dc0-2ef5-a17f-2498-cc1174933cc6.png)

最後に入力項目を確認して、インスタンスの作成を行います。
![es7.png](https://qiita-image-store.s3.amazonaws.com/0/20223/ca64cd96-0a97-84eb-7696-5e9e9ea118f8.png)

以下は、作成完了後の画面です。
赤で囲ったURLのうち、上がElasticsearchのURL、下がKibanaのURLになります。
![es14.png](https://qiita-image-store.s3.amazonaws.com/0/20223/143aebfd-9eef-3be5-0021-e5f7abaa2d9a.png)


### 2. CloudWatchLogsにログを送る
http://qiita.com/ukiuni@github/items/8f0c45037e3a28238290
上記の記事を参考に、EC2インスタンスの/var/log/secureをCloudWatchLogsに送ります。

### 3. CloudWatchLogsのログをElasticsearchServiceに送るように設定する
CloudWatchのコンソールの「ログ」タブで、ElasticsearchServiceに送りたいロググループを選択します。
選択した状態で「アクション」の「Amazon Elasticsearch Serviceへのストリーミングの開始」を選択します。
![es9.png](https://qiita-image-store.s3.amazonaws.com/0/20223/b94201c6-1976-df37-0ce9-56a19a7864fc.png)

「Amazon ES クラスター」で先ほど作成したElasticsearchServiceのインスタンスを選択します。
「Lambda IAM 実行ロール」では、「新しいIAMロールの作成」を選択します。
新しいIAMロール「lambda_elasticsearch_execution」が作成され、選択された状態になります。
「次へ」を押します。
![es11.png](https://qiita-image-store.s3.amazonaws.com/0/20223/bae8fb52-e954-29e1-c667-0e2c45f81ea5.png)

ログ形式の選択をします。
ここでは、「その他」を選択して「次へ」を押します。
![es12.png](https://qiita-image-store.s3.amazonaws.com/0/20223/9755da0b-937c-daf3-5c7c-cfd645035378.png)

設定項目を確認して、「ストリーミングの開始」を押します。
![es13.png](https://qiita-image-store.s3.amazonaws.com/0/20223/51a95d50-5fd0-2950-c08f-c1a80a30160f.png)


これで、準備は完了です。
EC2インスタンスの/var/log/secureにログが追加されると、自動でElasticsearchServiceに送られるようになりました。
Kibanaの使い方は省略しますが、以下のようにログが見れるようになります。
![es15.png](https://qiita-image-store.s3.amazonaws.com/0/20223/35fbf5a4-bf8b-93ea-5fd8-f41600b92e53.png)

ElasticsearchServiceの利用が簡単な事がわかってもらえたと思います。
今回はAWSの機能を使ってCloudWatchLogsのログをElasticsearchServiceに送りましたが、もちろんその他の方法でもログを送る事ができます。
ElasticsearchServiceでは、Elasticsearchが使われていますのでElasticsearchのWebAPIを使ってログの送信ができます。
つまり、オンプレミスで運用しているサービスであっても、ログの可視化にのみAWSのElasticsearchServiceを使うという事ができるのです。

# ElasticsearchServiceにあるバグ（2015/12/17時点）

ElasticsearchServiceには致命的なバグがあります。
Kibanaは1つの画面で複数のログデータを表示する事ができますが、2つ以上のデータを表示しようとすると正しくデータが表示されない事があるのです。

AWSに問い合わせて調査してもらったところ、Kibanaの特定パッチのバグである事がわかりました。
対応はAWSの方で検討するという回答をもらいましたが、現状解決はされていません。
以下、AWSからKibanaコミュニティへの問い合わせです。
https://github.com/kibana-community/kibana4-static/issues/5

上記はElasticsearchServiceのKibana4を使った時に起こるバグです。
実は、ElasticsearchServiceでは旧バージョンのKibana3を使う事も可能です。
KibanaのURLは最後が /_plugin/kibana になっていますが、これを /_plugin/kibana3 に変えてやるとKibana3が使えます。
Kibana3を使えば、バグは回避できます。

1つの画面で複数のログデータを表示して使うのがKibanaの一般的な使い方になると思うので、これが解決されるまではElasticsearchServiceでKibana4を使うのは難しいでしょう。。。

# ElasticsearchServiceに期待したい事

障害対応をしてもらう事以外に、期待したい事があります。

現状、ElasticsearchServiceにログを送る手段が、全てのAWSサービスにおいて提供されているわけではありません。
Webアプリを構築する場合、RDSのクエリログやELBのアクセスログをElasticsearchServiceに送りたくなりますが、その手段がAWSからは提供されていません。
RDSであればDBのテーブル内に、ELBであればS3にログが出力されるので、そのログをElasticsearchServiceに送る仕組みは自分で作らないといけないのです。
全てのログが、簡単にElasticsearchServiceに送れるようになるよう期待したいです。

# まとめ
サービス提供にあたってはログの可視化を行うと便利な事が多いです。
AWSのElasticsearchServiceを使うと、ログの可視化を簡単に実現できます。
ただし、ElasticsearchServiceには現状バグがあるので利用には注意が必要です。