web-dev-qa-db-ja.com

elastic Java clientを使用してaws elasticsearchサービスと通信する方法は?

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トランスポートはサポートしません。

13
Edmond

信じられないかもしれませんが、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"
    }
  ]
}

注:上記のアクセスポリシーは完全にオープンであり、本番環境から離れた場所では推奨されません。ちょうどあなたが知っているので....

14
Brooks

AWSのマネージドエラスティック検索サービスは、これまでトランスポートプロトコルのポートを提供していませんでした。
この質問はここで回答されました、

AWS Managed ElasticSearchのElastic Transportクライアント1

転送プロトコルに関するAWSフォーラムでの議論もあります。こちらがリンクです

トランスポートプロトコルのポートは何ですか?

3
Shahin Alam

多くの検索の後、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 にあります

1
dy10