अजगर में AWS लैंबडा आयात मॉड्यूल त्रुटि


92

मैं एक एडब्ल्यूएस लैंबडा अजगर तैनाती पैकेज बना रहा हूं। मैं एक बाहरी निर्भरता अनुरोधों का उपयोग कर रहा हूं। मैंने 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

कृपया त्रुटि को डीबग करने में मेरी सहायता करें।


क्या यह आपका पूरा कोड है? त्रुटि से ऐसा लगता है कि कुछ ऐसा करना चाहते हैं import lambda_functionजो नहीं मिला है। शायद आप चाहते हैं from future import lambda_function? या बस cmd लाइन पर lambda_function स्थापित करें।
Berci

@Berci Am इस पायथन कोडिन AWS प्लेटफ़ॉर्म को चला रहा है। मैं पाइप का उपयोग नहीं कर सकता। कहीं भी मेरे कोड में lambda_function का उपयोग किया जाता है। अगर मैं AWS कंसोल में समान कोड पेस्ट करता हूं तो यह काम करेगा
Nithin K Anil

इस धागे पर अंतिम टिप्पणी देखें - शायद आप पर लागू होती है?
kwinkunks

@kwinkunks मैंने कोशिश की। वास्तव में निर्देशिका नहीं सामग्री zipping हूँ !!
नितिन के अनिल

2
मेरा अनुमान है कि आपके फ़ंक्शन में "हैंडलर" विकल्प गलत है। जाँच करें कि आपका फ़ाइल नाम "lambda_function.py" और हैंडलर विधि "lambda_handler" है
Vor

जवाबों:


110

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

कृपया स्नैपशॉट के नीचे खोजें। यहाँ छवि विवरण दर्ज करें


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

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

इसलिए मैंने अपने कोड को "lambda_function.py" नाम दिया, क्या मुझे हैंडलर का नाम Python_lambda_function.lambda_handler के रूप में देना चाहिए?
RB17

@RahulBanerjee नहीं। आप इसे लंबदा_फंक्शन के रूप में कहेंगे। लंबोदर_हैंडलर
दिनेश

90

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


2
जब zipping, सुनिश्चित करें कि आप -r ध्वज का उपयोग कर रहे हैं!
राबर्ट स्मिथ

@ 2ank3th आप सबसे अच्छे हैं
सेथुरमन श्रीनिवासन

इसके लिए धन्यवाद।
जेम्सजी

24

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

मैंने इसे जिप करने से पहले अजगर फ़ाइल पर निम्न भाग दिया और यह ठीक काम किया।

chmod u=rwx,go=r

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

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

15

मुझे नितिन का जवाब बहुत मददगार लगा। यहाँ एक विशिष्ट चलना है:

इन मूल्यों को देखें:

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

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


11

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

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

परेशानी से मुक्त अजगर लैम्ब्डा तैनाती [ट्यूटोरियल + स्क्रिप्ट]


2
महान पोस्ट लेकिन मुझे सबसे कठिन हिस्से पर विवरण याद आता है जो देशी कामों को पैकेज करना है। यह वास्तव में सामान्य नहीं है कि यह कितना जटिल है
JohnAndrews

10

यहाँ के माध्यम से एक त्वरित कदम है।

मान लें कि आपके पास एक फ़ोल्डर है deploy, जिसमें कॉल के अंदर आपकी लैम्ब्डा फ़ाइल है lambda_function.py। मान लेते हैं कि यह फ़ाइल कुछ इस तरह दिखती है। ( p1और p2तीसरे पक्ष के पैकेज का प्रतिनिधित्व करते हैं।)

import p1
import p2

def lambda_handler(event, context):
    # more code here

    return {
        "status": 200,
        "body" : "Hello from Lambda!",
    }

प्रत्येक तृतीय-पक्ष निर्भरता के लिए, आपको फ़ोल्डर के pip install <third-party-package> --target .भीतर से इसकी आवश्यकता है deploy

pip install p1 --target .
pip install p2 --target .

एक बार जब आप यह कर लेते हैं, तो यहां आपकी संरचना कैसी दिखनी चाहिए।

deploy/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

अंत में, आपको फ़ोल्डर के zipभीतर सभी सामग्रियों deployको एक संपीड़ित फ़ाइल की आवश्यकता है। एक मैक या लिनक्स पर, फोल्डर के zip -r ../deploy.zip *भीतर से कमांड deployदिखेगी। ध्यान दें कि -rझंडा पुनरावर्ती सबफ़ोल्डर्स के लिए है।

फ़ाइल ज़िप फ़ाइल की संरचना को मूल फ़ोल्डर को दर्पण करना चाहिए।

deploy.zip/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

ज़िप फ़ाइल अपलोड करें और <file_name>.<function_name>अपनी प्रक्रिया में प्रवेश करने के लिए लैम्ब्डा निर्दिष्ट करें , जैसे कि lambda_function.lambda_handlerऊपर दिए गए उदाहरण के लिए।


1
इसके अतिरिक्त, पूरे फ़ोल्डर को ज़िप न करें zip -r deploy.zip deploy। यह ज़िप फ़ाइल के भीतर एक तैनाती फ़ोल्डर बनाएगा।
ओपनवॉक

8

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


7

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

zipकमांड का प्रयोग करें , त्रुटि को ठीक करें:

zip -r ../lambda.zip ./*

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

4

में lambda_handler प्रारूप में होना चाहिए lambda_filename.lambda_functionName। मान लें कि आप lambda_handlerफ़ंक्शन चलाना चाहते हैं और यह अंदर है lambda_fuction.py, तो आपका हैंडलर प्रारूप है lambda_function.lambda_handler

इस त्रुटि को प्राप्त करने का एक अन्य कारण मॉड्यूल निर्भरता है।

आपका lambda_fuction.pyज़िप फ़ाइल के रूट डायरेक्टरी में होना चाहिए।


2

@nithin, AWS ने फ़ंक्शंस के layersअंदर अवधारणा जारी की Lambda। आप अपनी परत बना सकते हैं और वहां आप पुस्तकालयों के रूप में ज्यादा से ज्यादा अपलोड कर सकते हैं और फिर आप लेम्बडा कार्यों के साथ परत को जोड़ सकते हैं। अधिक जानकारी के लिए: https://docs.aws.amazon.com/lambda/latest/dg/configuration-lay.html.html


1

मैं एक ही मुद्दे में भाग गया, अगर मैं गलत नहीं हूं तो यह lynda.com पर एक ट्यूटोरियल के भाग के रूप में एक अभ्यास था। मैंने जो गलती की वह पायथन 3.6 के रूप में रनटाइम का चयन नहीं कर रही थी जो कि लैमडा फंक्शन कंसोल में एक विकल्प है।


1

2019 का दृष्टिकोण:

AWS लैंबडा अब Python 3.7 का समर्थन करता है, जिसे बहुत से लोग (स्वयं सहित) इनलाइन लैम्ब्डा के रनटाइम के रूप में उपयोग करने के लिए चुनते हैं।

फिर मुझे एक बाहरी निर्भरता का आयात करना पड़ा और मैंने ओडब्ल्यू के रूप में एडब्ल्यूएस डॉक्स का पालन किया। (स्थानीय स्थापित -> ज़िप -> अपलोड)।

मेरे पास आयात मॉड्यूल त्रुटि थी और मुझे एहसास हुआ कि मेरे स्थानीय पीसी में डिफ़ॉल्ट पायथन के रूप में पायथन 2.7 था। जब मैंने पाइप लगाया, तो उसने पायथन 2.7 के लिए मेरी निर्भरता को स्थापित किया।

इसलिए मैंने स्थानीय रूप से पायथन संस्करण पर स्विच किया जो लैम्ब्डा कंसोल में चयनित रनटाइम संस्करण से मेल खाता है और फिर बाहरी निर्भरता को फिर से स्थापित किया है। इससे मेरे लिए समस्या हल हो गई। उदाहरण के लिए:

$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>

1

यहाँ मुद्दा यह है कि आपके लैम्ब्डा फ़ंक्शन निर्भरता (अपनी मशीन पर) बनाने के लिए उपयोग किया जाने वाला पायथन संस्करण आपके लैम्ब्डा फ़ंक्शन के लिए चयनित पायथन संस्करण से अलग है। यह मामला विशेष रूप से सामान्य है अगर नेम्पी लाइब्रेरी आपके आश्रितों का हिस्सा है।

उदाहरण: आपकी मशीन का अजगर संस्करण: 3.6 ---> लेम्ब्डा अजगर संस्करण 3.6


0

आपको सभी आवश्यकताओं को ज़िप करने की आवश्यकता है, इस स्क्रिप्ट का उपयोग करें

#!/usr/bin/env bash
rm package.zip
mkdir package
pip install -r requirements.txt --target package
cat $1 > package/lambda_function.py
cd package
zip -r9 "../package.zip" .
cd ..
rm -rf package

साथ उपयोग:

package.sh <python_file>

0

उसी मुद्दे के लिए मेरे समाधान को साझा करना, बस मामले में यह किसी को भी मदद करता है।

समस्या: मुझे त्रुटि मिली: "[ERROR] Runtime.ImportModuleError: AWS-big-data-blog कोड [1] को AWS आर्टिकल [2] में प्रदान करते समय मॉड्यूल 'lambda_function':" StringIO "नामक कोई मॉड्यूल आयात करने में असमर्थ।

समाधान: पाइथन 3.7 से पाइथन 2.7 तक परिवर्तित रनटाइम

[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https: // एडब्ल्यूएस .amazon.com / ब्लॉग / बड़े डेटा / विश्लेषण-VPC-प्रवाह लॉग-साथ-अमेज़न-Kinesis-firehose-अमेज़न-एथेना और अमेज़न-quicksight /


यह मेरे लिए दूसरा तरीका था (2.7 -> 3.8)
राक्षसीन

0

आप परतों के रूप में अतिरिक्त कोड और सामग्री में खींचने के लिए अपने लैम्ब्डा फ़ंक्शन को कॉन्फ़िगर कर सकते हैं। एक परत एक ज़िप संग्रह है जिसमें पुस्तकालय, एक कस्टम रनटाइम या अन्य निर्भरताएं होती हैं। परतों के साथ, आप उन्हें अपने तैनाती पैकेज में शामिल करने की आवश्यकता के बिना अपने फ़ंक्शन में पुस्तकालयों का उपयोग कर सकते हैं। परतें आपको अपने तैनाती पैकेज को छोटा रखने देती हैं, जिससे विकास आसान हो जाता है।

संदर्भ: -

  1. https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
  2. https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17

0

सुनिश्चित करें कि आप एक फ़ोल्डर संरचना में सभी निर्भरताओं को अजगर / [आपकी सभी निर्भरता] के रूप में जोड़ रहे हैं इस प्रलेखन के अनुसार काम करने के लिए।

https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path


0

मेरी समस्या यह थी कि .py फ़ाइल और निर्भरताएँ ज़िप की "रूट" निर्देशिका में नहीं थीं। उदाहरण के लिए पुस्तकालयों और लैम्ब्डा फ़ंक्शन का मार्ग .py होना चाहिए:

<lambda_function_name>.py
<name of library>/foo/bar/

नहीं

/foo/bar/<name of library>/foo2/bar2

उदाहरण के लिए:

drwxr-xr-x  3.0 unx        0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/
-rw-r--r--  3.0 unx      192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc
-rw-r--r--  3.0 unx      758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc
-rw-r--r--  3.0 unx      965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc
-rw-r--r--  3.0 unx     7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py

0

वास्तव में मुख्य फ़ोल्डर (परिनियोजन पैकेज) पर जाएं जिसे आप ज़िप करना चाहते हैं,

उस फ़ोल्डर के अंदर सभी फ़ाइलों का चयन करें और फिर ज़िप बनाएं और उस ज़िप को अपलोड करें


0

कृपया नीचे एक के बाद एक जोड़ें Import requests

import boto3

जो मैं देख सकता हूं वह आपके कोड में गायब है।


-1

कोई गड़बड़ करने की जरूरत नहीं है।

पायथन-लैम्ब्डा का उपयोग करें

https://github.com/nficano/python-lambda

एकल आदेश के साथ pylambda deploy यह स्वचालित रूप से आपके फ़ंक्शन को तैनात करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.