これは、なにをしたくて書いたもの?
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のようです。
ちなみに、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も)ブログエントリーの都合上、年末によく使うのですが、あらためてインストールしたりすると手順や設定が
変わっていたりするので時々ちゃんと確認しないとですね。