2016-07-01 4 views
6

में एडब्ल्यूएस लोचदार खोज के लिए एक हस्ताक्षरित HTTP अनुरोध करना मैं एक साधारण पायथन लैम्ब्डा बनाने की कोशिश कर रहा हूं जो हमारे लोचदार खोज डेटाबेस के स्नैपशॉट बनाता है। यह सरल HTTP अनुरोधों का उपयोग कर Elasticsearch's REST API के माध्यम से किया जाता है।पायथन

हालांकि, एडब्ल्यूएस के लिए, मुझे इन अनुरोधों पर हस्ताक्षर करना होगा। मुझे लगता है कि यह boto3 के निम्न स्तर के क्लाइंट के माध्यम से generate_presigned_url के साथ प्राप्त किया जा सकता है, लेकिन मैं अपने जीवन के लिए यह नहीं समझ सकता कि इस कार्य को सही तरीके से कैसे बुलाया जाए। उदाहरण के लिए, मान्य ClientMethod एस क्या हैं? मैंने ESHttpGet का प्रयास किया है लेकिन इसका कोई फायदा नहीं हुआ है।

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

+0

ठीक कुछ खोदने लगा। ऐसा नहीं लगता कि 'gener_presigned_url' जाने का तरीका है। मुझे लगता है कि मेरे लिए उपलब्ध एकमात्र ऑपरेशन डॉक्स में सूचीबद्ध उच्च स्तरीय ईएस ऑपरेशंस हैं: http://boto3.readthedocs.io/en/latest/reference/services/es.html#ElasticsearchService.Client.generate_presigned_url – Alec

उत्तर

5

अनुरोध पुस्तकालय में कई पायथन एक्सटेंशन हैं जो आपके लिए SigV4 हस्ताक्षर करेंगे। मैंने this one का उपयोग किया है और यह अच्छी तरह से काम करता है।

+0

हाँ, मैं 'इसे' boto3' और 'botocore' पर रखने की उम्मीद कर रहा था, लेकिन मैंने 'boto' में 'AWSAuthConnection' का उपयोग करके घायल हो गया है - यह चाल चल रहा है। – Alec

3

मैंने हाल ही में requests-aws-sign प्रकाशित किया है, जो पाइथन अनुरोध पुस्तकालय के लिए एडब्ल्यूएस वी 4 अनुरोध हस्ताक्षर प्रदान करता है।

यदि आप this code पर देखते हैं तो आप देखेंगे कि आप V4 अनुरोध हस्ताक्षर उत्पन्न करने के लिए Botocore का उपयोग कैसे कर सकते हैं।

6

मैं एक ही काम करने के लिए थोड़ी देर के लिए संघर्ष कर रहा था। वर्तमान में boto3 लाइब्रेरी हस्ताक्षरित ई अनुरोध बनाने का समर्थन नहीं करती है, हालांकि मैं उनके साथ raised an issue यह सुविधा अनुरोध बन गया हूं।

यहाँ है कि मैं क्या DavidMuller's library ऊपर और boto3 उल्लेख मेरी एसटीएस सत्र साख पाने के लिए का उपयोग कर इस बीच में किया गया है:

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