work.log

エンジニアの備忘録的ブログ

Rocky Linux 9でElasticsearch 8.5を使うメモ書き

投稿:2022-12-16 22:29  更新:

このページはRocky Linux 9にElasticsearch 8.5をインストールして、最低限使えるようになるまでの手順を書いたメモ書きです。

Elasticsearchを使うようになって暫く経ちましたが、CentOS 7からRocky Linux 9に移行するタイミングで色々と躓いたのでしっかり残しておきます。

変更前、変更後の環境は下記で、CentOS上で作ったアプリもそのままじゃ移せなくて参りました😇

ソフトウェア 変更前 変更後
OS CentOS 7 Rocky Linux 9
Elasticsearch 7.16.2 8.5.2
Python 3.9.9 3.11.0
ElasticsearchPython 7.16.0 8.5.3

スポンサーリンク

Elasticsearch 8.5のインストール

まずはdnfでElasticsearchをセットアップ出来るように設定していきます。

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/elasticsearch.repo
-----
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

Elasticsearchはバージョンが変わると、利用しているプラグイン等のアップデート作業も発生するので、dnf updateで一緒にアップデートされないようにenabledは0のままにしておきます。

終わったらElasticsearch公式のリポジトリを指定してインストール。

インストールされると “Security autoconfiguration information” というメッセージが表示されますが、初期設定に必要なのでメモしておきましょう。

# dnf -y install --enablerepo=elasticsearch elasticsearch kibana
.
. ~ 省略 ~
.
--------------------------- 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 : XAYN5-Df3WAk0Jps+w_O

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

デフォルトで elastic という管理者アカウントが作成されそのパスワードが表示されます。

メモをする前にうっかりログを流してしまった場合は、下記コマンドでパスワードの再発行を行えばOKです。

# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y <= yで応答

Password for the [elastic] user successfully reset.
New value: nIt*3IUtYgsouSFisR3V <= 新しいパスワード

Elasticsearchのプラグインをインストール

Elasticsearchで日本語をインデックスするのに役立つプラグインをインストールします。

# /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
# /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

リストに出てくればプラグインのインストールは完了です。

# /usr/share/elasticsearch/bin/elasticsearch-plugin list
analysis-icu
analysis-kuromoji

Elasticsearchのメモリ設定を変更

サーバの搭載メモリが少ない場合は、起動前にメモリの設定を変えておきます。

# vi /etc/elasticsearch/jvm.options
-----
################################################################
## IMPORTANT: JVM heap size
################################################################
##
## The heap size is automatically configured by Elasticsearch
## based on the available memory in your system and the roles
## each node is configured to fulfill. If specifying heap is
## required, it should be done through a file in jvm.options.d,
## which should be named with .options suffix, and the min and
## max should be set to the same value. For example, to set the
## heap to 4 GB, create a new file in the jvm.options.d
## directory containing these lines:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/8.5/heap-size.html
## for more information
##
################################################################
-Xms2g <= 2GBに設定
-Xmx2g <= 2GBに設定

ElasticsearchとKibanaの起動

次にElasticsearchとKibanaを起動します。

Kibanaは無くてもElasticsearchは使えますが、GUIから操作出来ると何かと楽なので起動しておきます。起動はElasticsearch → Kibanaの順で。

# systemctl daemon-reload
# systemctl start elasticsearch
# systemctl start kibana
# systemctl enable elasticsearch kibana

curlコマンドを使ってElasticsearchに接続してみます。http_ca.crtへのアクセス権限が無いユーザーアカウントからやる場合は、sudoコマンドも併用しましょう。

管理者パスワードはインストール時に表示されたものを入力します。

# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200
Enter host password for user 'elastic': <= 管理者パスワードを入力

このような応答が返ってきたらOKです。

{
  "name" : "hostname",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "4D7XdjG3QBmD3m6Y4H3Khg",
  "version" : {
    "number" : "8.5.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "kCR0WzFWqQtlJdea8rmol7404ccbed7d3ba9584e",
    "build_date" : "2022-12-05T18:22:22.226119656Z",
    "build_snapshot" : false,
    "lucene_version" : "9.4.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Kibanaの初期設定

続いてKibanaのセットアップを行います。

Nginxを経由してKibanaへ接続する設定を追加

Kibanaは5601ポートでListenしているのでブラウザで直接繋いでも良いですが、Kibanaは運用後もちょくちょく利用するので、Let’s EncryptのSSL証明書を取得し、Nginxでこのように設定し使います。

これならファイヤーウォールに追加で穴を開ける必要も無いので楽かなと思います。

server {
	listen      80;
	server_name kibana.example.com;
	return 301 https://$host$request_uri;
}

server {
	listen      443 ssl http2;
	server_name kibana.example.com;

	access_log /home/kibana.example.com/log/nginx-access.log combined;
	error_log  /home/kibana.example.com/log/nginx-error.log warn;

	ssl_certificate     /etc/letsencrypt/live/kibana.example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem;

	location / {
	        proxy_pass http://127.0.0.1:5601;
	}
}

ブラウザからKibanaの初期設定

Step1: Enrollment tokenの設定

ブラウザからKibanaへ接続するとこのようなページが表示されます。

Enrollment token” が必要なので下記コマンドで取得します。

# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjUuMiIsImFkciI6WyIxNTcuNy4yMDAuMjQ4OjkyMDAiXSwiZmdyIjoiMjJmZGQ5NDIzODQ2M2M5Yzk2MjZhZTQxNjgzN2RlNTlmOWNjNTg3YTk5MWJlMDI2NjAxMDkwZmNhMWQ2YzhhNCIsImtleSI6IkhHb1k4b1FCMm9hQ3pEMVpic1BKOnVHT3YxbHFRUWpLdkFBcE5jUm5QdEEifQ==

Step2: コンフィグの自動作成

Verification required” というフォームがポップアップされるので、下記コマンドで認証コードを取得しフォームに入力します。

# /usr/share/kibana/bin/kibana-verification-code
Your verification code is:  031 258

認証後は自動でKibana用の設定が設定ファイルに書き込まれ、終わるとログイン画面が表示されます。

設定ファイルは下記場所にあり、自動で設定される内容は末尾に追記されます。もしここでエラーが出る場合は書き込み権限絡みだと思うので、ログを確認しながら対処しましょう。

/etc/kibana/kibana.yml

無事初期設定が終わると、”Welcome to Elastic” という表示と共に、ユーザー名とパスワードを求められるのでユーザー名に “elastic”、パスワードは管理者パスワードでログインします。

これでKibanaの初期設定は完了です。お疲れ様でした。

Basic認証をかけているとエラーが出るので注意

エラーメッセージ
We hit an authentication error. Please check your credentials and try again. If you still can’t log in, contact your system administrator.

NginxのBasic認証でKibanaへのアクセスを制限しようとしたら、上記のようなエラーメッセージが表示されてログイン出来なくなりましたので合わせてメモを残しておきます。

ログを確認したらBasic認証で設定したユーザー名をKibanaに伝えようとして認証に失敗しているようでしたので、手っ取り早くBasic認証はかけずに運用するように誤魔化しました😇

Python Elasticsearchクライアントの変更点

バージョンアップによりPython Elasticsearchクライアントも使い方が少し変わりました。

Elasticsearch 7.16の時は外部から直接アクセスしないからという理由で、X-Packのセキュリティ機能は利用していませんでしたが、8.5はデフォルトでX-Packが有効になるのでこの機会にちゃんと運用する事にしました。

例えばmyindexというインデックスに接続する場合はこのようにPythonのElasticsearchクライアントを変更します。

7.16の場合

from elasticsearch import Elasticsearch

es = Elasticsearch()

query = {
	"query": {
		"match_all": {}
	}
}

res = es.search(index='myindex', body=query)

8.5の場合

from c import Elasticsearch

es = Elasticsearch(
	hosts=['https://localhost:9200'],
	basic_auth=('elastic', 'nIt*3IUtYgdouSFisR6V'),
	verify_certs=True,
	ssl_assert_fingerprint='22:FD:D9:42:38:46:3C:9C:96:26:AE:41:68:37:DE:59:F9:CC:58:7A:99:1B:E0:26:60:10:90:FC:A1:D6:C8:A4',
	request_timeout=10,
	http_compress=True
)

query = {
        "match_all": {}
}

res = es.search(index='myindex', query=query)

変更した部分は大きく下記になります。

  • ElasticsearchにはHTTPSで接続
  • 認証あり

接続時のセキュリティを気にしないであれば、このようにしてX-Packを無効化するとOKです。

# vi /etc/elasticsearch/elasticsearch.yml
-----
xpack.security.enabled: false

ローカル、LAN内で使う前提なら平文で問題ないですけど、変更後はKibana側の設定も調整が必要です。

また、PythonのElasticsearchクライアントの情報をネットで調べると、”http_auth(‘elastic’, ‘password’)” の記述が出てきますが、http_authは非推奨となり利用すると下記メッセージが表示されるようになりましたので注意しましょう。

/home/fern/work/py311/test.py:5: DeprecationWarning: The 'http_auth' parameter is deprecated. Use 'basic_auth' or 'bearer_auth' parameters instead

また証明書の指定はca_certsかssl_assert_fingerprintのオプションが利用出来ます。Elasticsearchの証明書は他のユーザーからだと参照出来ないので、プログラム内からだとフィンガープリントを使うのが簡単だと思います。

ca_certsを利用する場合は証明書の場所を指定、ssl_assert_fingerprintを利用する場合は下記コマンドでフィンガープリントを取得します。

# openssl x509 -fingerprint -sha256 -noout -in /etc/elasticsearch/certs/http_ca.crt 
sha256 Fingerprint=22:FD:D9:42:38:46:3C:9C:96:26:AE:41:68:37:DE:59:F9:CC:58:7A:99:1B:E0:26:60:10:90:FC:A1:D6:C8:A4

最低限知っておきたい変更点としては以上かと思います。

CentOS7からのリプレイスでElasticsearchのアップデートも一緒にと思ったら、変更点が多くて運用中しているアプリの改修が大変そうです😑

以上、Elasticsearch 8.5のメモでした。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間