如何插入托管在 Google Cloud (bitnami) 上的 Elasticsearch

Posted

技术标签:

【中文标题】如何插入托管在 Google Cloud (bitnami) 上的 Elasticsearch【英文标题】:How to insert into Elasticsearch hosted on Google Clouds (bitnami) 【发布时间】:2016-06-17 03:52:08 【问题描述】:

抱歉,我对 Google Clouds 和 Elasticsearch 还很陌生,但我没有找到任何关于此的文档。基本上,我们只是使用 Bitnami 在 Google Cloud 上部署了一个 Elasticsearch 节点。但我无法用 Python 连接到它。我为下面的代码尝试了很多不同的公式(主机是谷歌云节点外部 IP,用户和密码是 Bitnami 要求连接到我的应用程序的那些)。有人可以让我知道它来自哪里以及正确的语法是什么吗?

from elasticsearch import Elasticsearch

connection_parameters = ['host': 'http://104.196.x.x', 'port': 80]
    es = Elasticsearch(connection_parameters, http_auth=('user', 'password'))
print(es.info())

这是错误:

elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnection object at 0x7f72e757a090>: Failed to establish a new connection: [Errno -2] Name or service not known) caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f72e757a090>: Failed to establish a new connection: [Errno -2] Name or service not known)

如果您能帮助我,非常感谢!

【问题讨论】:

这可能是由您的连接中的身份验证错误引起的。看起来 ElasticSearch 正在使用 urllib3 来建立 HTTP 连接,我特别记得在使用 GAE 时遇到过类似的问题。为了建立我的联系,我不得不打开verify=False 或类似的东西(已经有一段时间了)。另外,您确定 ElasticSearch 在端口 80 上提供服务吗? 您好,感谢您的回答。我试过了,但没有用。 我敢打赌它是端口号,然后才是问题所在。这个 ElasticSearch 服务器是否也在您的 GCE 上运行? GCE 有时可能不喜欢传出的 HTTP 请求,尽管根据我的经验,GAE 通常对此没有任何问题。 GCE 中可能有一些选项可以让您控制允许的端口。 是的,Elastic 正在 GCE 上运行。我确保所有端口都打开(tcp:80; tcp:9200; tcp:9300)并且允许 HTTP 流量... 【参考方案1】:

看来问题出在您在 Google Compute Engine 上的防火墙规则上。您需要明确允许来自 Google 外部的流量到您的 ES 节点。

您可以使用 Google Cloud SDK [1] 创建新的防火墙规则:

gcloud compute firewall-rules create allow-traffic-to-es --allow tcp:80,tcp:443 --source-ranges 0.0.0.0/0 --target-tags es

请注意,此规则将允许从 (0.0.0.0/0) 到您的 ElasticSearch 集群的流量,因此您可能会实施更严格的 CIDR 范围。

[1]Google Cloud SDK

【讨论】:

嗨,不幸的是,流量已经被允许:'bitnami-elasticsearch-2-2-0-0-firewall 网络默认源过滤器允许来自任何源(0.0.0.0/0)允许的协议和端口tcp:80 tcp:443' @Barrec - 您是否尝试连接到端口 9200?当然,您还需要在防火墙中允许此端口。 嗨,是的,我做到了,但仍然没有工作。也许我确实错过了弹性搜索配置中的某些内容? 你确定你在 elasticsearch conf 中的主机配置绑定到 0.0.0.0 了吗? 也可以:network.host: 0.0.0.0 network.publish_host: 10.240.0.4 transport.tcp.port: 9300 http.port: 9200 cluster.name: elastic-pool-dev【参考方案2】:

我认为您应该像这样排除连接字符串的协议部分:

connection_parameters = ['host': '104.196.x.x', 'port': 80]

或者这样:

es = Elasticsearch(['http://user:f00b4r42@104.196.x.x:80/elasticsearch'])

【讨论】:

以上是关于如何插入托管在 Google Cloud (bitnami) 上的 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章

如何在已部署的 Cloud Run Service(托管)中使用 Google Secret?

如何在 MySQL Workbench 中使用 REGEXP_SUBSTR 或 REGEXP_EXTRACT 以及托管在 Google Cloud SQL 上的数据库?

google cloud storage托管静态页面

从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?

如何在 Google Cloud Bigtable 中设置未来的插入日期?尝试使用 TTL 计算它

Google Cloud Run(完全托管):无法自定义域映射