簡體   English   中英

AWS Elasticsearch python實現

[英]AWS Elasticsearch python implementation

我正在使用python boto編寫AWS Elasticsearch快照備份/還原實現。 我能夠將AWS S3注冊為ES快照存儲庫。 這是我的創建快照功能的代碼片段。

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'狀態':400,錯誤':{u'root_cause':[{u'原因“:u'[es_repository:v4_2017_03_27_snapshot?wait_for_completion = true]無效的快照名稱[v4_2017_03_27_snapshot?wait_for_completion = true],包含以下字符[\\,/,*,?,“,<,>,|,”,“]',u'type':u'invalid_snapshot_name_exception'}],u'type':u'invalid_snapshot_name_exception',u'原因':u'[es_repository:v4_2017_03_27_snapshot?wait_for_completion = true]無效的快照名稱[v4_2017_03_27_snapshot?wait_for_completion = true],不得包含以下字符[\\,/,*,?,“,<,>,| 、、、 ]'}}

它會將我的實際snapshot_name和wait_for_completion標志完全用作快照名稱

無效的快照名稱[v4_2017_03_27_snapshot?wait_for_completion = true],不得包含以下字符[\\,/,*,?,“,<,>,|,,,]'}}

您能幫我指出我在為Elasticsearch構建網址時做錯了什么地方嗎? 還是有更好的方法來做到這一點?

錯誤消息已經為您提供了答案。 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。 “?” 標記是通知RESTful API該參數緊隨其后。

但是,在代碼中,您使用的是client.make_request ,它是boto API的一部分。 make_request模塊僅接受典型的S3“路徑”,也就是有效的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM