Transport Client はオープンソース版 Elasticsearch で非推奨となっています。新規プロジェクトでは、すべての Elasticsearch リリース間でバージョン互換性を提供する Java Low Level REST Client をご使用ください。
本トピックでは、Transport Client 5.3.3 を使用して、TCP 経由で Alibaba Cloud Elasticsearch V5.x クラスターに接続する方法について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
JDK 1.8 以降がインストール済みであること。詳しくは、「JDK のインストール」をご参照ください。
-
Alibaba Cloud Elasticsearch V5.5.3 クラスターが作成済みであること。詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
-
クラスターで自動インデックス作成が有効になっています。詳細については、「YML ファイルの設定」をご参照ください。
自動インデックス作成(Auto Indexing)が無効の場合、ドキュメントのインデックス登録時にエラーが報告されます。
ネットワークアクセスの構成
Java クライアントの実行環境に応じて、接続方法を選択してください。
インターネット(パブリックエンドポイント)
Java クライアントが仮想プライベートクラウド(VPC)の外部にある場合:
-
クラスターのパブリックネットワークアクセスを有効化します。
-
クライアントのパブリック IP アドレスをクラスターのパブリック IP アドレスホワイトリストに追加します。詳細については、「Elasticsearch クラスターのパブリックまたはプライベート IP アドレスホワイトリストを設定する」をご参照ください。
-
クライアントが家庭用ネットワークまたはオフィス LAN 内にある場合は、クライアントのプライベート IP アドレスではなく、インターネット出口 IP アドレスをホワイトリストに追加してください。
-
ホワイトリストに
0.0.0.0/0を追加すると、すべての IPv4 アドレスからクラスターへのアクセスが許可されます。この設定を使用する前に、セキュリティリスクを十分に評価してください。 -
ホワイトリストが未設定または不正な場合、接続時に
Timeout connectingエラーが発生し、接続に失敗します。 -
クライアントから Kibana ノードにアクセスするには、別の Kibana ホワイトリストを設定します。 詳細については、「Kibana のパブリックまたはプライベート IP アドレスホワイトリストを設定する」をご参照ください。
同一 VPC 内(内部エンドポイント)
Java クライアントが Elasticsearch クラスターと同一の VPC 内で実行される場合、クラスターの内部エンドポイントを使用します。プライベート IP ホワイトリストのデフォルト値は 0.0.0.0/0 です。
POM 依存関係の追加
以下の依存関係を pom.xml に追加します。
<repositories>
<!-- Elasticsearch Maven リポジトリ -->
<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) の脆弱性」をご参照ください。
クラスターへの接続
以下のコードは、Transport Client 接続を初期化する方法を示しています。プレースホルダー部分は、実際のクラスター情報に置き換えてください。
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 java.net.InetAddress;
// Transport Client の初期化
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "<cluster-id>") // クラスター ID
.put("xpack.security.user", "elastic:<password>") // ユーザー名とパスワード
.put("client.transport.sniff", false) // 必ず false に設定
.build())
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("<endpoint>"), 9300)); // エンドポイント(http:// なし)およびポート
// 使用終了後にクライアントをクローズ
client.close();
| パラメーター | 説明 |
|---|---|
cluster.name |
お使いの Elasticsearch クラスターの ID です。「[基本情報]」ページから取得してください。詳細については、「クラスターの基本情報を表示する」をご参照ください。 |
xpack.security.user |
ユーザー名とパスワードを username:password の形式で指定します。デフォルトのユーザー名は elastic です。パスワードを再設定するには、「Elasticsearch クラスターのアクセスパスワードの再設定」をご参照ください。 |
client.transport.sniff |
false に設定します。 |
InetAddress.getByName() |
クラスターエンドポイントおよびポート 9300。エンドポイントは http:// で始めてはいけません。 |
以下のプレースホルダーを置き換えてください。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<cluster-id> |
Elasticsearch クラスター ID | es-cn-n6w1rux8i000w**** |
<password> |
elastic ユーザーのパスワード |
— |
<endpoint> |
クラスターのパブリックまたは内部エンドポイント | es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com |
例
以下のサンプルコードは、クラスターへの接続、インデックスへのドキュメント書き込み、およびその取得を行います。完全なサンプルコードをダウンロードできます。
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****")
.put("xpack.security.user", "elastic:es_password")
.put("client.transport.sniff", false)
.build())
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com"), 9300));
// インデックスへのドキュメント書き込み
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);
}
}
}
トラブルシューティング
`NoNodeAvailableException`
このエラーは、Transport Client 5.5 または 5.6 を使用して Elasticsearch V5.x クラスターに接続しようとした際に発生します。代わりに Transport Client 5.3.3 をご使用ください。
`Timeout connecting`
クラスターに到達できません。以下の点を確認してください。
-
クライアントの IP アドレスが、クラスターのホワイトリスト(ネットワーク環境に応じてパブリックまたはプライベート)に登録されていること
-
ネットワーク環境に応じて、正しいエンドポイント(パブリックまたは内部)を使用していること
-
家庭用ネットワークまたはオフィス LAN のクライアントでは、プライベート IP アドレスではなく、インターネット出口 IP アドレスがホワイトリストに登録されていること
ドキュメント書き込み時の自動インデックス作成エラー
ドキュメントの書き込み時にエラーが表示される場合、Auto Indexing が無効になっている可能性があります。YML ファイルを構成するを参照し、クラスターの YML 構成で有効にしてください。
次のステップ
-
Java Low Level REST Client — 新規プロジェクト向けに推奨されるクライアント。全バージョンで互換性を確保