2015-11-07 7 views
10

साथ प्राधिकरण तंत्र इनलाइन कॉन्फ़िगर करने के लिए मैं एडब्ल्यूएस लैम्ब्डा में boto3 उपयोग कर रहा हूँ एस 3 में वस्तु फ्रैंकफर्ट क्षेत्र में स्थित fecth करने के लिए।कैसे boto3

v4 आवश्यक है। अन्यथा निम्न त्रुटि signature_version कॉन्फ़िगर करने के लिए http://boto3.readthedocs.org/en/latest/guide/configuration.html

"errorMessage": "An error occurred (InvalidRequest) when calling 
the GetObject operation: The authorization mechanism you have 
provided is not supported. Please use AWS4-HMAC-SHA256." 

एहसास तरीके वापस आ जाएगी लेकिन चूंकि मैं एडब्ल्यूएस लैम्ब्डा उपयोग कर रहा हूँ, मैं अंतर्निहित विन्यास के लिए उपयोग प्रोफाइल

मेरी एडब्ल्यूएस लैम्ब्डा समारोह के कोड की जरूरत नहीं है

from __future__ import print_function 
import boto3 


def lambda_handler (event, context): 
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"] 
    input_file_key = event["Records"][0]["s3"]["object"]["key"] 
    input_file_name = input_file_bucket+"/"+input_file_key 

    s3=boto3.resource("s3") 
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key) 
    response = obj.get() 
    return event #echo first key valuesdf 

कि इस कोड के भीतर signature_version कॉन्फ़िगर करने के लिए संभव है? उदाहरण के लिए सत्र का उपयोग करें। या इस पर कोई कामकाज है? डिफ़ॉल्ट सत्र का उपयोग करने का

उत्तर

16

इसके बजाय, boto3.session

import boto3 
import boto3.session 
session = boto3.session.Session(region_name='eu-central-1') 
s3client = session.client('s3', config= boto3.session.Config(signature_version='s3v4')) 
s3client.get_object(Bucket='<Bkt-Name>', Key='S3-Object-Key') 
+0

वहाँ एक फ़ाइल से कॉन्फ़िगर करने के लिए कोई तरीका है? मैं पूछ रहा हूं क्योंकि मैं कोड का एक टुकड़ा उपयोग कर रहा हूं जहां 'boto3' निर्भरता है, इसलिए मुझे 'क्लाइंट()' कॉल बदलने के लिए प्रत्यक्ष पहुंच नहीं है। – bstempi

+0

आप boto3.session.Session (profile_name = 'profile1') सेट कर सकते हैं, जहां प्रोफाइल 1 एडब्ल्यूएस कुंजी, टोकन, वांछित क्षेत्र और अन्य आवश्यक पैराम के साथ .aws/credentials फ़ाइल में परिभाषित प्रोफ़ाइल का नाम है – omuthu

+0

यदि मैं नहीं हूं एडब्ल्यूएस कुंजी का उपयोग करके और मैं इसके बजाय ईसी 2 इंस्टेंस की मेटाडेटा सेवा पर निर्भर हूं? – bstempi

4

मैं सत्र दृष्टिकोण की कोशिश की से कस्टम सत्र और कॉन्फ़िग उपयोग करने का प्रयास है, लेकिन मैं मुद्दों था। इस विधि में बेहतर काम किया है मेरे लिए, अपने लाभ भिन्न हो सकते हैं:

s3 = boto3.resource('s3', config=Config(signature_version='s3v4')) 

आपको यह काम करने के लिए में botocore.client से कॉन्फ़िग आयात करने के लिए की आवश्यकता होगी। बाल्टी (सूची ऑब्जेक्ट्स) का परीक्षण करने के लिए एक कार्यात्मक विधि के लिए नीचे देखें। इसका मतलब यह है कि आप इसे एक ऐसे वातावरण में इस तरह के अमेज़न EC2 या लैम्ब्डा एक IAM भूमिका के साथ के रूप में, जहां अपने प्रमाणीकरण किया जाता है, से चल रहे हैं:

import boto3 
from botocore.client import Config 
from botocore.exceptions import ClientError 

def test_bucket(bucket): 
    print 'testing bucket: ' + bucket 
    try: 
     s3 = boto3.resource('s3', config=Config(signature_version='s3v4')) 
     b = s3.Bucket(bucket) 
     objects = b.objects.all() 

     for obj in objects: 
      print obj.key 
     print 'bucket test SUCCESS' 
    except ClientError as e: 
     print 'Client Error' 
     print e 
     print 'bucket test FAIL' 

यह परीक्षण करने के लिए, बस एक बाल्टी नाम के साथ विधि कॉल। आपकी भूमिका को उचित अनुमति देना होगा।

संबंधित मुद्दे