2016-02-11 16 views
35

मैं एक एडब्ल्यूएस लैम्ब्डा पायथन परिनियोजन पैकेज बना रहा हूं। मैं एक बाहरी निर्भरता अनुरोध का उपयोग कर रहा हूँ। मैंने AWS दस्तावेज़ http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html का उपयोग कर बाहरी निर्भरता स्थापित की। नीचे मेरा पायथन कोड है।एडब्ल्यूएस लैम्ब्डा आयात मॉड्यूल त्रुटि पायथन

import requests 

print('Loading function') 

s3 = boto3.client('s3') 


def lambda_handler(event, context): 
    #print("Received event: " + json.dumps(event, indent=2)) 

    # Get the object from the event and show its content type 
    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8') 
    try: 
     response = s3.get_object(Bucket=bucket, Key=key) 
     s3.download_file(bucket,key, '/tmp/data.txt') 
     lines = [line.rstrip('\n') for line in open('/tmp/data.txt')] 
     for line in lines: 
      col=line.split(',') 
      print(col[5],col[6]) 
     print("CONTENT TYPE: " + response['ContentType']) 
     return response['ContentType'] 
    except Exception as e: 
     print(e) 
     print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
     raise e 

पिन परियोजना-निर्देशिका निर्देशिका की सामग्री को बनाया गया और लैम्ब्डा पर अपलोड (निर्देशिका सामग्री, नहीं निर्देशिका पिन)। जब मैं फ़ंक्शन निष्पादित करता हूं तो मुझे नीचे उल्लिखित त्रुटि मिल रही है।

START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST 
**Unable to import module 'lambda_function': No module named lambda_function** 

END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Duration: 19.63 ms Billed Duration: 100 ms  Memory Size: 128 MB Max Memory Used: 9 MB 

कृपया मुझे त्रुटि डिबग करने के लिए मदद करते हैं।

+0

अपना पूरा कोड है:

त्रुटि zip आदेश का उपयोग करें, ठीक? त्रुटि से ऐसा लगता है कि कहीं कुछ 'lambda_function' आयात करना चाहता है जो नहीं मिला है। शायद आप भविष्य में आयात lambda_function' से चाहते हैं? या बस * पाइप cmd लाइन पर lambda_function * स्थापित करें। – Berci

+0

@ बेर्सी एम इस पायथन कोडिन एडब्ल्यूएस मंच चला रहा है। मैं पाइप का उपयोग नहीं कर सकता। मेरे कोड में कहीं भी lambda_function का उपयोग कर रहा हूँ। अगर मैं एडब्ल्यूएस कंसोल में एक ही कोड पेस्ट करता हूं तो यह –

+0

काम करेगा [इस धागे] पर अंतिम टिप्पणी देखें (https://gist.github.com/kapilt/770bdf5d2a55b7385a9c) - शायद आप पर लागू होता है? – kwinkunks

उत्तर

50

त्रुटि लैम्ब्डा फ़ंक्शन के फ़ाइल नाम के कारण थी। लैम्ब्डा फ़ंक्शन बनाने के दौरान यह लैम्ब्डा फ़ंक्शन हैंडलर से पूछेगा। आपको इसे Python_File_Name.Method_Name के रूप में नामित करना होगा। इस परिदृश्य में मैंने इसे lambda.lambda_handler नाम दिया (lambda.py फ़ाइल का नाम है)।

कृपया स्नैपशॉट के नीचे खोजें। enter image description here

+1

मेरा कोड लैम्बडा में कोड के रूप में है - फाइल के रूप में नहीं। –

+0

@ बेनहेलर: भले ही यह इनलाइन कोड है, यह एक फ़ाइल है जिसे आप वास्तव में लिखते हैं। आप खिड़की के बाईं ओर फ़ाइल नाम और पूरी निर्देशिका संरचना देख सकते हैं। – Vineeth

10

मुझे निथिन का जवाब बहुत उपयोगी पाया गया।

देखो-अप इन मूल्यों:

  1. अपने अजगर स्क्रिप्ट में lambda_handler समारोह के नाम पर यहाँ एक विशिष्ट चलना माध्यम से है। एडब्ल्यूएस उदाहरणों में उपयोग किया जाने वाला नाम "lambda_handler" है जो "def lambda_handler (ईवेंट, संदर्भ)" जैसा दिखता है। इस मामले में, मान "lambda_handler"
  2. लैम्ब्डा डैशबोर्ड में, फ़ंक्शन में दिखाए गए "कॉन्फ़िगरेशन" अनुभाग में "हैंडलर" टेक्स्ट-बॉक्स में हैंडलर का नाम ढूंढें (दिखाया गया है निथिन का स्क्रीनशॉट)। मेरा डिफ़ॉल्ट नाम "lambda_function.lambda_handler" था।
  3. आपकी पायथन लिपि का नाम। मान लें कि यह "cool.py" है

इन मूल्यों के साथ करते हैं, तो आप हैंडलर (स्क्रीनशॉट में दिखाया गया) करने के लिए "cool.lambda_handler" का नाम बदलने की आवश्यकता होगी। "मॉड्यूल आयात करने में असमर्थ" lambda_function '"त्रुटि संदेश से छुटकारा पाने का यह एक तरीका है। यदि आप अपनी पाइथन लिपि में हैंडलर का नाम "सुपर" में बदलना चाहते हैं तो आपको लैम्ब्डा डैशबोर्ड में हैंडलर को "cool.sup"

+0

मेरा कोड लैम्बडा में कोड के रूप में है - फाइल के रूप में नहीं। –

17

इस समस्या का एक अन्य स्रोत फ़ाइल पर अनुमति है ज़िपित है यह होना चाहिए कम से कम विश्वव्यापी पठनीय होना चाहिए। (न्यूनतम chmod 444)

मैंने इसे ज़िप करने से पहले पायथन फ़ाइल पर निम्नलिखित चलाया और यह ठीक काम किया।

chmod u=rwx,go=r 
+4

यह। मैं पाइथन की ज़िपफाइल का उपयोग प्रोग्राम में लैम्बडा फ़ंक्शंस को ज़िप में पैकेज करने के लिए कर रहा था, यह '0600' होने के लिए डिफ़ॉल्ट है जैसा कि आप उल्लेख करते हैं पर्याप्त नहीं है। इसके अलावा, एकीकृत लैम्ब्डा स्रोत कोड संपादक (अमेज़ॅन वेब पेज पर) अनुमतियों की चेतावनी के बिना फ़ाइल को खुशी से पढ़ेगा। – cjhanks

+1

दूसरा। मैंने इसे यहां दिखाए गए विधि का उपयोग करके फ़ाइल अनुमतियों को सेट करके काम किया है: http://stackoverflow.com/a/434689/931277 – dokkaebi

4

सिर्फ इतने सारे gotchas जब (अजगर के लिए) एडब्ल्यूएस लैम्ब्डा के लिए तैनाती संकुल बनाने हैं। मैंने डिबगिंग सत्रों पर घंटों और घंटों बिताए हैं जब तक कि मुझे कोई सूत्र नहीं मिलता जो शायद ही कभी विफल हो जाता है।

मैंने एक ऐसी स्क्रिप्ट बनाई है जो पूरी प्रक्रिया को स्वचालित करती है और इसलिए इसे कम त्रुटि प्रवण बनाती है। मैंने ट्यूटोरियल भी लिखा है जो बताता है कि सब कुछ कैसे काम करता है।आप इसे बाहर की जाँच कर सकते हैं:

Hassle-Free Python Lambda Deployment [Tutorial + Script]

10

आप एक ज़िप फ़ाइल अपलोड कर रहे हैं। सुनिश्चित करें कि आप निर्देशिका की सामग्री को ज़िप कर रहे हैं न कि निर्देशिका स्वयं।

1

मुझे ऊपर दिए गए सभी समाधानों को आजमाने के बाद यह कठिन तरीका मिला। यदि आप ज़िप फ़ाइल में उप-निर्देशिकाओं का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप प्रत्येक उप-निर्देशिका में __init__.py फ़ाइल शामिल करें और यह मेरे लिए काम करता है।

2

मुझे भी त्रुटि थी। यह बताएं कि मेरी ज़िप फ़ाइल में कोड पैरेंट फ़ोल्डर शामिल है। जब मैं unzip और ज़िप फ़ाइल का निरीक्षण करता हूं, तो lambda_function फ़ाइल मूल फ़ोल्डर ./lambda के अंतर्गत है।

zip -r ../lambda.zip ./* 
+0

अपने कोड फ़ोल्डर के अंदर ज़िप चलाएं। मेरा मामला यहाँ, सीडी lambda && zip -r ../lambda.zip ./* – Joe

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