2016-07-01 14 views
6

Próbuję utworzyć prostą Lambdę w języku Python, która tworzy migawki z naszej bazy danych Elasticsearch. Odbywa się to poprzez Elasticsearch's REST API przy użyciu prostych żądań HTTP.Wykonywanie podpisanego żądania HTTP do AWS Elasticsearch w Pythonie

Jednak w przypadku AWS muszę podpisać te prośby. Mam wrażenie, że można to osiągnąć przez niskopoziomowych klientów z boto3 prawdopodobnie z generate_presigned_url, ale nie mogę na całe życie dowiedzieć się, jak prawidłowo wywołać tę funkcję. Na przykład, jakie są ważne s? ClientMethod s? Próbowałem ESHttpGet, ale bezskutecznie.

Czy ktoś może wskazać mi właściwy kierunek?

+0

Dobrze, że zrobiłem kopanie. Nie myśl, że "generate_presigned_url" jest drogą do zrobienia. Myślę, że jedyne dostępne operacje to operacje na wysokim poziomie wymienione w dokumentach: http://boto3.readthedocs.io/en/latest/reference/services/es.html#ElasticsearchService.Client.generate_presigned_url – Alec

Odpowiedz

5

Istnieje kilka rozszerzeń Python do biblioteki żądań, które wykonają podpis SigV4 dla Ciebie. Użyłem this one i działa dobrze.

+0

Tak, ja "Mam nadzieję, że zatrzymam go tylko na' boto3' i 'botocore', ale skończyłem używając' AWSAuthConnection' w 'boto' - wydaje się, że to wystarczy. – Alec

3

Niedawno opublikowałem requests-aws-sign, która zapewnia podpisywanie żądań AWS V4 dla biblioteki żądań Pythona.

Jeśli spojrzysz na this code zobaczysz, jak możesz użyć Botocore do wygenerowania podpisu na żądanie V4.

6

Przez chwilę walczyłem, aby zrobić coś podobnego. Obecnie biblioteka boto3 nie obsługuje tworzenia podpisanych żądań es, ale od I raised an issue z nimi stała się prośbą o funkcję.

Oto co zrobiłem w międzyczasie używając DavidMuller's library wspomniano powyżej boto3 aby moje STS poświadczeń sesji:

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

Nadzieja ta oszczędza komuś trochę czasu.

+0

'boto3.Session()' pracował dla mnie. – Hexy