0

J'écris l'implémentation de sauvegarde/restauration d'instantanés AWS Elasticsearch à l'aide de python boto. J'ai pu enregistrer AWS S3 en tant que référentiel d'instantanés ES. Voici l'extrait de ma fonction créer des instantanés.Implémentation AWS Elasticsearch python

import boto 
import urllib 
from boto.connection import AWSAuthConnection 

class ESConnection(AWSAuthConnection): 

def __init__(self, region, **kwargs): 
    super(ESConnection, self).__init__(**kwargs) 
    self._set_auth_region_name(region) 
    self._set_auth_service_name("es") 

def _required_auth_capability(self): 
    return ['hmac-v4'] 
def create_snapshots(profile, region_name, es_host,total_snapshots_to_keep): 
. 
. 
. 
url = "/_snapshot/es_repository/{}?".format(snapshot_name) 
flag = urllib.urlencode({'wait_for_completion':'true'}) 
resp = client.make_request(method='PUT', 
    path=urllib.quote("{}{}".format(url,flag)), 
    data='{"indices": "' + audit_index_name + '", "ignore_unavailable": true, "include_global_state": false}') 

problème principal semble être en extrait ci-dessus où je suis en train de construire une URL pour

{u'status ': 400, u'error': {u'root_cause ': [ {u'reason ': u [es_repository: v4_2017_03_27_snapshot wait_for_completion = true]? nom de l'instantané non valide [? v4_2017_03_27_snapshot wait_for_completion = true], ne doit pas contenir les caractères suivants [\, /, *,, », < ,>, |,,,] ', u'type': u'invalid_snapshot_name_exception '}], tapez': u'invalid_snapshot_name_exception », u'reason ': u [es_repository: v4_2017_03_27_snapshot wait_for_completion = true] nom de l'instantané non valide [? V4_2017_03_27_snapshot wait_for_completion = true], ne doit pas contenir les caractères suivants [\, /, *, ?, », <,>, |?,,,] '}}

Il prend mon drapeau réelle snapshot_name et wait_for_completion entièrement comme nom de l'instantané

nom de l'instantané non valide [v4_2017_03_27_snapshot wait_for_completion = vrai], ne doit pas contenir les caractères suivants [\, /, *, « , <,>, |?,,,] '}}

Pourriez-vous s'il vous plaît me aider à remarquer endroit où je fais tort dans la construction url pour elasticsearch? Ou y a-t-il un meilleur moyen d'y parvenir?

Répondre

0

Le message d'erreur vous donne déjà la réponse. Il y a un symbole spécial non supporté par le nom de l'objet s3.

# the ? ending is wrong, perhaps residual of typo from other language? 
url = "/_snapshot/es_repository/{}?".format(snapshot_name) 

# correct path 
url = "/_snapshot/es_repository/{}".format(snapshot_name) 

(mise à jour)

Lorsque vous utilisez curl, vous utilisez l'API RESTful. Le "?" mark indique à l'API RESTful que ce paramètre est suivi.

Cependant, dans votre code, vous utilisez client.make_request, qui fait partie de boto API. le module make_request accepte uniquement le nom d'objet S3 "chemin" AKA S3 typique.

Si vous voulez simuler le même chemin RESTful, alors je vous suggère d'utiliser python requests avec le chemin que vous venez de construire. à savoir

import requests 
path = urllib.quote("{}{}".format(url,flag)) 
endpoint_url = "http://.." # find your snapshot S3 endpoint url and put here 
url = "{}/{}".format(endpoint_url, path) 
data='{"indices": "' + audit_index_name + '", "ignore_unavailable": true, "include_global_state": false}' 
rest_resp= requests.post(url, data = data) 

En raison de problèmes, vous devez utiliser boto3 Boto/documentation boto2 confusion et Déprécier

+0

Oui, pour cela seulement je besoin d'une réponse. Le problème de base réside dans la restriction de l'URL elle-même. J'ai essayé de placer '?' marquer à différents endroits, c'est-à-dire '/ _snapshot/es_repository/{}?' ou dans snapshot_name ou ne pas le placer n'importe où. Un que j'ai montré dans cette question est l'un des cas d'utilisation et j'ai besoin d'aide pour construire l'url. Si je le fais manuellement comme curl -XPUT 'localhost: 9200/_snapshot/mon_backup/snapshot_1? Wait_for_completion = true & pretty' Et si vous utilisez le script, il échoue à se plaindre '?'. –