2016-07-01 46 views
6

我正在試圖製作一個簡單的Python Lambda,它可以製作我們的Elasticsearch數據庫的快照。這是通過使用簡單的HTTP請求通過Elasticsearch's REST API完成的。在Python中對AWS Elasticsearch進行簽名的HTTP請求

但是,對於AWS,我必須簽署這些請求。我有一種感覺,它可以通過boto3的低級客戶端可能與generate_presigned_url實現,但我不能爲我的生活弄清楚如何正確調用此功能。例如,什麼是有效的ClientMethod?我試過ESHttpGet但無濟於事。

任何人都可以指向正確的方向嗎?

+0

確實做了一些挖掘。不要以爲'generate_presigned_url'是要走的路。我認爲唯一可用的操作是文檔中列出的高級ES操作:http://boto3.readthedocs.io/en/latest/reference/services/es.html#ElasticsearchService.Client.generate_presigned_url – Alec

回答

5

請求庫有幾個Python擴展,它們將爲您執行SigV4簽名。我已經使用this one,它運作良好。

+0

是的,我我一直希望保持它只是'boto3'和'botocore',但是我已經在'boto'中使用'AWSAuthConnection'完成了 - 似乎有所斬獲。 – Alec

3

我最近發佈requests-aws-sign,它爲Python請求庫提供AWS V4請求籤名。

如果你看看this code,你會看到如何使用Botocore生成V4請求籤名。

6

我掙扎了一段時間去做類似的事情。目前,boto3庫不支持簽署es請求,但由於I raised an issue與它們一起成爲功能請求。

下面是我在同時使用上述DavidMuller's library和boto3提到讓我STS會話憑證進行:

import boto3 
from aws_requests_auth.aws_auth import AWSRequestsAuth 
from elasticsearch import Elasticsearch, RequestsHttpConnection 

session = boto3.session.Session() 
credentials = session.get_credentials().get_frozen_credentials() 

es_host = 'search-my-es-domain.eu-west-1.es.amazonaws.com' 
awsauth = AWSRequestsAuth(
    aws_access_key=credentials.access_key, 
    aws_secret_access_key=credentials.secret_key, 
    aws_token=credentials.token, 
    aws_host=es_host, 
    aws_region=session.region_name, 
    aws_service='es' 
) 

# use the requests connection_class and pass in our custom auth class 
es = Elasticsearch(
    hosts=[{'host': es_host, 'port': 443}], 
    http_auth=awsauth, 
    use_ssl=True, 
    verify_certs=True, 
    connection_class=RequestsHttpConnection 
) 

print(es.info()) 

希望這樣可以節省別人一些時間。

+0

'boto3.Session()'爲我工作。 – Hexy