我正在尝试制作一个简单的 Python Lambda 来制作我们的 Elasticsearch 数据库的快照。这是通过 Elasticsearch's REST API 完成的使用简单的 HTTP 请求。
但是,对于 AWS,我必须签署这些请求。我觉得它可以通过 boto3
的低级客户端可能使用 generate_presigned_url
来实现,但我终究无法弄清楚如何正确调用此功能.例如,什么是有效的 ClientMethod
?我试过 ESHttpGet
但无济于事。
谁能指出我正确的方向?
最佳答案
编辑:显然这个变通办法已经broken by Elastic .
为了做类似的事情,我挣扎了一段时间。目前 boto3 库不支持发出签名的 es 请求,尽管自从我 raised an issue对他们来说,这变成了一个功能请求。
这是我同时使用 DavidMuller's library 所做的事情上面提到的和 boto3 获取我的 STS session 凭据:
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())
希望这可以节省一些时间。
关于python-2.7 - 在 Python 中向 AWS Elasticsearch 发出签名的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38144273/