0

私はAWS Elasticsearchのスナップショットを作成しています。これは、python botoを使用したバックアップ/復元の実装です。私はAWS S3をESスナップショットリポジトリとして登録することができました。ここに私の作成スナップショット機能のスニペットがあります。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}') 

主な問題は、私は

{u'statusのURL構築しようとしています上記のスニペットであるように思わ ':400、u'error':{u'root_causeを ':[ {u'reason ': U' [es_repository:v4_2017_03_27_snapshot WAIT_FOR_COMPLETION = trueを?] 無効なスナップショット名 [真v4_2017_03_27_snapshot WAIT_FOR_COMPLETION =?]、 次の文字を含めることはできません[\、/、*、」、<? 、>、|、、] '、u'type': u'invalid_snapshot_name_exception '}]、u'type': u'invalid_snapshot_name_exception」、u'reason ': U' [es_repository:?真v4_2017_03_27_snapshot WAIT_FOR_COMPLETION =] 無効なスナップショット名 [?真v4_2017_03_27_snapshot WAIT_FOR_COMPLETION =]は、\、/、* [ 次の文字を含めることはできません、 ?、」、<、>、|、、、] '}}

それは[v4_2017_03_27_snapshot WAIT_FOR_COMPLETION =

スナップショット名として完全に無効なスナップショット名を私の実際のsnapshot_nameとWAIT_FOR_COMPLETIONフラグを取っています? true]、を含めることはできません次の文字は、[\、/、*、」、<、>、|?、、、] '}}

私は、URLの構築に誤ってそれをやっているところを指摘私を助けてもらえelasticsearchのために?それともこれを達成するための良い方法がありますか?

答えて

0

エラーメッセージは、すでにあなたに答えを与えています。 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) 

(更新)

あなたがcurlを使用するときは、RESTfulなAPIを使用しています。 「?」 mark is notify RESTful APIは、そのパラメータが後ろに続くことを示します。

ただし、コードでは、client.make_requestを使用します。これはboto APIの一部です。 make_requestモジュールは、典型的なS3 "path" AKA有効なS3オブジェクト名のみを受け入れます。

同じRESTfulパスをシミュレートする場合は、ちょうど構築するパスにpython requestsを使用することをお勧めします。すなわち

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) 

ためのboto/boto2混乱ドキュメントへと問題を廃止、あなたはboto3

+0

はいを​​使用する必要があり、そのためだけに私は答えを必要としています。基本的な問題は、URL自体の制約です。私は「?」を配置しようとしました。異なる場所、つまり '/ _snapshot/es_repository/{}?'にマークを付けます。またはsnapshot_nameに格納するか、どこにも置かないでください。私がこの質問で示したものは、ユースケースの1つです。そして、私はURLを構築する際に助けが必要です。私は手動でcurl -XPUT 'localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion = true&pretty'のように手動で行う場合 スクリプトを使用すると「?」というエラーが表示されます。 –

関連する問題