我有一个运行在不同AWS EC2示例上的Elasticsearch节点集群。它们通过AWS内的网络进行内部连接,因此它们的网络和发现地址设置在此内部网络中。我想使用python elasticsearch库从外部连接到这些节点。EC2示例附加了静态公共IP地址。并且弹性示例允许从任何地方进行https连接。连接工作正常,即我可以通过浏览器和Python elasticsearch库连接到示例。但是,现在我想设置嗅探,所以我设置了Python代码如下:
self.es = Elasticsearch([f'https://{elastic_host}:{elastic_port}' for elastic_host in elastic_hosts],
sniff_on_start=True, sniff_on_connection_fail=True, sniffer_timeout=60,
sniff_timeout=10, ca_certs=ca_location, verify_certs=True,
http_auth=(elastic_user, elastic_password))
如果我删除了嗅探参数,就可以很好地连接到示例,但是,使用嗅探后,启动时会立即得到elastic_transport.SniffingError: No viable nodes were discovered on the initial sniff attempt
。elasticsearch.yml
配置中的http.publish_host
设置为EC2计算机的公共IP地址,/_nodes/_all/http
端点返回公共IP作为publish_address(即x.x.x.x:9200
)。
在使用其他微服务进行进一步测试之后,我们将这个问题定位到elasticsearch-py库,这些微服务可以毫无问题地执行嗅探。
1条答案
按热度按时间pxiryf3j1#
在对我们的其他微服务进行测试后,我们发现这个问题与elasticsearch-py库有关,而不是我们的elasticsearch配置,因为我们的其他微服务基于golang,可以毫无问题地执行嗅探。
经过进一步的研究,我们将这个问题与elasticsearch-py库上的这个公开问题联系起来:https://github.com/elastic/elasticsearch-py/issues/2005.
问题是授权标头没有正确传递给向Elasticsearch发出的发现节点的请求。据我所知,目前还没有不涉及改变库本身的修复方法。然而,错误消息显然具有误导性。