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)
希望这能节省一些时间.
虽然其他答案非常好,但我想消除对外部包的使用。显然,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)
归档时间: |
|
查看次数: |
7658 次 |
最近记录: |