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

标签 python-2.7 amazon-web-services elasticsearch boto3

我正在尝试制作一个简单的 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/

相关文章:

elasticsearch - Elasticsearch 未返回附近输入日期的记录

google-app-engine - 使用 ndb 获取、修改和放置一批实体的最有效方法

python - 通过 virtualenv 使用脚本时出现 fatal error - python.exe 周围的额外引号

python - 带有 python 2 的 Ubuntu

amazon-web-services - 什么是 AWS 公共(public) IP 限制? (公共(public) IP 不是弹性 IP)

postgresql - 将 RDS Postgres 数据流式传输/逻辑复制到运动的最佳方式

elasticsearch - 模糊化现有的ElasticSearch Java API查询

python - 如何获取小时时间?

php - AWS SSL 安全错误 : [curl] 60: SSL certificate prob. ..:无法获取本地颁发者证书

ruby-on-rails - 使用Tire有条件索引文档进行Elasticsearch