ElasticsearchとKibanaの設定方法(docker compose版): プラグイン導入と日本語化

# 要旨

以下の記事の内容を、ElasticSearch 8.17.0のDocker compose版に同梱されているkibanaコンテナに対して実行した。ほぼそのままの内容で流用できた（感謝）
https://qiita.com/TakumiIwata/items/e1c8c4da1d1691dd833a

## Elasticsearchにプラグインを導入する方法

### プラグイン導入の基本

Elasticsearchにプラグインを導入する際は、クラスター内のすべてのノードに同じプラグインを適用する必要がある
`docker-compose.yml`の中で、es01,es02,es03のそれぞれの定義の中に、`command`セクションを追記して自動インストールを設定する。

### commandセクション追記例（es02,es03にも同様に追記）
elasticsearch8.17.0の事例。

```yaml
  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
      - xpack.ml.use_auto_machine_memory_percent=true
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    command: >
      bash -c '
      if ! bin/elasticsearch-plugin list | grep -q "analysis-kuromoji"; then
        bin/elasticsearch-plugin install analysis-kuromoji;
      fi;
      exec /usr/local/bin/docker-entrypoint.sh
      '
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120
```

- `bin/elasticsearch-plugin install`コマンドでプラグインをインストールする
- プラグインによっては`--batch`オプションを追加してインタラクティブ入力をスキップする必要があるかもしれない

### 注意点

- プラグインのインストール後、Elasticsearchの再起動が必要。`docker compose down`および`docker compose up -d`でクラスタごと再起動を行うのが手っ取り早い

## Kibanaの日本語化

### 日本語化の手順

Kibanaの日本語化は、`kibana.yml`に以下の設定を追記できればよい。

```yaml
i18n.locale: "ja-JP"
```

### Docker環境での注意点

Kibanaコンテナを再起動すると、コンテナ内部の`kibana.yml`の変更はリセットされる。
`docker-compose.yml`で`volumes`セクションを使って、ホスト側の`kibana.yml`をマウントするようにしておくと設定変更を永続化できる。

### 設定例

#### 1. デフォルトの`kibana.yml`を取得

いったんデフォルトのdocker-compose.ymlでコンテナを起動して、以下のコマンドで、Kibanaコンテナのデフォルトの`kibana.yml`をローカルホスト側に取得する。

```bash
docker exec -it <kibana-container-name> cat /usr/share/kibana/config/kibana.yml > ./kibana.yml
```

#### 2. 設定を編集

取得した`kibana.yml`に日本語化設定を追記。

```yaml
i18n.locale: "ja-JP"
```
追記後のイメージ

```
#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

i18n.locale: "ja-JP"
```

#### 3. `docker-compose.yml`のvolumesセクションにマウント設定を追記

以下のように設定。

```yaml
kibana:
  image: docker.elastic.co/kibana/kibana:8.17.0
  volumes:
    - /任意の配置先パス/kibana.yml:/usr/share/kibana/config/kibana.yml:ro
  ports:
    - "5601:5601"
```

- `/任意の配置先パス/kibana.yml`はホスト側に保存したパス。docker-compose.ymlの配置先ディレクトリなどでよいのでは。
- `:ro`オプションを指定して、コンテナ内での誤変更を防ぐ

#### 4. コンテナを再起動

```bash
docker-compose down
docker-compose up -d
```

### 動作確認

KibanaのWeb UI（ http://localhost:5601 ）を開き、インターフェースが日本語化されていることを確認する

## まとめ

docker-compose.ymlに以下の要素を追記することでプラグイン導入・kibanaの日本語化を達成できる。

1. Elasticsearchのプラグインは全ノードにインストールする必要あり
1. Kibanaの日本語化設定は`kibana.yml`をホスト側で管理し、docker-compose.ymlの`volumes`セクションでこれをマウントするように定義。