Elasticsearchへの外部接続方法について解説します。
この記事では、Elasticsearch 7.xが対象です。
本記事の内容
- Elasticsearch設定ファイルの変更
- Elasticsearch設定ファイルの反映
- ファイアウォールでポート開放
- Elasticsearchへの外部接続確認
それでは、上記に沿って解説していきます。
Elasticsearch設定ファイルの変更
Elasticsearchのバージョンによって、設定方法が異なります。
ここでは、現時点(2021年6月)における最新バージョンの設定を説明します。
系列で言うと、Elasticsearch 7系ですね。
最新バージョンとなるElasticsearch 7.13.1のインストールは、次の記事で解説しています。
Elasticsearchの設定ファイルのパスは、以下となります。
/etc/elasticsearch/elasticsearch.yml
では、Elasticsearchの設定を変更していきます。
ただ、その前にElasticsearchのデフォルト設定について説明しておきます。
デフォルトの設定では、クラスター構成を組む前提となっています。
「分散型」の検索エンジンという触れ込みがあるぐらいですからね。
そして、Elasticsearchではクラスター構成かどうかが大きなポイントになります。
この前提条件次第により、設定方法が異なってもきます。
つまり、以下の2つのパターンがあるということです。
- クラスター構成を組む前提(デフォルト)
- クラスター構成を組まない前提
それぞれを下記で説明します。
クラスター構成を組む前提(デフォルト)
node.name: node-1 network.host: xxx.xxx.xxx.xxx discovery.seed_hosts: ["node-1"]
上記をelasticsearch.ymlに追記します。
「node-1」は、ノード名です。
わかりやすいモノなら、何でも良いでしょう。
ここでのノードとは、Elasticsearchをインストールしたサーバーとなります。
「xxx.xxx.xxx.xxx」は、外部接続を許可するホストのIPアドレスです。
「0.0.0.0」とすれば、全ホストを許可することになります。
「[“node-1”]」は、クラスター構成を本格的に組む際に必要となる項目です。
クラスター構成については、ここでは主眼ではないので説明しません。
ただ、discovery.seed_hostsを設定しないと、エラーになります。
network.hostの設定とセットだと考えておいてください。
クラスター構成を組まない前提
network.host: xxx.xxx.xxx.xxx discovery.type: single-node
上記をelasticsearch.ymlに追記します。
「single-node」は、クラスター構成を組まないという設定になります。
デフォルトでは、discovery.typeは項目すら存在しません。
まとめ
クラスター構成の有無により、設定方法が異なります。
なお、個人的には外部設定は全ホストを対象にします。
network.host: 0.0.0.0
確かに、上記はリスクがあります。
しかし、そもそもファイアウォールやhosts.allowなどでホストのアクセス制御は行います。
だから、ソフトウェアの設定でホストの制限をする必要はないという考えです。
いや、むしろ逆にソフトウェアレベルにおけるホストのアクセス制限をすることには反対と言えます。
管理場所がバラバラなら、管理コストが増えるだけです。
ソフトウェアで行うセキュリティ対策は、パスワード認証で十分です。
あとは、OSレベルで行いましょうということになります。
上記は、あくまで私の考えになります。
参考にするもしないも、みなさんにお任せします。
以上、Elasticsearch設定ファイルの変更についての説明でした。
次は、Elasticsearch設定ファイルの変更を反映させていきます。
Elasticsearch設定ファイルの反映
Elasticsearch設定ファイルの変更を反映するには、Elasticsearchを再起動する必要があります。
Elasticsearchの再起動は、次のコマンドで行います。
$ sudo systemctl restart elasticsearch.service
念のため、起動状況を確認しておきます。
$ sudo systemctl status elasticsearch.service ● elasticsearch.service - Elasticsearch Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-06-09 08:06:46 JST; 1h 13min ago Docs: https://www.elastic.co Main PID: 4843 (java) Tasks: 53 (limit: 9513) Memory: 4.2G CGroup: /system.slice/elasticsearch.service ├─4843 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkadd> └─5047 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller 6月 09 08:06:38 ubuntu-focal systemd[1]: Starting Elasticsearch... 6月 09 08:06:46 ubuntu-focal systemd[1]: Started Elasticsearch.
正常に起動していることを確認できました。
以上、Elasticsearch設定ファイルの反映について説明しました。
次は、ファイアウォールの開放を行います。
ファイアウォールでポート開放
Elasticsearchの初期ポートを変更していないなら、次のコマンドで状況を確認可能です。
$ sudo ufw status | grep '9200'
何も表示されないなら、「9200」は未開放という状況になります。
なお、「ufw」コマンドが動かない場合は、次の記事をご覧ください。
「ファイアウォールの設定」の箇所に、「ufw」のインストールについて説明があります。
「ufw」コマンドが動くなら、次のコマンドを実行します。
$ sudo ufw allow 9200 ルールを追加しました ルールを追加しました (v6)
では、再度ポートの状況確認です。
$ sudo ufw status | grep '9200' 9200 ALLOW Anywhere 9200 (v6) ALLOW Anywhere (v6)
ポートが、開放されています。
これで、外部ホストからの接続が可能となります。
以上、ファイアウォールの開放について説明しました。
最後に、外部接続の動作確認を行います。
Elasticsearchへの外部接続確認
Pythonを用いて、外部接続確認を行います。
PythonによるElasticsearchへの接続方法については、次の記事で解説しています。
基本的には、上記の記事を参考にしてください。
今回の外部接続確認用のサンプルコードは、以下。
from elasticsearch import Elasticsearch # Elasticsearch接続 es = Elasticsearch("http://192.168.33.60:9200/") # データ登録 es.index(index="test", doc_type='_doc', id=2, body={"key": "200", "value": "elasticsearchの外部接続テスト"}) # データ取得 res = es.get(index="test", doc_type='_doc', id=2)['_source'] print(res) # 接続を閉じる es.close()
Elasticsearchをインストールしたサーバーを指定しているのが、以下の箇所です。
es = Elasticsearch("http://192.168.33.60:9200/")
192.168.33.60が、ElasticsearchをインストールしたサーバーのIPアドレスとなります。
上記を実行して、次の結果が表示されればOK。
{'key': '200', 'value': 'elasticsearchの外部接続テスト'}
この値は、ブラウザを用いて確認することも可能です。
次の形式のURLへアクセスします。
http://xxx.xxx.xxx.xxx:9200/[index]/[doc_type]/[id]
私の場合なら、以下URLとなります。
http://192.168.33.60:9200/test/_doc/2
上記URLにブラウザでアクセス。
json形式で設定した値を確認できます。
以上、Elasticsearchへの外部接続確認について説明しました。