2016-07-01 17 views
6

私はElasticsearchデータベースのスナップショットを作成する単純なPython Lambdaを作ろうとしています。これは、単純なHTTP要求を使用してElasticsearch's REST APIによって行われます。PythonでAWS Elasticsearchに署名されたHTTPリクエストを作成

ただし、AWSの場合は、これらのリクエストに署名する必要があります。私はそれがの低レベルのクライアントを介しておそらくgenerate_presigned_urlで達成できると感じていますが、私はこの機能を正しく呼び出す方法を理解できません。たとえば、有効なClientMethodは何ですか?私はESHttpGetを試しましたが、無駄です。

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

+0

掘り出し物がありました。 'generate_presigned_url'が行く方法だとは思わないでください。私は私に利用可能な操作は、高度なES操作がドキュメントに記載されていると思う:http://boto3.readthedocs.io/en/latest/reference/services/es.html#ElasticsearchService.Client.generate_presigned_url – Alec

答えて

5

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

+0

ええ、私は'boto3'と' botocore'だけにしたいと思っていましたが、 'boto'の' AWSAuthConnection'を使って巻き終えました。 – Alec

3

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

this codeを見ると、Botocoreを使ってV4リクエストの署名を生成する方法がわかります。

6

私はしばらくの間苦労して同様のことをしました。現在のところ、boto3ライブラリは署名されたesリクエストの作成をサポートしていませんが、私はraised an issueが機能要求になっています。

は、ここで私は私のSTSセッションの資格を取得するには、上記とboto3言及DavidMuller's libraryを使用して、その間に何をやったかです:

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()) 

・ホープこれは誰かいくつかの時間を節約できます。

+0

'boto3.Session()'が私のために働いていました。 – Hexy

関連する問題