CLOVER🍀

That was when it all began.

Ubuntu Linux 22.04 LTSにElasticsearch 8をシングルノード、非HTTPSでインストールする

これは、なにをしたくて書いたもの?

Elasticsearch 8を、シングルノードで簡単に使えるようにセットアップしたいなということで。
以前、少しやってちょっとハマったので、今回はちゃんと見てまとめておくことにしました。

やりたいことは、以下の条件のElasticsearchをセットアップすることです。

  • シングルノード
  • 外部から接続可能
  • HTTPでアクセス可能

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Elasticsearch 8をインストールする

インストール先がUbuntu Linux 22.04 LTSですが、Elasticsearch 8.3以降のサポート対象になっています。

Support Matrix / PRODUCT AND OPERATING SYSTEM

こちらの手順を見ながらインストール。

Install Elasticsearch with Debian Package | Elasticsearch Guide [8.11] | Elastic

aptリポジトリーの設定。

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
$ sudo apt-get install apt-transport-https
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
$ sudo apt update

Elasticsearchをインストール。

$ sudo apt install elasticsearch

インストールの完了時には、以下のようにセキュリティに関する情報やsystemdの手順などが出力されます。

--------------------------- Security autoconfiguration information ------------------------------

Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

The generated password for the elastic built-in superuser is : [パスワード]

If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.

You can complete the following actions at any time:

Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.

Generate an enrollment token for Kibana instances with
 '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.

Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.

-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

このあたりの情報ですね。

Install Elasticsearch with Debian Package / Start Elasticsearch with security enabled

systemdによる自動起動設定。

$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service

Elasticsearchを起動。

$ sudo systemctl start elasticsearch.service

systemd上での確認。

$ sudo systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
     Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-12-30 16:55:12 JST; 22s ago
       Docs: https://www.elastic.co
   Main PID: 1846 (java)
      Tasks: 91 (limit: 2220)
     Memory: 1.4G
        CPU: 44.283s
     CGroup: /system.slice/elasticsearch.service
             ├─1846 /usr/share/elasticsearch/jdk/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/elasticsearch/bin/elasticsearch -Dcli.libs=lib/tools/>
             ├─1904 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -Djava.security.manager=allow -XX:+AlwaysPreTouch -X>
             └─1925 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

12月 30 16:54:50 ubuntu2204.localdomain systemd[1]: Starting Elasticsearch...
12月 30 16:54:53 ubuntu2204.localdomain systemd-entrypoint[1846]: 12 30, 2023 4:54:53 午後 sun.util.locale.provider.LocaleProviderAdapter <clinit>
12月 30 16:54:53 ubuntu2204.localdomain systemd-entrypoint[1846]: WARNING: COMPAT locale provider will be removed in a future release
12月 30 16:55:12 ubuntu2204.localdomain systemd[1]: Started Elasticsearch.

アクセスしてみましょう。

パスワードは、インストール時に表示されたものを以下のように変数に設定しておいて

$ ELASTIC_PASSROD=[インストール時に出力されたパスワード]

curlでアクセス。自己署名証明書なので、いったん無視する方向で。

$ curl -k -u elastic:$ELASTIC_PASSROD https://localhost:9200
{
  "name" : "ubuntu2204.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Yv_JZjs6T9yzB4gM_zJuVg",
  "version" : {
    "number" : "8.11.3",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "64cf052f3b56b1fd4449f5454cb88aca7e739d9a",
    "build_date" : "2023-12-08T11:33:53.634979452Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

OKですね。今回インストールされたのはElasticsearch 8.11.3です。

Elasticsearchの証明書を使う場合は、/etc/elasticsearchディレクトリ内にあるので管理者権限がないとアクセスできません…。

$ sudo curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:$ELASTIC_PASSROD https://localhost:9200
{
  "name" : "ubuntu2204.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Yv_JZjs6T9yzB4gM_zJuVg",
  "version" : {
    "number" : "8.11.3",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "64cf052f3b56b1fd4449f5454cb88aca7e739d9a",
    "build_date" : "2023-12-08T11:33:53.634979452Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

まずはインストールが完了しました。

シングルノードに設定する

Elasticsearchをシングルノードで起動するように設定します。

/etc/elasticsearch/elasticsearch.ymlを修正していくことになりますね。設定するのはdiscovery.typeです。

Discovery and cluster formation settings | Elasticsearch Guide [8.11] | Elastic

/etc/elasticsearch/elasticsearch.ymlの以下の部分に

# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.seed_hosts: ["host1", "host2"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
#cluster.initial_master_nodes: ["node-1", "node-2"]
#
# For more information, consult the discovery and cluster formation module documentation.
#

こちらを追記。

discovery.type: "single-node"

discovery.typeに"single-node"を設定した状態で、cluster.initial_master_nodesを設定しているとElasticsearchが起動に失敗するように
なります。

java.lang.IllegalArgumentException: setting [cluster.initial_master_nodes] is not allowed when [discovery.type] is set to [single-node]

先に記載したdiscoveryの設定ではコメントアウトされているのですが、debパッケージでインストールするとelasticsearch.ymlの
最後の方に以下の設定があるので

# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
cluster.initial_master_nodes: ["ubuntu2204.localdomain"]

こちらをコメントアウト。

# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
#cluster.initial_master_nodes: ["ubuntu2204.localdomain"]

Elasticsearchを再起動すると反映されます。

$ sudo systemctl restart elasticsearch.service

外部から接続可能に設定する

これは、今回に関しては特に設定変更の必要がありませんでした。http.hostが以下の設定だったので。

# Allow HTTP API connections from anywhere
# Connections are encrypted and require user authentication
http.host: 0.0.0.0

Networkingedit / Advanced HTTP settings

0.0.0.0でHTTPリクエストを受け付けるようになっています。

$ ss -tnl | grep 9200
LISTEN 0      4096         0.0.0.0:9200      0.0.0.0:*

セキュリティ設定を無効にする

推奨されるものではないですが、HTTPSや認証などのセキュリティ設定を無効にします。

Security settings in Elasticsearch / General security settings

以下の箇所に書かれている

#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 30-12-2023 07:52:00
#
# --------------------------------------------------------------------------------

# Enable security features
xpack.security.enabled: true

xpack.security.enabledをfalseに設定。

# Enable security features
xpack.security.enabled: false

Elasticsearchを再起動。

$ sudo systemctl restart elasticsearch.service

これで、HTTPでアクセスできるようになります。

$ curl localhost:9200
{
  "name" : "ubuntu2204.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Yv_JZjs6T9yzB4gM_zJuVg",
  "version" : {
    "number" : "8.11.3",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "64cf052f3b56b1fd4449f5454cb88aca7e739d9a",
    "build_date" : "2023-12-08T11:33:53.634979452Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

認証だけは残したい気もしますが、できるのでしょうか…?

オマケ: Elasticsearchが使用するJavaを変更する

Elasticsearchは、デフォルトで自身にバンドルされているOpenJDKを使います。

Elasticsearch includes a bundled version of OpenJDK from the JDK maintainers (GPLv2+CE). To use your own version of Java, see the JVM version requirements

Install Elasticsearch with Debian Package | Elasticsearch Guide [8.11] | Elastic

systemctl statusの時にも/usr/share/elasticsearch/jdk/bin/javaが使われていることが表示されていました。

$ sudo systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
     Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-12-30 16:55:12 JST; 22s ago
       Docs: https://www.elastic.co
   Main PID: 1846 (java)
      Tasks: 91 (limit: 2220)
     Memory: 1.4G
        CPU: 44.283s
     CGroup: /system.slice/elasticsearch.service
             ├─1846 /usr/share/elasticsearch/jdk/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/elasticsearch/bin/elasticsearch -Dcli.libs=lib/tools/>
             ├─1904 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -Djava.security.manager=allow -XX:+AlwaysPreTouch -X>
             └─1925 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

12月 30 16:54:50 ubuntu2204.localdomain systemd[1]: Starting Elasticsearch...
12月 30 16:54:53 ubuntu2204.localdomain systemd-entrypoint[1846]: 12 30, 2023 4:54:53 午後 sun.util.locale.provider.LocaleProviderAdapter <clinit>
12月 30 16:54:53 ubuntu2204.localdomain systemd-entrypoint[1846]: WARNING: COMPAT locale provider will be removed in a future release
12月 30 16:55:12 ubuntu2204.localdomain systemd[1]: Started Elasticsearch.

このJavaの正体は?というと。

$ /usr/share/elasticsearch/jdk/bin/java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-29)
OpenJDK 64-Bit Server VM (build 21.0.1+12-29, mixed mode, sharing)

使用しているのはOracle OpenJDKのようです。

OpenJDK

ちなみに、ElasticsearchとしてはバンドルしているJavaを使用することが推奨されているようです。

Elasticsearch is built using Java, and includes a bundled version of OpenJDK from the JDK maintainers (GPLv2+CE) within each distribution. The bundled JVM is the recommended JVM.

Installing Elasticsearch / Java (JVM) Version

使用するJavaはES_JAVA_HOME環境変数で切り替えることができますが、ElasticsearchはOpenJDKの機能と密接に結合しているので
他のJavaでは動作しない可能性があるとも書かれています。切り替える場合は、サポートされている最新のLTSということで。

To use your own version of Java, set the ES_JAVA_HOME environment variable. If you must use a version of Java that is different from the bundled JVM, it is best to use the latest release of a supported LTS version of Java. Elasticsearch is closely coupled to certain OpenJDK-specific features, so it may not work correctly with other JVMs. Elasticsearch will refuse to start if a known-bad version of Java is used.

サポートされているJavaのバージョンと、Elasticの製品の組み合わせは以下で確認できます。

Support Matrix / PRODUCT AND JVM

というわけで、今回は自分で導入したJavaに切り替えてみたいと思います。

まずはOpenJDKをインストール。使用するのは、Ubuntu Linuxのパッケージに含まれるOpenJDKとします。

$ sudo apt install openjdk-21-jdk-headless

インストールされました。

$ java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-Ubuntu-222.04)
OpenJDK 64-Bit Server VM (build 21.0.1+12-Ubuntu-222.04, mixed mode, sharing)

こちらを確認して、/etc/default/elasticsearchにES_JAVA_HOME環境変数を設定します。

Install Elasticsearch with Debian Package / Configuring Elasticsearch

パスは、/usr/lib/jvm/java-21-openjdk-amd64で指定することにします。

$ ll /usr/lib/jvm
合計 16
drwxr-xr-x  3 root root 4096 12月 30 17:48 ./
drwxr-xr-x 90 root root 4096 12月 30 17:47 ../
-rw-r--r--  1 root root 1840 11月  6 23:11 .java-1.21.0-openjdk-amd64.jinfo
lrwxrwxrwx  1 root root   21 11月  6 23:11 java-1.21.0-openjdk-amd64 -> java-21-openjdk-amd64/
drwxr-xr-x  9 root root 4096 12月 30 17:48 java-21-openjdk-amd64/

/etc/default/elasticsearchにはもともとこのような記述があるので、

# Elasticsearch Java path
#ES_JAVA_HOME=

以下に変更して

# Elasticsearch Java path
ES_JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64

再起動。

$ sudo systemctl restart elasticsearch.service

これで、自分でインストールしたJavaが使われるようになりました。

$ sudo systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
     Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-12-30 17:59:39 JST; 5s ago
       Docs: https://www.elastic.co
   Main PID: 4872 (java)
      Tasks: 73 (limit: 2220)
     Memory: 1.4G
        CPU: 46.050s
     CGroup: /system.slice/elasticsearch.service
             ├─4872 /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/elasticsearch/bin/elasticsearch -Dcli.libs=lib/>
             ├─4948 /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -Djava.security.manager=allow -XX:+AlwaysPreTo>
             └─4968 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

12月 30 17:59:10 ubuntu2204.localdomain systemd[1]: Starting Elasticsearch...
12月 30 17:59:16 ubuntu2204.localdomain systemd-entrypoint[4872]: 12 30, 2023 5:59:16 午後 sun.util.locale.provider.LocaleProviderAdapter <clinit>
12月 30 17:59:16 ubuntu2204.localdomain systemd-entrypoint[4872]: WARNING: COMPAT locale provider will be removed in a future release

おわりに

Elasticsearch 8をシングルノード、セキュリティを緩めてインストールしてみました。

Elasticsearchは(Kibanaも)ブログエントリーの都合上、年末によく使うのですが、あらためてインストールしたりすると手順や設定が
変わっていたりするので時々ちゃんと確認しないとですね。