単純なPython Elasticsearchデータベースのスナップショットを作成するLambdaを作成しようとしています。これは ElasticsearchのREST API 単純なHTTPリクエストを使用します。
ただし、AWSの場合、これらのリクエストに署名する必要があります。おそらくboto3
を使用して、generate_presigned_url
の低レベルクライアントを介して実現できると感じていますが、この関数を正しく呼び出す方法を一生理解することはできません。たとえば、有効なClientMethod
sは何ですか? ESHttpGet
を試しましたが、役に立ちませんでした。
誰かが私を正しい方向に向けることができますか?
SigV4署名を実行するリクエストライブラリにはいくつかのPython拡張機能があります。私は これ を使用しましたが、うまく機能します。
私はしばらくの間、同じようなことをするのに苦労しました。現在、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())
これが誰かの時間を節約することを願っています。
最近公開した requests-aws-sign は、PythonリクエストライブラリのAWSV4リクエスト署名を提供します。
このコード を見ると、Botocoreを使用してV4リクエストの署名を生成する方法がわかります。
他の答えはまったく問題ありませんが、外部パッケージの使用を排除したかったのです。明らかに、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())