在Python中向AWS Elasticsearch发出签名的HTTP请求

Ale*_*lec 9 amazon-web-services python-2.7 elasticsearch boto3

我正在尝试制作一个简单的Python Lambda,它可以为我们的Elasticsearch数据库创建快照.这是通过Elasticsearch的REST API使用简单的HTTP请求完成的.

但是,对于AWS,我必须签署这些请求.我有一种感觉,它可以通过boto3可能的低级客户端实现generate_presigned_url,但我不能为我的生活弄清楚如何正确调用这个功能.例如,什么是有效ClientMethod的?我试过ESHttpGet但无济于事.

谁能指出我正确的方向?

小智 12

我挣扎了一段时间做类似的事情.目前boto3库不支持发出签名的es请求,但是由于我提出了它们的问题,它已成为一个功能请求.

以下是我在此期间使用上面提到的DavidMuller库和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())
Run Code Online (Sandbox Code Playgroud)

希望这能节省一些时间.


b.b*_*4rd 9

虽然其他答案非常好,但我想消除对外部包的使用。显然,botocore它本身具有签署请求所需的所有功能,只需查看源代码即可。这就是我直接发送 AWS API 请求的结果(为了演示目的,事情是硬编码的):

      import boto3
      import botocore.credentials
      from botocore.awsrequest import AWSRequest
      from botocore.endpoint import URLLib3Session
      from botocore.auth import SigV4Auth

      params = '{"name": "hello"}'
      headers = {
        'Host': 'ram.ap-southeast-2.amazonaws.com',
      }
      request = AWSRequest(method="POST", url="https://ram.ap-southeast-2.amazonaws.com/createresourceshare", data=params, headers=headers)
      SigV4Auth(boto3.Session().get_credentials(), "ram", "ap-southeast-2").add_auth(request)    


      session = URLLib3Session()
      r = session.send(request.prepare())
Run Code Online (Sandbox Code Playgroud)

  • “BotocoreHTTPSession”会在最新版本的“boto3”(撰写本文时为 1.9.42)上导致“ImportError”。将该行更改为以下内容可以解决我的错误:“from botocore.httpsession import URLLib3Session” (3认同)

gar*_*aat 8

请求库有几个Python扩展,它们将为您执行SigV4签名.我用过这个,效果很好.