AWS elasticsearch service (EC2ではない)を使用してelasticsearchサーバーをセットアップしました。それは私にエンドポイントを与えました https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com/ そしてこのエンドポイントをクリックすると(指定されたポートがないことに注意してください)私は得ることができます期待された
{
status: 200,
name: "Mastermind",
cluster_name: "xxxx",
version: {
number: "1.5.2",
build_hash: "yyyyyy",
build_timestamp: "2015-04-27T09:21:06Z",
build_snapshot: false,
lucene_version: "4.10.4"
},
tagline: "You Know, for Search"
}
質問は、elasticsearch Javaクライアントからポート番号なしでこれを取得する方法ですか?取得するサンプルコードは次のとおりです。
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("Host1"), 9300));
このコードを使用して、「Host1」を私のエンドポイントで置き換えると、「NoNodeAvailableException」が返されます。
pS:Java私が使用しているクライアントのバージョンは2.0.0です。
Edit私は最終的に Jest 、サードパーティREST client。 Brooksが以下で答えたことも非常に役立ちます-AWSはhttpにポート80、httpsに443を使用します私のブロッカーは私が推測したファイアウォールでした。
Edit2AWS ESサービスのドキュメントには、次のように明記されています。
サービスはポート80でHTTPをサポートしますが、TCPトランスポートはサポートしません。
信じられないかもしれませんが、AWSは9200と9300を使用してElasticsearchを起動しません。これは、古いポート80を介して起動されます。
だから、実証するために、これを試してください...
curl -XPOST "http://xxx-xxxxxxxx.us-west-2.es.amazonaws.com:80/myIndex/myType" -d '["name":"Edmond"}'
または
curl -XPOST "https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com:443/myIndex/myType" -d '["name":"Edmond"}'
{"_index": "myIndex"、 "_ type": "myType"、 "_ id": "SOME_ID _#"、 "_ version":1、 "created":true}で応答する必要があります
Kibanaをチェックインすると、そこにあることがわかります。
したがって、コードでは次のようになります。
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("xxx-xxxxxxxx.us-west-2.es.amazonaws.com"), 80));
残念ながら、トランスポートクライアントを使用してSSL/HTTPSを介して暗号化して送信する方法を私は手元に知りません。 JERSEYを使用する代わりに、通常のREST呼び出しを使用してみてください。
最後に、Elasticsearchアクセスポリシーが正しく設定されていることを確認します。以下に沿ったもの:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:yyyyyyy:domain/myDomain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:yyyyyyyyy:domain/myDomain"
}
]
}
注:上記のアクセスポリシーは完全にオープンであり、本番環境から離れた場所では推奨されません。ちょうどあなたが知っているので....
AWSのマネージドエラスティック検索サービスは、これまでトランスポートプロトコルのポートを提供していませんでした。
この質問はここで回答されました、
AWS Managed ElasticSearchのElastic Transportクライアント1
転送プロトコルに関するAWSフォーラムでの議論もあります。こちらがリンクです
多くの検索の後、GETリクエストを使用する例を見つけたので、POSTリクエストを許可するようにマイナーな変更を加え、POSTボディを介して複雑なクエリを送信できるようにしました。実装は https://github.com/dy10/aws-elasticsearch-query-Java で利用できます。
AWS ESへのアクセスを適切に構成する(つまり、パブリックに開かない)以外に、必ずhttpsを使用してください(上記のコードはhttpを使用します。コードのhttpをhttpsに置き換えるだけで機能します)。
別の便利な外観ですが、部分的な実装は https://github.com/aws/aws-sdk-Java/issues/861 にあります