Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで② - Kibana編

## 背景
前回の記事の続きです！
この記事は2/4回目です。

## できること
この投稿は全４回に渡ってシリーズ化する予定です！
ほかの記事もよろしければぜひご覧ください。

1. [Elasticsearch編](https://qiita.com/sgr0416st/items/d0d00723b49c3935137e): ElasticsearchをDocker上で起動して、実際に動かしてみる
2. **[Kibana編](https://qiita.com/sgr0416st/items/28dc2df02bb946f94209): KibanaをDocker上で起動して、データを可視化してみる**
3. [Filebeat編](https://qiita.com/sgr0416st/items/74723ba2bb5667f5411a): Filebeatを利用して、ログファイルをKibanaで表示してみる
4. [Spring Boot編](https://qiita.com/sgr0416st/items/3bb415783f1464aa7df6): 簡単なSpring Webアプリケーションをローカルで実行、ログを作成してそれをKibanaで可視化する

[デモ編](https://qiita.com/sgr0416st/items/6409fb84f5463cd2112a): とりあえず完成品を動かしてみる


## Kibanaとは
https://www.elastic.co/jp/what-is/kibana

> Kibanaは無料かつオープンなフロントエンドアプリです。Elastic Stackを統括して管理し、Elasticsearchでインデックスされたデータに、検索と可視化の機能を提供します。一般的には“Elastic Stackで使えるチャート作成ツール”として知られています。一方で、KibanaはElastic Stack（Elasticsearch、Logstash、Kibanaの頭文字から以前は“ELK”と呼ばれることもありました）クラスターの監視や管理、保護のためのユーザーインターフェースとして、さらに、Elastic Stackに搭載されている各種ソリューションの一元的なハブとしても活躍します。2013年にElasticsearchコミュニティで誕生して以来、KibanaはElastic Stackの開かれた窓として、多くのユーザーと組織にポータルとしての機能を提供しつづけています。

今回の目的では、ざっくりElasticsearchが返すデータをいい感じに表示してくれるUIツールと思ってもらえれば大丈夫です。

## 手順
それでは早速KibanaをDocker上で起動していきます。

#### 前提
- 前回の記事([Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで - Elasticsearch編](https://qiita.com/sgr0416st/items/d0d00723b49c3935137e))を実行済み

１. **ファイルの準備**
ファイル構成は前回と同じです。
(今回はkibanaの設定をデフォルトのまま利用するので設定ファイルは必要ありません。)

- /{projectディレクトリ}/
    - elasticsearch/
        - elasticsearch.yml 
    - **docker-compose.yml**

２. **dockerの準備**
docker-compose.ymlファイルを以下の様に追記します

```docker-compose.yml
version: '3.2'
services:
  elasticsearch:
    networks:
      - elastic
    ...

  kibana:
    image: docker.elastic.co/kibana/kibana:7.13.0
    hostname: kibana101
    container_name: cont-kibana
    ports:
      - 5601:5601
    mem_limit: 1g
    networks:
      - elastic
    depends_on:
      - elasticsearch

...

networks:
  elastic:
    driver: bridge
```

今回も要点だけ簡単に説明していきます。
まず複数のコンテナ同士でデータのやりとりをするために通信するので、ネットワークの設定が必要になります。
ルートのnetworksの記述で全体のネットワークを定義して、各サービス(elasticserch, kibana)のnetworksで使用するネットワークを指定しています。
自分もネットワークに関してはあまり詳しくないですが、こちらが勉強になるかと(https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9)

また、depends_onを設定することでelasticsearchの起動開始を待ってkibanaを起動することが出来ます。

４. **実行されているか確認する**
以下のコマンドを実行したあと、しばらく待って Kibana (http://localhost:5601) にアクセスしてみてください。(起動まで2, 3分かかります)

```shell
docker-compose up -d
```

すると、うまく起動できればホーム画面が表示されると思います。

５. **実際に動かしてみる**
続いて、実際にデータを入れてもう少し動かしてみましょう。
REST APIを使って直接Elasticsearchにデータを保存することもできますが、Kibanaからも独自の命令文を使ってElasticsearchとデータのやりとりをできます。今回はそちらの方法で[公式のチュートリアル](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html)を参考にしながら実際に動かしてみましょう。
まずは、以下のスクリーンショットのように左上タブからManagement > Dev Toolsと進んでください。

![kibana screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/5d363d9e-b16b-06d6-affb-fd1287fa9639.png)

するとDev Toolsが開くので、まずは以下のコマンドをコピペして実行し、Elasticsearchと接続ができているか確認しましょう。

```
GET /
```

うまくできている場合、次のようなレスポンスが表示されると思います。

```json
{
  "name" : "logging-node",
  "cluster_name" : "logging-cluster",
  "cluster_uuid" : "CP6gaxMHSKWpvvl63jM1ug",
  "version" : {
    "number" : "7.13.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "5ca8591c6fcdb1260ce95b08a8e023559635c6f3",
    "build_date" : "2021-05-19T22:22:26.081971330Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

最初にセキュリティの設定がなされていないという旨の警告文が表示されるかもしれませんが、ローカルで動かす分には問題ありません。
(リモートで、Productionモードで動かす際は必ず設定しましょう:  https://www.elastic.co/guide/en/elasticsearch/reference/7.13/security-minimal-setup.html)

次に、データが入っていない状態でElasticsearch内を検索してみます。
以下のコマンドはElasticsearch内にある"logs-my_app-default"というインデックス内に存在するデータを検索するリクエストです。

```
GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}
```
当たり前ですがlogs-my_app-defaultというインデックスを登録していないため、データ(index)が見つからないという趣旨のエラーメッセージ(index_not_found_exception)が返ってきますね。
では早速データを追加してみましょう。
以下のリクエストは
"192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
というeventをlogs-my_app-defaultというインデックスに保存するリクエストです。このインデックスは今存在していないため、自動的に作成されます。

```
POST logs-my_app-default/_doc
{
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "event": {
    "original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
  }
}
```

続いて先ほどエラーが出た検索リクエストをもう一度送ってみましょう。
すると、先程とは違い以下の様なデータがきちんと返ってきます。

```json
{
  "took" : 18,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : ".ds-logs-my_app-default-2021.06.26-000001",
        "_type" : "_doc",
        "_id" : "lRHXR3oBWlQF26Pok4hK",
        "_score" : null,
        "_source" : {
          "@timestamp" : "2099-05-06T16:21:15.000Z",
          "event" : {
            "original" : """192.0.2.42 - - [06/May/2099:16:21:15 +0000] "GET /images/bg.jpg HTTP/1.0" 200 24736"""
          }
        },
        "sort" : [
          4081767675000
        ]
      }
    ]
  }
}
```

お疲れ様です、以上でkibanaがきちんと動作し、Elasticsearchときちんと連携もできていることが確認できたと思います。
最後に以下のコマンドを実行してコンテナを停止させておきましょう。

```
 docker-compose down -v --rmi local
```

続いてfilebeatを設定していきましょう！
[Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで③ - filebeat編](https://qiita.com/sgr0416st/items/74723ba2bb5667f5411a)


## 参考
-  Elasticsearch security: https://www.elastic.co/guide/en/elasticsearch/reference/7.13/security-minimal-setup.html
-  Kibana get started: https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
- kibana index: https://docs.uipath.com/installation-and-upgrade/lang-ja/docs/creating-an-index-pattern-to-connect-to-elasticsearch