1

I'm trying to ping my Elasticsearch instance (Deployed through Bonsai an Heroku add on). I have followed their guidelines and try to execute the following code on my computer:

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()

I've got the following error message:

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.

I believe this error is coming from the fact that I don't have a https certificates so I used HTTP, by removing the s in the URL and the regex and switching the use_ssl to False but I got the following error:

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

How can I insert data from my computer into elasticsearch on Heroku?

mel
  • 2,730
  • 8
  • 35
  • 70

2 Answers2

1

The problem is that the client cannot find the root certificates (these live on the computer where you are running the code). As the exception mentions, you should be able to install certifi with pip and then just import certifi in your script, and it should run without issue as described here.

MrName
  • 2,363
  • 17
  • 31
1

You are probably using Python3. The problem is about your python version and the way urlib behave.

A quick fix could be:

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

But this way is not secure. A more definitive fix could be to write down in your requirements.txt:

certifi

Type in your terminal:

pip install -r requirements.txt

In your file where you are instanciating elasticsearch:

import certifi

Then launch the exact same code that you launched before and it should work and will be secure.

Huang Yen Hao
  • 434
  • 2
  • 6