11

我已经使用AWS elasticsearch service(非EC2)设置了一个elasticsearch服务器。它给了我一个端点https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com/,如果我点击这个端点(注意,没有指定的端口),我可以得到预期的如何使用弹性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客户端没有端口号?示例代码我得到的是

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

如果我使用此代码,只需更换为“host1”与我的终点,我会得到“NoNodeAvailableException”

PS: Java客户端版本我使用是2.0.0。

编辑 我终于决定与第三方REST客户端Jest一起去。但Brooks在下面回答的问题也非常有帮助 - AWS对http使用端口80,对https使用端口443。我想我的阻挡者是防火墙。

EDIT2 的AWS服务ES文件明确地说:
该服务支持HTTP端口80上,但不支持TCP传输。

+0

如果我的回答满意你的问题,我想,如果你将其标记为正确的欣赏它。 – Brooks

+0

@Brooks,我仍然无法使用传输客户端连接到AWS弹性服务,最后决定使用Jest。但你的回答仍然帮助我了解问题所在。我编辑了我的问题接受了您的答案。如果你找到一个完整的解决方案,请编辑你的答案,以便其他人可以受益。 – Edmond

+0

嗨,埃德蒙,你仍然无法连接?您的访问政策是否到位? – Brooks

回答

9

不管你信不信,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”, “_类型”: “的myType”, “_ ID”: “SOME_ID _#”, “_版本”:1, “创造” :TR ue}

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

注:上述准入政策是完全敞开的,不推荐任何远程接近生产。只是如此您知道....

+0

它不起作用。同样的问题。 – Edmond

+0

你试过卷曲吗? – Brooks

+0

是的。 curl给了我未知的SSL协议错误连接到xxxxxxx.us-west-2.es.amazonaws.com:-9847。不确定9847是什么。 – Edmond

0

很多的搜索,我发现它使用了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

你可以举一个如何使用你的代码的例子吗? –

+0

这只是如何将HTTP POST查询发送到AWS ElasticSearch服务的示例。 EsQuery.java文件包含主要方法,您可以在用实际值替换4个静态字符串变量后直接运行它。 – dy10

+0

您的评论应包含在您的回答中。评论是短暂的,可以随时删除。请[编辑]你对缺少信息的回答。 –