退役コーダーおじさん、Elasticserchをお勉強:2(Kibana環境構築編)

# 概要
- [前回](https://qiita.com/akihiro-o/items/41384f93d6eb032f4166)の続きです。
    - Elasticserch公式のdocker-compose.yamlではKibanaが動く環境が準備されてなかったので、Kibanaが動くContenerを追加して連携させたいと思います。

## 検証内容
Kibanaを使用して実現したい機能を箇条書きで記載。ただし、一度もイジったことがないのでこれら機能要件がKibanaで実現できるかも分かってない状態です。用途次第でその他Elasticが提供している別のツールを使うのが正しいのかもですが、その「当たり」をつける意味でもまずはKibanaがElasticserchと連動して動く環境を作成しで確認してみたいと思います。

- 検証内容(実現したい機能)
    1. データのCRUD操作系インターフェース(以後IFと省略)
        1. ElasticsearchのデータI/O、CRUD操作を行うためのIFとして利用。
        1. その他、RDBMSやKVS、ファイルからElasticserchにデータ取り込みをかけるためのGUIのIF的な利用。
    1. データ操作結果のVIEW表示
        1. Elasticserch内部データを参照するためのGUIとしての利用。
        1. データの検索、集計やクエリを実行する為のIFとしての利用。
    1. その他機能検証項目
        1. なんとなくVIEW的な役割のツールっぽいので認証及び、認可の制限が掛けられるか？
            1. 自前の認証ではなくAuth/OpenIDConnectや、組織内利用シーンではAD連携した認証を行いたい。
            1. 認可に関してはページ(ダッシュボードというらしい？)単位でのアクセス制限と編集制限をかけたい。
        1. 日常の利用で英文はキビしいので日本語化の可否確認。
        1. エクスポート処理の有無。特にGUIとして優れているならばページをPDF等に吐けるのか？

## リファレンス
- 環境構築時に参考にしたサイト
  - [Kibana Guide[7.16]>>Quick Start](https://www.elastic.co/guide/en/kibana/current/get-started.html)
  - [Kibana Guide [7.17] » Set up » Install Kibana » Install Kibana with Docker](https://www.elastic.co/guide/en/kibana/current/docker.html)

## 環境構築

- こちらも公式版コンテナが提供されているのでimageで取得する手法を採用。以下Kibana Guideでサンプル掲載れているdocker-compose.yamlの記載例。


```yaml
version: '2'
services:
  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.0
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml
``` 
- 上記、サンプルに対して下記の変更を適用。
    - imageは公式のkibanaコンテナを取得する方式としてバージョンをElasticserchと揃えてみる。
    - で、volumesでカレントディレクトリのkibana.yamlをマウントしているが、ここでユーザー設定を記載したkibana.yamlをデフォルトのkibana.yamlの配備パスにバインドする処理をしているらしい。
        - kibana.yamlに記載するパラメーターの一覧→[Configure Kibana](https://www.elastic.co/guide/en/kibana/7.17/settings.html)
        - 上記設定可能なパラメータに`i18n.locale`を発見。このパラメーターはBasic以上のライセンスで設定が可能でこの値に"ja-JP"を設定すれば日本語化できるとの事。
            - ライセンス体系も調査が必要。
    - 特に必須設定のパラメータではなく、kibana.ymlマウントを指定しなければDefault設定が適用されるっぽいので一旦無視(volumes設定を消去)して実行してみる。
    - ざっと斜め読みしたがこの他の設定適用方法として、環境変数`KBN_PATH_CONF`にvolumesでマウントさせたkibana.yamlをフルパス指定で定義する等の方法も可能っぽい。
    - その他、Elasticserchと連携する上で(必要と思われる)環境変数等を追記してみました。
    - 下記yaml内のコメント部分は学習及び備忘として当該記事には記載してますが、実際のyamlではコメントは消去しております。

```yaml
version: '2'
services:
  kibana:
    # Elasticserchとバージョンを合わせる
    # (dockerhubで存在確認済み。将来的に現行のStableっぽい7.17に変えるかも)
    image: docker.elastic.co/kibana/kibana:7.16.3
    # 追記01: コンテナ名定義
    container_name: kb01
    environment:
      # 追記2:コピペ(これは要否不明)
      SERVER_NAME: kibana.example.org
      # 追記3:クラスター起動している筈なのでそれぞれのホスト名で記載。
      ELASTICSEARCH_HOSTS: '["http://es01:9200","http://es02:9200","http://es03:9200"]'
    # 追記4:これもネットからパクリでdockerで利用の場合はポートをマッピングしないとならない筈。
    ports:
      - "5601:5601"
    # 追記5:network定義。Elasticserchと同じサブネット適用のために必要(になると思う)
    networks:
      - elastic
```

上記kibanaのコンテナ設定を、前回検証したElasticsearchクラスター定義のdocker-compose.yamlに追記して再度`docker-compose up -d`コマンドで起動し、`docker ps`で無事にコンテナが起動した事を確認。

```bash
❯❯❯ d ps
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED         STATUS         PORTS                              NAMES
cadac7c9eb16   docker.elastic.co/elasticsearch/elasticsearch:7.16.3   "/bin/tini -- /usr/l…"   2 minutes ago   Up 2 minutes   0.0.0.0:9200->9200/tcp, 9300/tcp   es01
83d1eb3f7e71   docker.elastic.co/elasticsearch/elasticsearch:7.16.3   "/bin/tini -- /usr/l…"   2 minutes ago   Up 2 minutes   9200/tcp, 9300/tcp                 es03
2f0e719021b0   docker.elastic.co/elasticsearch/elasticsearch:7.16.3   "/bin/tini -- /usr/l…"   2 minutes ago   Up 2 minutes   9200/tcp, 9300/tcp                 es02
e53fd123aab4   docker.elastic.co/kibana/kibana:7.16.3                 "/bin/tini -- /usr/l…"   2 minutes ago   Up 2 minutes   0.0.0.0:5601->5601/tcp             kb01

```
上記の`docker ps`戻り値で、kb01がdockerのホスト側5601番ポートにバインドできている事が確認できたのでlocalhost:5601にアクセスして動作確認。上手く動いたのでここまでのdocker-compose.yamlを[githubにPush](https://github.com/akihiro-o/my_elastic)していちおう構成管理。
![http://localhost:5601で起動した画面のスクショ](https://i.imgur.com/MQEA2dA.png)
Webで調べた結果(事前の調査ではKibanaのHome画面だった)と異なるが、一応は起動している様子。左の「Add Integrations」ボタンを押下するとこのような画面に切り替わった。
![Add Integrationsボタン押下後](https://i.imgur.com/kk8KG33.png)
なるほど、わからん…… 正直、機能が盛りだくさんすぎて目が辛い。。。ブラウザバックしてとりあえずGoogle翻訳に掛けて意図を読む事。ふむふむ、、、今度は統合を追加するではなく「自分で探検する」のリンクを押下。
![初期ページのGoogle翻訳](https://i.imgur.com/4wrmb8y.png)
遷移後の画面。当方英語力が弱くカッコつけても始まらない。最初からGoogle翻訳かけたページでダッシュボードに配備されているElasticの機能群の意図を流し読み。
![自分で探求する側のページ](https://i.imgur.com/tHbERot.png)
左上の「エンタープライズサーチ」のあたりがElasticserchへのデータI/Oのインターフェース提供かな？管理メニューに「権限の管理する」メニューの存在を確認できた。うん。アクセス制御も可能っぽい。やはり英語よりこの英訳ページと適宜画面を切り替えつつ機能検証を開始しようと思います。

で、注目すべきはこの「サンプルデータを試す」がチュートリアル的な役割を果たすのではないでしょうか？早速ボタン押下。
下記画像はGoogle翻訳済みのページですが、「データを追加するその他の方法」といったページでサンプルデータを元にKibanaを動かすか、独自データをアップロードする選択が出ました。
![サンプル選択ページ](https://i.imgur.com/paH2MUa.png)

とりあえず「サンプルデータ」タブの「eコマース注文のサンプル」を試してみる。
![eコマース注文のサンプル](https://i.imgur.com/0AlrhTn.png)
どうやらサンプル適用は上手く動いている様子だが、データを追加するっていうよりKibanaのフロントエンドとしての機能紹介っぽいページですね。各種チャートが使えることや検索IFとして利用できるメニューが存在することを確認。

ブラウザバックして今度は「ファイルをアップロードする」タブ側を確認。
![ファイルをアップロードする](https://i.imgur.com/izgdRva.png)
どうやらCSV/TSV/JSONをElasticserchにインポートができる旨が記載されている。
この時点でファイル連携できることはクリアしているが、ちょっと手動で取り込むのはイケてないから嫌だなと。。(もう少しイケてる連携方法がありそうな気がする。それがBeatsとかLogstashなのかな？)。
そしてElasticserchの構築時にQuick startページの記事で見たクエリIFの使い方がまるでわからない(と言うかダッシュボードからその画面遷移方法がわからない)よって、ここらで一旦、ネットを検索してた結果、この[【初心者向け】Elastic Stackについて知ろう](https://dev.classmethod.jp/articles/elastic-stack-for-beginners/)が非常にわかりやすくまとめられておりました(以下、引用です)。

> DevTools (Console)
> Elasticsearchに対するREST APIを簡単に実行できるUI

私が探していたクエリIFの画面は"Dev Tools(Console)"と言うらしい。Kibanaの左メニューで該当文言を探し、リンク押下で同じ画面か確認した。やっとKibanaのGUIインターフェース上でのI/Oを探し当てたが、動作状況を確認する意味で前回の記事で参照したQuick Startページで'Serch Data'のExampleとして紹介されてたKibana用のクエリ文言(下記のCurlでJSONを送信する文法の省略形みたいな奴)を実行してみる。

```bash
GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}
```

以下、実行結果のレスポンスです。(最上段のコメント行でKibanaの設定に関するセキュリティー警告が出てますが、設定周りは一旦無視して)前回実行したCurlコマンドと同じJSONレスポンスを得られました。
![Dev Tools(Console)](https://i.imgur.com/7GTmfek.png)

だいぶ文章が長くなったので今回はここまで。