OpenSearchをローカル環境でDockerを利用して構築する

Amazon OpenSearch Serviceで採用されているOpenSearchをローカル環境で構築する手順です
2021.09.27

現在、自分は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を利用することで、コストの抑制や柔軟な検証が実現できるのではないかと思います。

どなたかの参考になれば幸いです。