13

我已经使用AWS elasticsearch 服务(不是 EC2)设置了一个弹性搜索服务器。它给了我一个端点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。

编辑 我最终决定使用第 3 方 REST 客户端Jest 。但是布鲁克斯在下面回答的内容也非常有帮助——AWS 确实使用端口 80 用于 http,443 用于 https。对我来说,阻止者是我猜的防火墙。

Edit2 AWS ES 服务文档明确指出:
该服务支持端口 80 上的 HTTP,但不支持 TCP 传输。

4

3 回答 3

17

信不信由你,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 进行加密传输。您可以尝试使用常规 REST 调用而不是使用 JERSEY。

最后,确保您的 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"
    }
  ]
}

注意:上述访问策略是完全开放的,不推荐用于任何远程接近生产的东西。只是让你知道......

于 2015-11-06T02:11:58.480 回答
3

AWS 中的托管弹性搜索服务直到现在才提供传输协议的端口。
这个问题已经在这里回答了,

AWS Managed ElasticSearch 1上的弹性传输客户端

AWS 论坛中也有关于传输协议的讨论。链接在这里

传输协议的端口是什么?

于 2016-09-19T14:46:20.463 回答
1

经过大量搜索后,我找到了一个使用 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

于 2017-05-21T15:57:04.100 回答