Java、Python、または Go を使用して Alibaba Cloud Elasticsearch クラスターに接続します。
事前準備
クラスターエンドポイントの取得
Elasticsearch クラスターには、VPC プライベートネットワーク経由の内部エンドポイント、またはパブリックエンドポイントを使用して接続できます。
-
内部エンドポイント:Elasticsearch クラスターへの低レイテンシーで安定性の高い接続を提供します。このエンドポイントは、クラスター作成時にデフォルトで有効になります。
-
パブリックエンドポイント:インターネット経由で Elasticsearch クラスターに接続できます。このエンドポイントは手動で有効にする必要があります。
パブリックアクセスの有効化
-
Elasticsearch コンソールにログインし、お使いのインスタンスの基本情報ページに移動します。
-
ナビゲーションペインで、設定と管理 > セキュリティ設定 を選択し、パブリックアクセスを有効にします。クラスターのステータスが 初期化中 から 有効 に変更されると、パブリックアクセスが有効になります。
[パブリックアクセス] を有効にすると、[パブリックエンドポイント] は
es-cn-<instance_ID>.public.elasticsearch.aliyuncs.comの形式になります。[パブリック IP ホワイトリスト] はデフォルトでは空であり、設定する必要があります。重要パブリックエンドポイントを使用すると、Elasticsearch クラスターのセキュリティが損なわれる可能性があります。パブリックエンドポイントを使用する場合は、必ず IP ホワイトリストを設定し、使用後はパブリックアクセスを無効にしてください。
IP ホワイトリストの設定
クラスターを保護するには、アクセスに使用するデバイスの IP アドレスを、Elasticsearch クラスターの VPC プライベートネットワークまたはパブリック IP ホワイトリストに追加する必要があります。ホワイトリストに登録された IP アドレスを持つデバイスのみがクラスターにアクセスできます。
-
アクセスに使用するデバイスの IP アドレスを取得します。
次の表では、さまざまなシナリオで IP アドレスを取得する方法を説明します。
シナリオ:
IP アドレス:
方法:
ローカルデバイスから Elasticsearch クラスターに接続する
ローカルデバイスのパブリック IP アドレス。
ローカルデバイスが家庭用ネットワークや企業ネットワークなどのローカルエリアネットワーク (LAN) 上にある場合は、LAN のゲートウェイのパブリック IP アドレスをクラスターのパブリック IP ホワイトリストに追加する必要があります。
curl ipinfo.io/ipコマンドを実行して、ローカルデバイスのパブリック IP を確認します。異なる VPC の ECS インスタンスから Elasticsearch クラスターに接続する
ECS インスタンスのパブリック IP アドレス。
ECS コンソールにログインして、インスタンスリストで確認します。
同じ VPC の ECS インスタンスから Elasticsearch クラスターに接続する
ECS インスタンスのプライベート IP アドレス。
ECS コンソールにログインして、インスタンスリストで確認します。
-
この IP アドレスをホワイトリストグループに追加します。
-
Elasticsearch コンソールにログインします。 インスタンスの基本情報ページで、ナビゲーションペインから設定と管理 > セキュリティ設定を選択します。 変更をクリックして、VPC プライベートネットワークまたはパブリック IP ホワイトリストを設定します。
-
default グループの右側にある[設定]をクリックします。表示されるダイアログボックスで、VPC プライベートネットワークまたはパブリック IP ホワイトリストに IP アドレスを追加します。クラスターには、最大 300 個の IP アドレスまたは CIDR ブロックを追加できます。複数のエントリはコンマ (,) で区切り、スペースは追加しないでください。
-
また、Add IP address whitelist Group をクリックしてカスタムグループを作成することもできます。
-
ホワイトリストグループは IP アドレス管理のためのものであり、アクセス権限には影響しません。すべてのグループのすべての IP アドレスは同じ権限を持ちます。
設定タイプ:
形式と例:
重要な注意事項:
IPv4 アドレス形式
-
単一 IP:
192.168.0.1 -
CIDR ブロック:
192.168.0.0/24
-
すべてのアクセスを拒否:
127.0.0.1 -
すべてのアクセスを許可:
0.0.0.0/0重要これは高いセキュリティリスクをもたらします。
0.0.0.0/0を設定しないことを強く推奨します。7.16 や 8.5 などの一部のクラスターバージョンおよびリージョンでは、
0.0.0.0/0はサポートされていません。詳細については、コンソール UI またはエラーメッセージをご参照ください。
IPv6 アドレス形式
(China (Hangzhou) リージョンの v2 デプロイメントアーキテクチャクラスターでのみサポートされています)
-
単一 IP:
2401:XXXX:1000:24::5 -
CIDR ブロック:
2401:XXXX:1000::/48
-
すべてのアクセスを拒否:
::1 -
すべてのアクセスを許可:
::/0重要これは高いセキュリティリスクをもたらします。
::/0を設定しないことを強く推奨します。クラスターのバージョンによっては、
::/0をサポートしていません。詳細については、コンソール UI または設定プロンプトをご参照ください。
-
-
OK をクリックします。
-
プロトコルと証明書
-
クライアントの言語バージョン (Java、Python、または Go) が、ES クラスターの基盤となるランタイムと一致していることを確認してください。
-
パブリック HTTPS: CA 発行証明書を使用します。特別なクライアント設定は不要です。
https://で直接接続してください。 -
プライベート HTTPS:自己署名証明書を使用します。以下の例のとおり、クライアント側で証明書の検証をスキップしてください。
クラスターへの接続
Java
-
Java Development Kit (JDK) 1.8 以降をインストールします。
-
Maven の依存関係を設定します。
重要versionはクラスターのバージョンと一致するように設定してください (この例では 8.17.0)。versionの値が一致しない場合、依存関係の解決に失敗します。<dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.17.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> -
YML パラメーターを設定してインデックスの自動作成を有効にします:
action.auto_create_index: true。次の例では、hr_testという名前のインデックスを作成します。
基本接続の例
パブリック HTTPS 接続またはプライベート HTTP 接続で使用します:
package org.example;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.cat.IndicesResponse;
import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.*;
import java.io.IOException;
public class RestClientTest {
public static void main(String[] args) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
// プロトコルを指定します。パブリック HTTPS 接続の場合は "https" のまま、プライベート HTTP 接続の場合は "http" に変更します。
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
try {
CreateIndexResponse indexRequest = elasticsearchClient.indices().create(createIndexBuilder -> createIndexBuilder
.index("hr_test")
.aliases("foo", aliasBuilder -> aliasBuilder.isWriteIndex(true))
);
System.out.println("Index document successfully! " + indexRequest.acknowledged());
transport.close();
restClient.close();
} catch (IOException ioException) {
// 例外を処理します。
}
}
}
プライベート HTTPS 接続の例
プライベート HTTPS の場合は、証明書の検証をスキップします:
package org.example;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.ssl.SSLContexts;
import org.elasticsearch.client.*;
import javax.net.ssl.SSLContext;
public class RestClientTestPrivateHttps {
public static void main(String[] args) throws Exception {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
// すべての証明書を信頼する SSLContext を作成します。
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (chain, authType) -> true) // すべての証明書を信頼します。
.build();
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext) // SSLContext を設定します。
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); // ホスト名の検証をスキップします。
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
// 操作を実行します。
System.out.println(elasticsearchClient.info());
transport.close();
restClient.close();
}
}
Python
これらの例では Elasticsearch 8.17.0 を使用します。お使いのクラスターのバージョンに置き換えてください。
基本接続の例
パブリック HTTPS 接続またはプライベート HTTP 接続で使用します:
pip install elasticsearch==8.17.0
from elasticsearch import Elasticsearch
es = Elasticsearch(
hosts=['https://<YourEsHost>:9200'], # パブリック HTTPS アクセスの場合は 'https://'、プライベート HTTP アクセスの場合は 'http://' を使用します。
basic_auth=('<UserName>', '<YourPassword>'),
)
print(es.info())
プライベート HTTPS 接続の例
from elasticsearch import Elasticsearch
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # SSL 警告を無効化します (任意)。
es = Elasticsearch(
hosts=['https://<YourEsHost>:9200'],
basic_auth=('<UserName>', '<YourPassword>'),
verify_certs=False, # 証明書の検証をスキップします。
ssl_show_warn=False, # SSL 警告を無効化します。
)
print(es.info())
Go
これらの例では、Elasticsearch 8.x クラスター向けの Elasticsearch Go Client を使用します。
基本接続の例
パブリック HTTPS 接続またはプライベート HTTP 接続で使用します:
go get github.com/elastic/go-elasticsearch/v8
package main
import (
"github.com/elastic/go-elasticsearch/v8"
"log"
)
func main() {
cfg := elasticsearch.Config{
Addresses: []string{"https://<YourEsHost>:9200"}, // パブリック HTTPS アクセスの場合は "https://"、プライベート HTTP アクセスの場合は "http://" を使用します。
Username: "<UserName>",
Password: "<YourPassword>",
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res)
}
プライベート HTTPS 接続の例
package main
import (
"crypto/tls"
"net/http"
"github.com/elastic/go-elasticsearch/v8"
"log"
)
func main() {
cfg := elasticsearch.Config{
Addresses: []string{"https://<YourEsHost>:9200"},
Username: "<UserName>",
Password: "<YourPassword>",
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 証明書の検証をスキップします。
},
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res)
}
パラメーター
|
パラメーター |
説明 |
|
|
デフォルトのユーザー名は 本番環境ではこのアカウントの使用を避けてください。Manage user permissions by using Elasticsearch X-Pack roles を使用して、きめ細かな権限を持つカスタムロールを作成してください。 |
|
|
指定した |
|
|
アクセスプロトコルです。HTTP はデフォルトで有効です。 セキュリティのため、HTTPS は手動で有効にしてください。Elasticsearch コンソール で、インスタンスの 基本情報 ページに移動し、設定と管理 > セキュリティ設定 を選択して HTTPS を有効にします。 重要
|
|
|
前提条件で取得したクラスターエンドポイント (VPC またはパブリック):
|
|
|
クラスターのアクセスポートです。デフォルト: VPC およびパブリックアクセスのいずれも 9200 です。 |
よくある質問
クラスターのステータスが正常にもかかわらずクライアントが接続できない場合は、次の方法でトラブルシューティングを行ってください。
ルーティングテーブルの診断
同一 VPC 内で Elasticsearch 接続が失敗する場合は、ルーティングテーブルを確認してください。Docker をインストールするとルーティング情報が変更され、Elasticsearch のネットワークセグメントへのルートが欠落したり、誤ったゲートウェイを指したりする可能性があります。ECS インスタンスで次のコマンドを実行して、ルーティングテーブルを表示します:
route -n
出力に Elasticsearch ネットワークセグメントへのルートが存在するかどうかを確認します。ルートが欠落している、またはゲートウェイが誤っている場合は、ルーティング設定を修正して接続を再試行してください。また、社内ファイアウォールが Elasticsearch ネットワークセグメントへのトラフィックをブロックしていないかどうかも確認してください。
ドメインとポートの検証
curl コマンドを使用して、ドメインとポートが正しく指定されていることを確認します:
curl -u {UserName}:{YourPassword} https://{YourEsHost}:9200
Could not resolve host と返される場合は、ドメイン名のタイプミスを示します。よくある誤りとして、ドメイン名の文字抜けや、ポート番号の省略が挙げられます。
クライアントのタイムアウトパラメーター設定
Java クライアントは、デフォルトでは接続タイムアウトやソケットタイムアウトを設定しません。不安定なネットワークでは、接続が無期限にブロックされる可能性があります。setRequestConfigCallback を使用して、タイムアウトパラメーターを設定します:
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setRequestConfigCallback(builder -> builder
.setConnectTimeout(10000)
.setSocketTimeout(30000))
.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
.build();
ConnectTimeout は接続確立までの待機時間を制御します。10000 ミリ秒 (10 秒) に設定します。SocketTimeout はデータ読み取りの待機時間を制御します。30000 ミリ秒 (30 秒) に設定します。これらの値はネットワーク環境に応じて調整してください。
ECS インスタンスから Elasticsearch クラスターへのネットワークレイテンシのテスト方法と、パブリックネットワークアクセスに関する注意事項
クラスターの VPC 外にある ECS インスタンスは、パブリックエンドポイント経由で Elasticsearch を呼び出せます。パブリックアクセスはサポートされている接続方法です。使用する前に、クラスターでパブリックアクセスが有効になっていることと、ECS インスタンスのパブリック IP アドレスがパブリックアクセスホワイトリストに含まれていることを確認してください。いずれも本トピックの冒頭で説明しています。
パブリック接続は、VPC プライベートネットワーク経由の内部エンドポイントを使用する接続よりも、経由するホップ数が多くネットワークパスも長くなるため、ネットワークレイテンシが顕著に高くなり、ネットワークリンクのジッターの影響を受けやすくなります。本番環境では、VPC プライベートネットワーク経由の内部エンドポイントで接続してください。パブリックアクセスは、テスト、一時的なトラブルシューティング、またはプライベートネットワークパスを確立できない場合に限定してください。
ECS インスタンスとクラスター間のネットワーク品質を測定するには、ECS インスタンスで次のいずれかの方法で確認します。
-
ping を使用して基本的な疎通を確認し、ラウンドトリップタイム (RTT) を観測します:
ping {YourEsHost}出力の平均 RTT とパケット損失率を確認します。平均 RTT が高い、またはパケット損失が発生している場合は、リンク品質が低いことを示します。一部のネットワーク環境やセキュリティポリシーでは ICMP がブロックされるため、ping が通らなくても、必ずしも Elasticsearch サービスの停止を意味するわけではありません。その場合は、この FAQ の「ドメインとポートの検証」項目にある curl コマンドでポート疎通を確認してください。
-
MTR を使用してホップ単位でネットワークパスをトレースし、ボトルネックを特定します。MTR は汎用のネットワーク診断ツールであり、ECS インスタンスにお客様自身でインストールする必要があります:
mtr -r -c 100 {YourEsHost}各ホップのパケット損失率とレイテンシを確認します。特定のホップ以降でパケット損失率またはレイテンシが上昇し続ける場合、ボトルネックはそのホップ、またはそれ以降の経路にあります。これにより、問題が ECS 側、中間のパブリックネットワーク、またはアクセス側のいずれにあるかを切り分けられます。
測定したレイテンシが高く、ワークロードがレイテンシに敏感な場合は、同一リージョンかつ同一 VPC の VPC プライベートネットワーク経由の内部エンドポイントに切り替えてください。そのうえで、この FAQ の「クライアントのタイムアウトパラメーター設定」項目で説明しているとおり、接続タイムアウトと読み取りタイムアウトを調整してください。
No alive nodes found エラーのトラブルシューティング
No alive nodes found エラーは、クライアントが保持しているノードリスト内で利用可能なノードを見つけられないことを意味します。多くの場合、クラスターリソース不足ではなく、ネットワーク接続の不安定さ、リクエストのタイムアウト、またはクライアントとクラスター間のルーティング異常が原因です。そのため、クラスターをスケールアップしても解消しないことがよくあります。まずはネットワーク接続を調査してください。
-
クライアントがクラスターに到達するために使用しているネットワークパスを特定します。VPC プライベートネットワーク経由の内部エンドポイントで接続しているのか、パブリックエンドポイントで接続しているのかを確認します。そのうえで、クロスリージョンアクセス、クロス VPC アクセス、または長いパブリックネットワークパスがないかを確認してください。これらはいずれもネットワークジッターの影響でノードのプロービングが失敗しやすくなります。
パブリックネットワーク接続またはリージョン間接続の場合は、この FAQ の「ECS インスタンスから Elasticsearch クラスターへのネットワークレイテンシのテスト方法と、パブリックネットワークアクセスに関する注意事項」項目で説明したとおり、リンク品質を測定してください。その後、同一リージョンかつ同一 VPC の VPC プライベートネットワーク経由の内部エンドポイントに切り替えてください。
-
クライアントログの前後関係を確認します。
No alive nodes foundの 1 行だけを読むのではなく、その周辺に記録されている、接続タイムアウト、ソケットタイムアウト、SSL/TLS ハンドシェイクの失敗、または証明書の検証失敗などのエラーを確認してください。これらの付随エラーに基づいて、次のアクションを判断します。たとえば、タイムアウトパラメーターを調整する、または本トピックの「プロトコルと証明書」セクションで説明しているプロトコルと証明書の設定を修正します。 -
この FAQ で説明している他の確認項目と組み合わせてください。「ルーティングテーブルの診断」項目に従い、Elasticsearch ネットワークセグメントへのルートが存在し、正しいゲートウェイを指していることを確認してください。たとえば Docker のインストールにより、ルーティング情報が変更されます。また、ファイアウォールが Elasticsearch ネットワークセグメントへのトラフィックをブロックしていないことも確認してください。
次に、「クライアントのタイムアウトパラメーター設定」項目に従い、クライアントで接続タイムアウトとソケットタイムアウトを明示的に設定します。明示的なタイムアウトにより、不安定なネットワークでリクエストが長時間ブロックされ、ノードが利用不可と判断されることを防げます。
これらのネットワークレイヤーのチェックで問題が見つからない場合は、クラスターのモニタリングデータを使用して、リソースボトルネックが実際に存在するかどうかを確認してください。クラスターのスケールアップを最初の対処として扱わないでください。