amazon-web-services - 如何使用弹性 java 客户端与 aws elasticsearch 服务通信?

标签 amazon-web-services elasticsearch elasticsearch-java-api amazon-elasticsearch

我已经使用 AWS elasticsearch service 设置了一个 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”

附言: 我使用的 java 客户端版本是 2.0.0。

编辑 我最终决定选择 Jest ,第 3 方 REST 客户端。但是布鲁克斯在下面的回答也很有帮助——AWS 确实使用端口 80 表示 http,使用 443 表示 https。我猜对我来说,拦截器是防火墙。

编辑2 AWS 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 加密传输。您可以尝试使用常规 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"
    }
  ]
}

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

关于amazon-web-services - 如何使用弹性 java 客户端与 aws elasticsearch 服务通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558093/

相关文章:

amazon-web-services - 节点无法连接到Hub,继续发送注册事件

elasticsearch - 格式错误的查询,预期 [END_OBJECT] 但找到 [FIELD_NAME]

elasticsearch - Elasticsearch 批量API,管道和Geo IP

elasticsearch - 使用NiFi拉取Elasticsearch索引

elasticsearch - Elasticsearch根据搜索查询更新整个 `_source`字段

mysql - Amazon DynamoDB - 基于友谊设计表格

java - 如何在亚马逊服务器中部署 Web 应用程序

ios - 如何检查用户是否首次登录 AWS Cognito?

java - Elasticsearch java api 或过滤器

elasticsearch - ElasticSearch Java API与ElasticsearchTemplate