このトピックでは、Transport Client 5.3.3 を使用して Alibaba Cloud Elasticsearch V5.X クラスタにアクセスする方法について説明します。
注意事項
Elasticsearch クラスタへのアクセスには、Transport Client 5.3.3 を使用することをお勧めします。 Transport Client 5.5 または 5.6 を使用して Elasticsearch クラスタにアクセスすると、「NoNodeAvailableException」というエラーメッセージが表示されます。
Transport Client は、TCP 経由で Elasticsearch クラスタと通信します。 Transport Client が、Transport Client のバージョンと一致しないバージョンの Elasticsearch クラスタと通信する場合、非互換性の問題が発生する可能性があります。 オープンソースの Elasticsearch の新しいバージョンでは、Transport Client は非推奨です。 バージョン互換性を確保するために、Java Low Level REST Client を使用して Elasticsearch クラスタにアクセスすることをお勧めします。
準備
JDK をインストールします。 JDK のバージョンは 1.8 以降である必要があります。
詳細については、「JDK のインストール」をご参照ください。
Alibaba Cloud Elasticsearch V5.5.3 クラスタを作成します。
詳細については、「Alibaba Cloud Elasticsearch クラスタの作成」をご参照ください。
Elasticsearch クラスタの自動インデックス作成機能を有効にします。
詳細については、「YML ファイルの設定」をご参照ください。
自動インデックス作成機能が有効になっていない場合、次のエラーが報告されます。

ネットワーク間の正常な通信を確保するために、Elasticsearch クラスタの IP アドレスホワイトリストを設定します。
Java コードを実行するサーバーがインターネット環境にある場合、パブリックエンドポイントを使用してクラスタにアクセスできます。 クラスタにアクセスする前に、クラスタのパブリックネットワークアクセス機能を有効にし、サーバーのパブリック IP アドレスをクラスタのパブリック IP アドレスホワイトリストに追加する必要があります。 詳細については、「Elasticsearch クラスタのパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
重要クライアントがホームネットワークまたはオフィスの LAN にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出口の IP アドレスをホワイトリストに追加する必要があります。
すべての IPv4 アドレスからのリクエストを許可するために、ホワイトリストに 0.0.0.0/0 を追加することもできます。 この設定を行うと、すべてのパブリック IP アドレスを使用してクラスタにアクセスできます。 これにより、セキュリティリスクが発生します。 この設定を行う前に、リスクを評価することをお勧めします。
IP アドレスホワイトリストが設定されていない場合、または IP アドレスホワイトリストが正しく設定されていない場合、システムは「Timeout connecting」というエラーメッセージを報告して、接続タイムアウトエラーを示します。
クライアントからクラスタ内の Kibana ノードにアクセスする場合は、Kibana の IP アドレスホワイトリストを設定する必要があります。 詳細については、「Kibana のパブリックまたはプライベート IP アドレスホワイトリストの設定」をご参照ください。
Java コードを実行するサーバーが Elasticsearch クラスタと同じ仮想プライベートクラウド (VPC) にある場合、内部エンドポイントを使用してクラスタにアクセスできます。 Elasticsearch クラスタにアクセスする前に、サーバーのプライベート IP アドレスがクラスタのプライベート IP アドレスホワイトリストに追加されていることを確認してください。 デフォルトでは、0.0.0.0/0 がホワイトリストに追加されています。
Java Maven プロジェクトを作成し、次の Project Object Model (POM) 依存関係 をプロジェクトの pom.xml ファイルに追加します。
POM 依存関係
<repositories>
<!-- Elasticsearch リポジトリを追加します -->
<repository>
<id>elasticsearch-releases</id>
<url>https://artifacts.elastic.co/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>x-pack-transport</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7.1</version>
</dependency>
</dependencies>Apache Log4j にリモートコード実行 (RCE) の脆弱性が存在する可能性があります。 詳細については、「脆弱性に関するお知らせ | Apache Log4j 2 の RCE 脆弱性」をご参照ください。
例
完全なサンプルコードをダウンロードできます。
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
import static org.elasticsearch.common.xcontent.XContentFactory.*;
import java.net.InetAddress;
public class TransportClientDemo {
public static void main(String[] args) {
try {
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "es-cn-n6w1rux8i000w****") // Elasticsearch クラスタの ID に値を設定します。
.put("xpack.security.user", "elastic:es_password") // Elasticsearch クラスタにアクセスするために使用するユーザー名とパスワードに値を設定します。
. put("client.transport.sniff", false) // 値を false に設定します。
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com"), 9300));// Elasticsearch クラスタにアクセスするために使用するエンドポイントとポート番号を指定します。
// ビジネス要件に基づいて、次のコードを変更できます。 たとえば、インデックス名、インデックスタイプ、およびドキュメント ID を変更できます。
IndexResponse idxResp3 = client.prepareIndex("test_index", "test_type", "333")
.setSource(jsonBuilder()
.startObject()
.field("user_id", "333")
.field("email", "a***@aliyun.com")
.endObject()
)
.get();
System.out.println(idxResp3.toString());
GetResponse getResp =
client.prepareGet().setIndex("test_index").setType("test_type").setId("333").execute().get();
System.out.println(getResp.getSourceAsString());
client.close();
} catch (Exception e) {
System.out.println(e);
}
}
}パラメータ | 説明 |
cluster.name | Elasticsearch クラスタの ID に値を設定します。 ID は、クラスタの [基本情報] ページから取得できます。 詳細については、「クラスタの基本情報の表示」をご参照ください。 |
client.transport.sniff | 値を false に設定します。 |
xpack.security.user | Elasticsearch クラスタにアクセスするために使用するユーザー名とパスワードに値を設定します。 デフォルトのユーザー名は elastic です。 パスワードは、クラスタの作成時に指定します。 パスワードを忘れた場合は、リセットできます。 パスワードをリセットする手順と注意事項については、「Elasticsearch クラスタのアクセスパスワードのリセット」をご参照ください。 |
InetAddress.getByName() | Elasticsearch クラスタにアクセスするために使用するエンドポイントとポート番号を指定します。 重要 エンドポイントは http で始めることはできません。 |