見出し画像

課題: 開発テスト用に Elasticsearch を立ち上げてください

あなたはすぐにできますか?

わたしはと言うと、方法は分かっていても実際に出来るかどうかまでは試したことがありませんでした。
なので、やってみました。

実際やってみると、いろいろと分かっていないことが分かるものです。
もしあなたも同じように自信が無いのなら、手を動かしアタマを使い、取り組んでみてはいかがでしょうか?

今回わたしは 次のような手順↓で進めました。

1) Docker

Elasticsearch のインストーラーを使っても良いのですが、やはりポータビリティを優先して Docker コンテナーとして動作させることにしました。
手元の PC は Windows なので、Docker Desktop for Windows を使いました。

インストール手順は過去の記事と同じなので省略します。

2) Elasticsearch

Elastic Stack 公式サイトを確認しました。
https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html

2-1) ドキュメント&チュートリアル

公式サイトにある Install Elasticsearch with Docker というページを参考にしました。
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

Elasticsearch のバージョンは ver.7.8.0 を選択しました。
サブスクリプションプランがあるようですが、今回は OpenSource/Basic で使うことにしました。

テスト用として立ち上げるため、single-node で起動する方法を確認しました。

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.8.0

2-2) 設定ファイルの準備

Docker-Compose 設定ファイル "docker-compose.yml" を作成しました。
収集したデータが揮発しないよう、services.elasticsearch.volumes[] を追加指定しました。

version: '3.8'

services:

  elasticsearch:
    image: elasticsearch:7.8.0
    networks:
      - elastic
    restart: always
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - ./data:/usr/share/elasticsearch/data
    environment:
      discovery.type: single-node

networks:
  elastic:

2-3) サービスの起動

いつもどおりならあっさりと

>docker-compose up

を実行するところですが、今回は Visual Studio Code(以下 VS Code)の Docker Extension を活用してみました。

画像2

VS Code の Explorer View で docker-compose.yml ファイルを右クリックすると、"Compose Up" というアイテムがあるのでこれを実行しました。

画像1

実行するとターミナルが開きました。

(base) PS C:\Users\abech\Downloads\examples> cd "c:\Users\abech\Downloads\examples"
(base) PS C:\Users\abech\Downloads\examples> docker-compose -f "docker-compose.yml" up -d --build
Creating network "examples_elastic" with the default driver
Creating examples_elasticsearch_1 ... done

2-4) サービスの起動確認

Docker View に出現した "elasticsearch:7.8.0" という項目を右クリックすると、"Open in Browser" というアイテムがあるのでこれを実行しました。

画像3

ポート 9200 か 9300 かを選択するダイアログが出現したので、9200 を選択すると、以下のテキストがブラウザーで表示されました。

{
  "name" : "f4a9074c6654",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "Gbecw-HpScujb91Hn55d7Q",
  "version" : {
    "number" : "7.8.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
    "build_date" : "2020-06-14T19:35:50.234439Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

これで Elasticsearch の起動を確認できました。

3) Kibana

Elasticsearch サービスの起動は確認できましたが、ちゃんとデータを受け取れて、ちゃんとデータを検索できるのかが不安だったので、Kibana を追加で導入します。

3-1) ドキュメント&チュートリアル

公式サイトにある Install Kibana with Docker というページを参考にしました。
https://www.elastic.co/guide/en/kibana/current/docker.html

Kibana のバージョンは、Elasticsearch に合わせて ver.7.8.0 を選択しました。

起動する方法を確認しました。

docker run --link YOUR_ELASTICSEARCH_CONTAINER_NAME_OR_ID:elasticsearch -p 5601:5601 {docker-repo}:{version}

3-2) 設定ファイルの準備

Docker-Compose 設定ファイル "docker-compose.yml" を再作成しました。
Kibana 単体で起動したときの挙動を確認するため、一旦 "--link" オプションに該当する指定は省きました。

version: '3.8'

services:

  kibana:
    image: kibana:7.8.0
    networks:
      - elastic
    restart: always
    ports:
      - 5601:5601

networks:
  elastic:

3-3) サービスの起動

VS Code の Explorer View で docker-compose.yml ファイルを右クリックして、"Compose Up" を実行しました。

(base) PS C:\Users\abech\Downloads\examples> cd "c:\Users\abech\Downloads\examples"
(base) PS C:\Users\abech\Downloads\examples> docker-compose -f "docker-compose.yml" up -d --build
Creating network "examples_elastic" with the default driver
Creating examples_kibana_1 ... done

3-4) サービスの起動確認

Docker View に出現した "kibana:7.8.0" という項目を右クリックして、"Open in Browser" を実行すると、以下のテキストがブラウザーで表示されました。

Kibana server is not ready yet

いつまで待っても表示に変化がないので、右クリックして "View Logs" というアイテムを実行しました。

{"type":"log","@timestamp":"2020-07-09T13:22:26Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"No living connections"}        
{"type":"log","@timestamp":"2020-07-09T13:22:29Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"Unable to revive connection: http://elasticsearch:9200/"}
{"type":"log","@timestamp":"2020-07-09T13:22:29Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"No living connections"}
{"type":"log","@timestamp":"2020-07-09T13:22:31Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"Unable to revive connection: http://elasticsearch:9200/"}
{"type":"log","@timestamp":"2020-07-09T13:22:31Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"No living connections"}

Elasticsearch のアドレス指定を正せば、問題なく動作しそうであることが分かりました。

一旦起動中のコンテナーを削除するために、VS Code の Docker View からすべてのコンテナーを "Remove..." しました。

3-2') 設定ファイルの準備

解決方法を2通り検討しました。

・ kibana コンテナーから elasticsearch コンテナーにリンクを通す
・ kibana コンテナーの環境変数 ELASTICSEARCH_HOSTS に Elasticsearch サービスの外部アドレスを指定する

どちらも成功しましたが、ここでは正攻法である前者を記載します。

Docker-Compose 設定ファイル "docker-compose.yml" を再々作成して、
elasticsearch コンテナーと kibana コンテナーの両方を記載し、services.kibana.links[] にelasticsearch を指定しました。

3-3') サービスの起動

(base) PS C:\Users\abech\Downloads\examples> cd "c:\Users\abech\Downloads\examples"
(base) PS C:\Users\abech\Downloads\examples> docker-compose -f "docker-compose.yml" up -d --build
Creating network "examples_elastic" with the default driver
Creating examples_elasticsearch_1 ... done
Creating examples_kibana_1        ... done

3-4') サービスの起動確認

ブラウザーで localhost:5601 を開くと、以下の画面が現れました。

画像4

※ 手元の PC では、この画面が出るまでに 1 分以上掛かりました。

"Try our sample data" から "Sample web logs" を選択して、Elasticsearch にダミーデータをアップロードしました。
すると以下の画面(Dashboard)が表示されるようになりました。

画像5

3-5) サービス再起動

ダミーデータがストレージにしっかり記録されていることを確認するために、docker-compose.yml ファイルを右クリックして、"Compose Restart" を実行しました。

再びブラウザーで localhost:5601 を開くと、再起動前に収集されていたダミーデータ "Web Traffic" がリストアップされていました。

画像6

これで Elasticsearch/Kibana とも無事起動を確認できました。

3-6) あと片付け

VS Code の Explorer View で docker-compose.yml ファイルを右クリックして、"Compose Down" を実行しました。

(base) PS C:\Users\abech\Downloads\examples> cd "c:\Users\abech\Downloads\examples"
(base) PS C:\Users\abech\Downloads\examples> docker-compose -f "docker-compose.yml" down
Stopping examples_kibana_1        ... done
Stopping examples_elasticsearch_1 ... done
Removing examples_kibana_1        ... done
Removing examples_elasticsearch_1 ... done
Removing network examples_elastic

振り返り

反省点は↓以下のとおり。

・ kibana コンテナーから elasticsearch コンテナーへの参照の仕方で少し躓いた
  → links 指定だけで Elasticsearch サービスが検知できているメカニズムは不明
・ 覚えたこと/細かい知識
  ・ Elasticsearch のデータ蓄積場所は /usr/share/elasticsearch/data/
  ・ single-node の Elasticsearch はポート 9200 だけ開けておけば機能する
    → ポート 9300 の使い道はクラスターノード間の通信用らしい
  ・ Elasticsearch の本番利用時は、vm.max_map_count などのチューニングが不可欠
  ・ Elasticsearch には数えきれないほどの機能がある模様
  ・ kibana コンテナーの環境変数で Elasticsearch サービスの外部アドレスを指定する場合は、services.kibana.environment.ELASTICSEARCH_HOSTS を "examples_elasticsearch_1:9200" とする

完成した設定ファイルは↓こちらにアップしました。
https://gist.github.com/abechanta/f7cd5f2c9dbc0745d6940618d0467135


この記事が気に入ったらサポートをしてみませんか?