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 などのクライアント言語のバージョンが、Elasticsearch クラスターの基盤となるランタイムと一致していることを確認してください。
-
Alibaba Cloud マネージド Elasticsearch への HTTPS 接続では、デフォルトの自己署名証明書をダウンロードしたり、カスタム証明書をアップロードしたりすることはできません。プラットフォームが証明書を定期的に保守および更新するため、証明書の有効期限を管理する必要はありません。
-
Alibaba Cloud マネージド Elasticsearch では、証明書フィンガープリント (
fingerPrint) を設定または取得する必要はありません。クライアントが HTTPS 対応クラスターに接続する場合は、このトピックの言語別の例に従って、証明書の検証をスキップするように設定します。 -
新規購入した Elasticsearch インスタンスの HTTPS クライアントは、証明書の検証をスキップする必要があります。たとえば、Java クライアントですべての証明書を信頼するように設定したり、curl コマンドに
-kを追加したりします。この要件は製品側のセキュリティポリシー変更によるもので、既存のクラスターには影響しません。デプロイ前に、オフピーク時間帯にクライアントの設定を更新して検証してください。証明書の検証をスキップするというこのガイダンスは、Alibaba Cloud マネージド Elasticsearch の HTTPS クラスターに接続する場合にのみ適用され、他の 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 接続に適用できます。コード内のプロトコル指定 ("https") を接続タイプに応じて変更してください。
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 接続に適用できます。コード内のプロトコル指定 ('https://') を接続タイプに応じて変更してください。
pip install elasticsearch==8.17.0
プライベート 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 接続に適用できます。コード内のプロトコル指定 ("https://") を接続タイプに応じて変更してください。
go get github.com/elastic/go-elasticsearch/v8
プライベート HTTPS 接続例
package main
import (
"crypto/tls"
"log"
"net/http"
"github.com/elastic/go-elasticsearch/v8"
)
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)
}
パラメータ
|
パラメータ |
説明 |
|
UserName |
デフォルトのユーザー名は 本番環境ではこのアカウントを使用しないでください。Elasticsearch X-Pack のロールを使用してユーザー権限を管理し、きめ細かな権限を持つカスタムロールを作成してください。 |
|
YourPassword |
指定した |
|
https |
The access protocol. HTTP is enabled by default. For security, enable HTTPS manually. In the Elasticsearch console, go to the [基本情報] page of your instance, then choose [設定と管理] > [セキュリティ設定] to enable HTTPS. 重要
|
|
YourEsHost |
「クラスターエンドポイントの取得」で取得したクラスターエンドポイント (VPC またはパブリック) です:
|
|
9200 |
クラスターのアクセスポートです。デフォルトでは、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 秒) に設定します。ネットワーク環境に応じてこれらの値を調整してください。
Spring Data Elasticsearch を設定して Alibaba Cloud Elasticsearch クラスターに接続するにはどうすればよいですか?
Spring Data Elasticsearch で接続する前に、Elasticsearch コンソールのインスタンス 基本情報 ページで、設定と管理 > セキュリティ設定 を選択します。クライアント IP アドレスを、該当する VPC プライベートネットワークホワイトリストまたはパブリックアクセスホワイトリストに追加します。ホワイトリストでクライアント IP アドレスからのアクセスが許可されている場合にのみ、アプリケーションはクラスターに接続できます。
Spring Boot アプリケーションでは、次の YAML 設定を application.yml に追加できます:
spring:
elasticsearch:
rest:
uris: https://<YourEsHost>:9200
username: <UserName>
password: <YourPassword>
connection-timeout: 10s
read-timeout: 30s
この YAML 設定では、spring.elasticsearch.rest.uris が Elasticsearch のエンドポイントとポートを指定します。spring.elasticsearch.rest.username と spring.elasticsearch.rest.password が接続認証情報を指定します。ネットワーク環境に応じて connection-timeout と read-timeout を調整し、接続が不安定な場合に接続確立や読み取りがブロックされないようにします。
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の行だけを読むのではなく、その周辺で記録されているエラーを確認し、接続タイムアウト、ソケットタイムアウト、SSL/TLS ハンドシェイクの失敗、または証明書の検証失敗がないかを調べます。付随するエラーにより次の対応が決まります。タイムアウトパラメータを調整するか、またはこのトピックの「プロトコルと証明書」で説明したプロトコルと証明書の設定を修正します。 -
この FAQ で示している確認を組み合わせて実施します。「ルーティングテーブルの診断」に従い、Elasticsearch のネットワークセグメントへのルートが存在し、正しいゲートウェイを指していることを確認します。たとえば Docker をインストールするとルーティング情報が変更されます。また、Elasticsearch のネットワークセグメントへのトラフィックをブロックするファイアウォールがないことも確認します。
次に、「クライアントタイムアウトパラメータの設定」に従い、クライアントで接続タイムアウトとソケットタイムアウトを明示的に設定します。明示的なタイムアウトにより、不安定なネットワークでリクエストが長時間ブロックされ、ノードが利用不可として扱われることを防げます。
これらのネットワーク層の確認で問題が見つからない場合は、クラスターのモニタリングデータを使用して、実際にリソースのボトルネックが存在するかを確認してください。クラスターのスケールアップを最初の対処として扱わないでください。