2017-10-17 17 views
1

J'essaie d'envoyer une requête ping à mon instance Elasticsearch (déployée via Bonsai et Heroku add on). J'ai suivi leurs directives et essayer d'exécuter le code suivant sur mon ordinateur:Activer elasticsearch sur Heroku Bonsai à partir de mon ordinateur

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:%[email protected]' % (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() 

J'ai le message d'erreur suivant:

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. 

Je crois que cette erreur provient du fait que je ne pas avoir un certificat de https si je HTTP, en supprimant le s dans l'URL et l'expression rationnelle et la commutation use_ssl False mais je suis l'erreur suivante:

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

Comment puis-je insérer des données de mon ordinateur dans elasticsearch sur Heroku?

Répondre

1

Vous utilisez probablement Python3. Le problème concerne votre version de python et la façon dont se comporte urlib.

Une solution rapide pourrait être:

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

Mais cette façon est pas sécurisée. Une solution plus définitive pourrait être d'écrire dans votre requirements.txt:

certifi 

Tapez votre terminal:

pip install -r requirements.txt 

Dans votre fichier où vous instancier ElasticSearch:

import certifi 

Ensuite, lancez exactement le même code que vous avez lancé auparavant et cela devrait fonctionner et sera sécurisé.

1

Le problème est que le client ne peut pas trouver les certificats racine (ceux-ci vivent sur l'ordinateur sur lequel vous exécutez le code). Comme l'indique l'exception, vous devriez être en mesure d'installer certifi avec pip, puis seulement import certifi dans votre script, et il devrait fonctionner sans problème as described here.