web-dev-qa-db-ja.com

Python)でAWSElasticsearchに署名されたHTTPリクエストを作成する

単純なPython Elasticsearchデータベースのスナップショットを作成するLambdaを作成しようとしています。これは ElasticsearchのREST API 単純なHTTPリクエストを使用します。

ただし、AWSの場合、これらのリクエストに署名する必要があります。おそらくboto3を使用して、generate_presigned_urlの低レベルクライアントを介して実現できると感じていますが、この関数を正しく呼び出す方法を一生理解することはできません。たとえば、有効なClientMethodsは何ですか? ESHttpGetを試しましたが、役に立ちませんでした。

誰かが私を正しい方向に向けることができますか?

9
Alec

SigV4署名を実行するリクエストライブラリにはいくつかのPython拡張機能があります。私は これ を使用しましたが、うまく機能します。

8
garnaat

私はしばらくの間、同じようなことをするのに苦労しました。現在、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())

これが誰かの時間を節約することを願っています。

12
Alex Rudd

最近公開した requests-aws-sign は、PythonリクエストライブラリのAWSV4リクエスト署名を提供します。

このコード を見ると、Botocoreを使用してV4リクエストの署名を生成する方法がわかります。

4
mixja

他の答えはまったく問題ありませんが、外部パッケージの使用を排除したかったのです。明らかに、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())
3
b.b3rn4rd