2016-07-01 45 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