Elastic App SearchをDockerで動かす
概要
6月26日にElastic Stack 7.2.0がリリースされました。
この記事の中で、「Elastic App Search セルフマネージド版をリリース: 今後はElastic Stackとしてリリース」という気になる文言がありました。
オンプレミス版のElastic App Seachはこれまでベータ版の扱いで、ベータ版の間は無償で使えるよということでしたが、 7.2のリリースが出ると同時に、「しかも無料でご利用いただけます。」とアナウンスがあり、無料で使えるようになりました。
しかし、環境構築に時間をかけたくない、機能の確認・検証にはなるべく時間をかけたくない、 何なら何度でも使い捨てできる環境を用意したいというのが人の情け。そんなときにDockerを使いたくなりますね。
そこで、今回はApp SearchをDockerで動かすときにやった手順を紹介します。
App Searchとは
ElasticsearchとKibanaを使うと、CPU使用率のメトリクス分析などはすぐにできますが、全文検索エンジンとして使おうと思うと、UIが心もとないです。
検索キーワードを入れるテキストボックスと、検索結果を表示する領域、絞り込みを表示するような領域を用意するだけでも大変です。
そんなあなたにApp Search。
検索のUXの部分をうまい具合に補ってくれるシロモノです。 それがElasticライセンスのBasicで使えるというのですから、試さない手はありませんね。
入手元
Elastic App Searchはここからダウンロードすることができます。
Download Elastic App Search | Elastic
現時点では、MacOSとLinuxのみとなっており、Windows用のバイナリは用意されていません。

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.」と出るまで待ちましょう。

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

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

言語では日本語(Japanese)も選択可能ですので、日本語での検索を確認したい方はこちらを選択してから始めると良いかもしれません。
On Boarding 2
初回、ここで投入できるデータを持っていればデータを登録できます。
jsonファイルをアップするか、jsonを貼り付ける内容がサポートされています。

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

jsonのキー項目は小文字でお願いします、と。
Dashboard
テストデータで登録すると2つのドキュメントが登録され、ダッシュボードの画面に遷移します。

終わりに
検索のUI/UXを自分で用意するのはつらい、そんな方はぜひ試してみると良いと思います。 Reactを知っていれば、カスタマイズの幅も広がり自由自在なUIが作れそうです。
Elastic StackをBasicライセンスのレベルでしか使っていない方でも、十分に恩恵に預かれるシロモノです。 Let's download now!