この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
現在、自分はProfllyというプロフィールビューアーサービスの開発を行っています。
Profllyでは、サービス内の検索エンジンとしてAmazon OpenSearch Service(旧Amazon Elasticsearch Service)を採用しています。
システムを構築するにあたっては、マネージドサービスであるOpenSearch Serviceを利用していますが、開発環境ではコストを抑えるために個人のローカル環境に構築したOpenSearchを利用したい、というニーズがありました。
上記ニーズを満たすため、Dockerを利用しつつローカル環境にOpenSearchを構築してみたので、その手順をご紹介します。
OpenSearchについて
OpenSearchは、Apache2.0ライセンス(ALv2)のElasticsearch7.10.2およびKibana7.10.2から派生したコミュニティ主導の分散型オープンソース検索および分析スイートです。
検索エンジンデーモンのOpenSearchと、統合された視覚化ツールであるOpenSearch Dashboardsで構成されています。
他、OpenSearchの詳細については以下が参考になります。
検証環境
- OpenSearch
1.0.1
- OpenSearch Dashboards
1.0.1
- Docker
20.10.8
- Docker Compose
1.29.2
OpenSearch + OpenSearch DashboardsをDockerを使って構築する
今回は、ローカル環境においてDockerを利用しつつOpenSearch + OpenSearch Dashboardsを構築してみます。
以下のドキュメントを参考にしながら、OpenSearchをDockerで起動するためのComposeファイルを定義していきます。
docker-compose.yml
version: '3'
services:
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:1.0.1
container_name: opensearch-dashboards
environment:
OPENSEARCH_HOSTS: "https://opensearch:9200"
ports:
- 5601:5601
links:
- opensearch
networks:
- sandbox
opensearch:
build:
context: .
dockerfile: Dockerfile
container_name: opensearch
environment:
- cluster.name=docker-cluster
- node.name=os-node
- cluster.initial_master_nodes=os-node
- bootstrap.memory_lock=true
- http.host=0.0.0.0
- transport.host=127.0.0.1
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- $PWD/.local/opensearch:/usr/share/opensearch/data
ports:
- 9200:9200
networks:
- sandbox
networks:
sandbox:
Dockerfile
FROM opensearchproject/opensearch:1.0.1
RUN /usr/share/opensearch/bin/opensearch-plugin install https://artifacts.opensearch.org/releases/plugins/analysis-kuromoji/1.0.0/analysis-kuromoji-1.0.0.zip
RUN /usr/share/opensearch/bin/opensearch-plugin install https://artifacts.opensearch.org/releases/plugins/analysis-icu/1.0.0/analysis-icu-1.0.0.zip
Dockerfile
では、今回のシステムで必要となる2つのプラグインをインストールしています。
analysis-kuromoji
analysis-icu
但し、OpenSearch 1.0.1
の時点では、プラグイン名を指定してインストールを実行するとインストールに失敗する問題があるため、ワークアラウンドとして直接プラグインのzip URLを指定する形にしています。
(この問題は、今後リリースが予定されているOpenSearch 1.1
にて解消される予定とのこと)
【2021/10/11 追記】
2021/10/5にリリースされたv1.1.0では、上記のような問題は解消されていました。v1.1.0以降であれば、プラグインは以下のような記述でインストールできるかと思います。
Dockerfile
FROM opensearchproject/opensearch:1.1.0
RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-kuromoji
RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-icu
Composeファイルが準備できたので、コンテナを起動してみます。
$ docker-compose up -d
ローカルで構築したOpenSearchにアクセスしてみる
コンテナが起動できたら、ドキュメントを参考にcurlを叩いてローカルのOpenSearchにアクセスしてみます。
$ curl -XGET https://localhost:9200 -u 'admin:admin' --insecure
{
"name" : "os-node",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "5wu-pBlIQb-64niPP_zY0A",
"version" : {
"distribution" : "opensearch",
"number" : "1.0.0",
"build_type" : "tar",
"build_hash" : "34550c5b17124ddc59458ef774f6b43a086522e3",
"build_date" : "2021-07-02T23:22:21.383695Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "The OpenSearch Project: https://opensearch.org/"
}
無事にOpenSearchが立ち上がっていますね。
次に、OpenSearch Dashboards(Elasticsearchで言うところのKibana)にアクセスしてみます。
http://localhost:5601/
デフォルトではセキュリティプラグインが有効化されているので、ログイン画面が表示されます。
初期IDとパスワードはいずれもadmin
となります。
(なお、OpenSearchおよびDashboardsのセキュリティプラグインを無効化したい場合は、こちらのドキュメントを参考にして設定を変更してみてください)
続いて、テナント選択の画面が表示されるのでひとまずキャンセルします。
無事にOpenSearch Dashboardsのホーム画面が表示されました。
せっかくなので、デフォルトで用意されているサンプルデータを投入してみます。 「Add sample data」をクリックします。
今回は、Sample web logs
を使ってみます。「Add data」をクリックするとデータ投入が開始されるので、しばらく待ちます。
データ投入が完了したら、以下からDev Toolsにアクセスしてみます。
http://localhost:5601/app/dev_tools#/console
以下のようなコマンドを叩いて、先程突っ込んだサンプルデータの件数を確認してみます。
GET opensearch_dashboards_sample_data_logs/_count
{
"count" : 14074,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
サンプルデータが存在することを確認できました。
おわりに
Dockerを利用してローカル環境にてOpenSearchを構築してみました。
システムでAmazon OpenSearch Serviceを利用している場合、開発環境ではローカル環境に構築したOpenSearchを利用することで、コストの抑制や柔軟な検証が実現できるのではないかと思います。
どなたかの参考になれば幸いです。