从我的电脑访问 Heroku Bonsai 上的 elasticsearch

Accesing elasticsearch on Heroku Bonsai from my computer

我正在尝试 ping 我的 Elasticsearch 实例(通过 Bonsai 和 Heroku 插件部署)。我已遵循他们的指导方针并尝试在我的计算机上执行以下代码:

from elasticsearch import Elasticsearch
from settings import BONSAI_URL
import re, logging

# Log transport details (optional):
logging.basicConfig(level=logging.INFO)

# Parse the auth and host from env:
bonsai = BONSAI_URL
print(bonsai)
auth = re.search('https\:\/\/(.*)\@', bonsai).group(1).split(':')
host = bonsai.replace('https://%s:%s@' % (auth[0], auth[1]), '')

# Connect to cluster over SSL using auth for best security:
es_header = [{
  'host': host,
  'port': 443,
  'use_ssl': True,
  'http_auth': (auth[0],auth[1])
}]

# Instantiate the new Elasticsearch connection:
es = Elasticsearch(es_header)

# Verify that Python can talk to Bonsai (optional):
es.ping()

我收到以下错误消息:

elasticsearch.exceptions.ImproperlyConfigured: Root certificates are missing for certificate validation. Either pass them in using the ca_certs parameter or install certifi to use it automatically.

我认为这个错误是因为我没有 https 证书,所以我使用了 HTTP,方法是删除 URL 和正则表达式中的 s 并切换 use_ssl 为 False 但出现以下错误:

urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))

如何将数据从我的计算机插入到 Heroku 上的 elasticsearch 中?

问题是客户端找不到根证书(这些证书存在于您 运行 正在编写代码的计算机上)。如异常所述,您应该能够安装 certifipip,然后在您的脚本中安装 import certifi,并且应该 运行 没有问题 as described here

您可能正在使用 Python3。 问题在于您的 python 版本和 urlib 的行为方式。

快速修复可能是:

es_header = [{
'host': host,
'port': 443,
'use_ssl': True,
'http_auth': (auth[0],auth[1]),
'verify_certs': False
}]

但是这种方式并不安全。更明确的解决方法是在 requirements.txt:

中写下
certifi

在您的终端中输入:

pip install -r requirements.txt

在您实例化 elasticsearch 的文件中:

import certifi

然后启动您之前启动的完全相同的代码,它应该可以工作并且是安全的。