मॉड्यूल 'lambda_function' आयात करने में असमर्थ: नाम का कोई मॉड्यूल *

Oct 12 2020

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

{
  "errorMessage": "Unable to import module 'lambda_function': No module named '*'",
  "errorType": "Runtime.ImportModuleError"
}

मैंने इन निर्देशों का पालन किया: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies जिसने मुझे यह सुनिश्चित करने के लिए कहा कि मेरे पैकेज मेरे लैम्ब्डा फ़ंक्शन के लिए स्थानीय निर्देशिका में थे:

~/my-function$ pip install --target ./package Pillow

मैं पिलो का इस्तेमाल नहीं कर रहा हूं। यह उनकी साइट से नमूना कोड है। न ही मैं एक पैकेज का उपयोग कर रहा हूं जिसे आप पहले से ही लैंबडा पर एक्सेस कर सकते हैं। यह एक है जो मुझे जीथब से मिला है और मुझे अपने ऐप को संलग्न करने की आवश्यकता है।

पहले तो यह काम नहीं किया, इसलिए मैंने एक setup.cfgफ़ाइल बनाई और उसमें जोड़ा:

[install]
prefix= 

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

जब मैं डायरेक्टरी में जाता हूं, तो पैकेज होता है।

मुझे तब यह उत्तर मिला: https://stackoverflow.com/a/12493244/5675125 जो सुझाव दिया कि शायद कुछ छिपी हुई फ़ाइलों को शामिल नहीं किया जा रहा था और यह है कि मुझे उन्हें कैसे ज़िप करना चाहिए।

फिर से वही त्रुटि।

मुझे यह पहचानने के लिए लैम्बडा कैसे मिलता है कि मेरा पैकेज है।

जवाब

1 Marcin Oct 12 2020 at 10:28

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

उदाहरण के लिए, us-east-1पायथन 3.7 के लिए जोड़ी गई परत होगी:

अपडेट करें

मैंने अभी कस्टम लेयर बनाया है instabotऔर यह पुष्टि कर सकता है कि यह काम करता है।

उपयोग की गई तकनीक में हाल ही में AWS ब्लॉग में वर्णित डॉकटर टूल शामिल हैं :

  • मैं डोकर के साथ नकली लैम्ब्डा वातावरण का उपयोग करके एक लैम्ब्डा परत कैसे बना सकता हूं?

इस प्रकार इस प्रश्न के लिए, मैंने इसे इस प्रकार सत्यापित किया :

  1. उदाहरण के लिए, खाली फ़ोल्डर बनाएँ mylayer।

  2. फ़ोल्डर में जाएं और requirements.txtसामग्री के साथ फाइल बनाएं

instabot
  1. निम्नलिखित डॉकटर कमांड चलाएँ:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. सुन्न निकालें

instabotकी आवश्यकता है numpyजो बहुत बड़ा है। तो हम एक परत बनाने से पहले, इसे मैन्युअल रूप से हटा देते हैं। हम numpyइसके बजाय AWS द्वारा प्रदान की गई परत का उपयोग करने जा रहे हैं ।

sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*

यदि हम सुन्न नहीं हटाते हैं, तो परत> 50 एमबी होगी।

  1. ज़िप के रूप में परत बनाएँ:
zip -9 -r mylayer.zip python 
  1. mylayer.zipAWS कंसोल पर आधारित लैम्ब्डा लेयर बनाएं । निर्दिष्ट Compatible runtimesकरने के लिए मत भूलना python3.8।

  2. अपने कार्य में दो परतें जोड़ें:

पहले एक को AWSLambda-Python38-SciPy1xAWS द्वारा सुन्न के साथ प्रदान किया गया है, जबकि दूसरा वह है जिसे हमने ऊपर बनाया है। तो आपका फ़ंक्शन दो परतों का उपयोग करेगा।

  1. निम्न लैम्ब्डा फ़ंक्शन का उपयोग करके लैम्ब्डा में परत का परीक्षण करें:
import json

from instabot import Bot

def lambda_handler(event, context):
    # TODO implement
    
    bot = Bot(base_path='/tmp')
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }