Elastic App SearchをDockerで動かす

概要

6月26日にElastic Stack 7.2.0がリリースされました。

www.elastic.co

この記事の中で、「Elastic App Search セルフマネージド版をリリース: 今後はElastic Stackとしてリリース」という気になる文言がありました。

オンプレミス版のElastic App Seachはこれまでベータ版の扱いで、ベータ版の間は無償で使えるよということでしたが、 7.2のリリースが出ると同時に、「しかも無料でご利用いただけます。」とアナウンスがあり、無料で使えるようになりました。

しかし、環境構築に時間をかけたくない、機能の確認・検証にはなるべく時間をかけたくない、 何なら何度でも使い捨てできる環境を用意したいというのが人の情け。そんなときにDockerを使いたくなりますね。

そこで、今回はApp SearchをDockerで動かすときにやった手順を紹介します。

App Searchとは

www.elastic.co

ElasticsearchとKibanaを使うと、CPU使用率のメトリクス分析などはすぐにできますが、全文検索エンジンとして使おうと思うと、UIが心もとないです。

検索キーワードを入れるテキストボックスと、検索結果を表示する領域、絞り込みを表示するような領域を用意するだけでも大変です。
そんなあなたにApp Search。

検索のUXの部分をうまい具合に補ってくれるシロモノです。 それがElasticライセンスのBasicで使えるというのですから、試さない手はありませんね。

入手元

Elastic App Searchはここからダウンロードすることができます。

Download Elastic App Search | Elastic

現時点では、MacOSLinuxのみとなっており、Windows用のバイナリは用意されていません。

f:id:tsgkdt:20190710170538p:plain

Docker化しよう

検証環境や開発環境で既にDockerやk8sでElasticまわりを用意されている方も多いと思います。

ここから本題ですが、App SearchはDockerイメージが提供されていないようなので、自作してみましたよっと。

Dockerfile

まずはDockerfileを用意してローカルでイメージをビルドしましょう。

FROM openjdk:11-jdk

ENV APP_SEARCH_VERSION=7.2.0
ENV APP_SEARCH_FILE=app-search-${APP_SEARCH_VERSION}.tar.gz
ENV APP_SEARCH_DIR=/usr/share/app-search
ENV APP_SEARCH_USER=appsearch

RUN curl -s -O https://appsearch.elastic.co/downloads/appsearch/${APP_SEARCH_FILE} && \
    tar xvf ${APP_SEARCH_FILE} && \
    mv app-search-${APP_SEARCH_VERSION} ${APP_SEARCH_DIR} &&\
    useradd ${APP_SEARCH_USER} && \
    chmod +x ${APP_SEARCH_DIR}/bin/app-search && \
    chown -R ${APP_SEARCH_USER} ${APP_SEARCH_DIR}/ 

USER ${APP_SEARCH_USER}
WORKDIR ${APP_SEARCH_DIR}

EXPOSE 3002

CMD ["bin/app-search"]

app-search.ymlの準備

ここがDocker化するときの肝です。 いくつかポイントがあるので順に書いていきます。

標準のapp-search.ymlを取り出して下記を変更した上、保存しておきましょう。 コンテナ起動時に外から渡すときに使います。

elasticsearch.host

elasticsearch.host: http://elasticsearch:9200

デフォルトではコメントアウトされていますが、Elasticsearchが動いている場所を指定します。
未指定時はlocalhostになるので、コンテナで動かした場合、Elasticsearchへの通信が確立できずにApp Searchは起動に失敗します。

app_search.external_url

# * An IP: http://255.255.255.255
# * A FQDN: http://example.com
# * Shortname defined via /etc/hosts: http://app-search.search 
app_search.external_url: http://*****.eastasia.cloudapp.azure.com

app_search.external_urlは、外からアクセスするときに使うIPアドレスFQDNを指定します。

画面遷移が発生するときなど、このURLがもとにされます。

ポートのマッピングで3002:3002としてコンテナの外に晒しているのであれば、

app_search.external_url: http://*****.eastasia.cloudapp.azure.com:3002

のようにしてください。

listen_host , listen_port

App Searchは内部でjettyを使っています。そこでjettyが待ち受けするホストとポートを指定しておきましょう。

hostを0.0.0.0としているのは、コンテナの外から接続したいためです。

app_search.listen_host: 0.0.0.0 app_search.listen_port: 3002

lister_portはDockerfileでexposeで書いた3002と合わせておきます。

その他

マニュアルに記載されている内容として以下を追加

  • allow_es_settings_modification: true

今回はelasticsearchはsslで繋がない環境なのでfalseに設定

  • elasticsearch.ssl.enabled: false

注意点

app-search.ymlの中を見ておりますと、 app_searchという文字列があり、「-」なのか「_」で指定すべきなのか間違いやすいです。 うっかりミスにご注意を。

docker-compose.yml

確認用のdocker-composeファイルを用意します。

app-searchの3002番を80番にマッピングすること、app-search.ymlを外から渡しているところを見てください。

version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  app-search:
     image: app-search:latest
     container_name: app-search
     environment:
       - ALLOW_ES_SETTINGS_MODIFICATION=true
     ports:
       - 80:3002
     volumes:
       - ./app-search.yml:/usr/share/app-search/config/app-search.yml
     depends_on:
       - elasticsearch
     links:
       - elasticsearch:elasticsearch
     networks:
       - esnet

volumes:
  esdata:
    driver: local

networks:
  esnet:

起動確認

起動ログ

起動には時間がかかりますが、「Success! Elastic App Search is starting successfully.」と出るまで待ちましょう。

f:id:tsgkdt:20190710173132p:plain

Welcome

ログで起動が確認できたら、app_search.external_urlに書いたアドレスを入力して、画面にアクセスできることを確認します。

f:id:tsgkdt:20190710172903p:plain

On Boarding 1

Engine名、言語を指定して、最初のApp SearchのEngineを作成する画面が表示されます。

f:id:tsgkdt:20190710173416p:plain

言語では日本語(Japanese)も選択可能ですので、日本語での検索を確認したい方はこちらを選択してから始めると良いかもしれません。

On Boarding 2

初回、ここで投入できるデータを持っていればデータを登録できます。

jsonファイルをアップするか、jsonを貼り付ける内容がサポートされています。

f:id:tsgkdt:20190710173737p:plain

jsonを貼り付けを選択すると、テストデータがプリセットされています。そのまま次に進むとテストデータで作成が完了しますが、 自身でデータを貼り付けて、エラーが含まれているとこんな画面で教えてくれます。

f:id:tsgkdt:20190710174105p:plain

jsonのキー項目は小文字でお願いします、と。

Dashboard

テストデータで登録すると2つのドキュメントが登録され、ダッシュボードの画面に遷移します。

f:id:tsgkdt:20190710174300p:plain

終わりに

検索のUI/UXを自分で用意するのはつらい、そんな方はぜひ試してみると良いと思います。 Reactを知っていれば、カスタマイズの幅も広がり自由自在なUIが作れそうです。

Elastic StackをBasicライセンスのレベルでしか使っていない方でも、十分に恩恵に預かれるシロモノです。 Let's download now!