11

AWS elasticsearch service(EC2ではない)を使用してelasticsearchサーバーをセットアップしました。私はこのエンドポイントをクリックした場合には(何もポートが指定されていないがあることに注意してください)私は期待elastic Javaクライアントを使用してaws elasticsearchサービスと対話するには?

{ 
    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クライアントを介してこれを得るのですかどのように私にエンドポイントhttps://xxx-xxxxxxxx.us-west-2.es.amazonaws.com/を与え、 ? 私が使用しているJavaクライアントのバージョン:私は取得のサンプルコードは、私はこのコードを使用し、ちょうど私のエンドポイントと「HOST1」を交換した場合、私は「NoNodeAvailableException」

PSを取得します

Client client = TransportClient.builder().build() 
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300)); 

です2.0.0である。

最後に、サードパーティのRESTクライアントであるJestと一緒に行くことにしました。しかし、Brooksが以下に答えたことも非常に役に立ちます - AWSはhttpにはポート80を使用し、httpsには443を使用します。私のためのブロッカーは、私が推測するファイアウォールでした。

EDIT2 AWS ESサービスドキュメントは、明示的に述べている:
サービスがポート80でHTTPをサポートしていますが、TCPトランスポートをサポートしていません。

+0

です。 – Brooks

+0

@Brooks、私はまだトランスポートクライアントを使用してAWS弾性サービスに接続できず、最終的にJestに行くことに決めました。しかし、あなたの答えはまだ問題の内容を理解するのに役立ちました。あなたの答えを受け入れた私の質問を編集しました。あなたが完全な解決策を見つけたら、他の人が恩恵を受けるようにあなたの答えを編集してください。 – Edmond

+0

こんにちはエドモンド、あなたはまだ接続できませんでしたか?あなたのアクセスポリシーは整っていますか? – Brooks

答えて

9

信じられないかもしれませんが、AWSは...それはこれを試して、証明するために、80

ので、昔ながらのポートを経由して発売しています9200と9300を使用してElasticsearchを起動しません

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"、 "_タイプ": "MYTYPE"、 "_ ID": "SOME_ID _#"、 "_バージョン":1、 "作成" :tr ue}

キバナをチェックインすると、そこに表示されます。

だから、その後、あなたのコードでは、それは次のようになります。

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" 
    } 
    ] 
} 

注:上記アクセスポリシーが完全に広いオープンしており、生産にリモートから近い何のために推奨されません。ちょうどあなたが知っている....

+0

動作しません。同じ問題。 – Edmond

+0

カールを試しましたか? – Brooks

+0

はい。 curlがxxxxxxx.us-west-2.es.amazonaws.com:-9847に接続している不明なSSLプロトコルエラーを表示しました。 9847が何であるかわからない。 – Edmond

0

サーチの多くの後、私はGETリクエストを使用した例を見つけたので、私は複雑なクエリをPOST本体を経由して提出することができるように、POSTリクエストを可能にするため、それに若干の変更を加えています。実装はhttps://github.com/dy10/aws-elasticsearch-query-java

AWS ESへのアクセスを適切に設定すること(つまり公開しないでください)以外はhttpsを使用するようにしてください(上記のコードではhttpを使用しています。働くでしょう)。

別の探して便利が、部分的な実装は、私の答えはあなたの質問を満たしている場合、あなたが正しいとしてマークされた場合、私はそれを感謝https://github.com/aws/aws-sdk-java/issues/861

+1

コードの使い方の例を挙げることはできますか? –

+0

これは、HTTP POSTクエリをAWS ElasticSearchサービスに送信する方法の単なる例です。 EsQuery.javaファイルにはmainメソッドがあり、4つの静的String変数を実際の値に置き換えて直接実行することができます。 – dy10

+0

あなたのコメントはあなたの答えに含まれるべきです。コメントは短命であり、いつでも削除することができます。不足している情報に対するあなたの答えを[編集]してください。 –

関連する問題