পাইথনে এডাব্লুএস ল্যাম্বদা আমদানি মডিউল ত্রুটি


93

আমি একটি এডাব্লুএস ল্যাম্বদা পাইথন ডিপ্লোয়মেন্ট প্যাকেজ তৈরি করছি। আমি একটি বাহ্যিক নির্ভরতার অনুরোধ ব্যবহার করছি। আমি এডাব্লুএস ডকুমেন্টেশন http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-dep دام-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? অথবা কেবল সেমিডিড লাইনে ল্যাম্বদা_ফঙ্কশনটি ইনস্টল করুন।
বার্সি

@ বার্সি এই পাইথন কোডিন এডাব্লুএস প্ল্যাটফর্মটি চালাচ্ছি। আমি পাইপ ব্যবহার করতে পারি না আমার কোডের যে কোনও জায়গায় ল্যাম্বদা_ফানশন ব্যবহার করছি। যদি আমি একই কোডটি এডাব্লুএস কনসোলে পেস্ট করে তবে এটি কাজ করবে
নিতিন কে অনিল

এই থ্রেডে শেষ মন্তব্যটি দেখুন - সম্ভবত আপনার জন্য প্রযোজ্য?
kwinkunks

@ কেউইঙ্কঙ্কস আমি চেষ্টা করেছিলাম আসলে বিষয়বস্তুটি জিপ করছি ডিরেক্টরিটি নয়!
নিতিন কে অনিল

4
আমার অনুমান যে আপনার ফাংশনে "হ্যান্ডলার" বিকল্পটি ভুল। পরীক্ষা করে দেখুন যে আপনার FILENAME "lambda_function.py" এবং হ্যান্ডলার পদ্ধতি বলা হয় "lambda_handler"
মাস

উত্তর:


110

লাম্বদা ফাংশনের ফাইলের নামের কারণে ত্রুটি হয়েছিল। ল্যাম্বদা ফাংশন তৈরি করার সময় এটি ল্যাম্বদা ফাংশন হ্যান্ডলারের জন্য জিজ্ঞাসা করবে। আপনার নামটি আপনার পাইথন_ফাইলে_নাম.মাথোদ_নাম হিসাবে রাখতে হবে । এই দৃশ্যে আমি এর নাম lambda.lambda_handler (lambda.py ফাইলের নাম) রেখেছি।

স্ন্যাপশটের নীচে সন্ধান করুন। এখানে চিত্র বর্ণনা লিখুন


4
আমার কোডটি কেবল ল্যাম্বডায় কোড হিসাবে - কোনও ফাইল হিসাবে নয়।
বেন হুইলার

4
@ বেনহিলার: এমনকি এটি ইনলাইন কোড হলেও এটি যে কোনও ফাইলের জন্য আপনি লিখেছেন তা আসলে এটি। উইন্ডোর বামে আপনি ফাইলের নাম এবং পুরো ডিরেক্টরি কাঠামো দেখতে পাবেন।
ভিনিথ

সুতরাং আমি আমার কোডটির নাম "lambda_function.py" রেখেছি, আমি কি হ্যান্ডলারের নাম পাইথন_লাম্বদা_ফাংশন.লাম্বদা_হ্যান্ডলার হিসাবে রাখতে হবে?
আরবি 17

@ রাহুলবাণার্জি নং। আপনি এটিকে ল্যাম্বদা_ফানশন বলে ডাকবেন mbলম্বদা_হ্যান্ডলার
দীনেশ ২

90

আপনি যদি জিপ ফাইল আপলোড করেন। আপনি ডিরেক্টরিটির বিষয়বস্তুগুলি জিপ করছেন এবং ডিরেক্টরিটি নিজেই নয় তা নিশ্চিত করুন।


4
জিপ করার সময়, নিশ্চিত করুন যে আপনি -r পতাকাটিও ব্যবহার করছেন!
গ্র্যান্ট রবার্ট স্মিথ

@ 2ank3th আপনি ভাল
Sethuraman শ্রীনিবাসন

এর জন্য ধন্যবাদ.
জেমসজি

24

এই সমস্যার আর একটি উত্স হ'ল জিপ করা ফাইলটির অনুমতি। এটা তোলে হবে অন্তত পৃথিবীব্যাপী পাঠযোগ্য হবে। (মিনিট chmod 444)

অজগর ফাইলটি জিপ করার আগে আমি নিম্নলিখিতটি চালিয়েছি এবং এটি দুর্দান্ত কাজ করেছে।

chmod u=rwx,go=r

4
এই. আমি পাইথনের জিপফিলটি লম্বা ফাংশনগুলিকে জিপটিতে প্রোগ্রামক্রমে প্যাকেজ করতে ব্যবহার করছিলাম, এটি আপনার পূর্বরূপ 0600হিসাবে যথেষ্ট বলে যথেষ্ট না হলেও এটি ডিফল্ট । আরও, ইন্টিগ্রেটেড লাম্বদা সোর্স কোড এডিটর (অ্যামাজন ওয়েব পৃষ্ঠায়) অনুমতি সংক্রান্ত সমস্যার সতর্কতা ছাড়াই আনন্দের সাথে ফাইলটি পড়বে।
cjhanks

4
দ্বিতীয়। : আমি পদ্ধতি ব্যবহার করে ফাইল অনুমতি স্থাপন এখানে দেখানো দ্বারা কাজ পেয়েছি stackoverflow.com/a/434689/931277
dokkaebi

15

আমি নিতিনের উত্তরটি খুব সহায়ক বলে মনে করেছি। এখানে একটি নির্দিষ্ট ওয়াক-থ্রু রয়েছে:

এই মানগুলি দেখুন:

  1. আপনার অজগর স্ক্রিপ্টে ল্যাম্বদা_হ্যান্ডলার ফাংশনের নাম। এডাব্লুএস উদাহরণগুলিতে ব্যবহৃত নামটি হ'ল "ল্যাম্বদা_হ্যান্ডলার" "ডিএফ ল্যাম্বদা_হ্যান্ডলার (ইভেন্ট, প্রসঙ্গ)" এর মতো দেখাচ্ছে। এই ক্ষেত্রে, মানটি "ল্যাম্বদা_হ্যান্ডলার"
  2. লাম্বদা ড্যাশবোর্ডে, ফাংশনটির জন্য ল্যাম্বডা ড্যাশবোর্ডের "কনফিগারেশন" বিভাগে "হ্যান্ডলার" পাঠ্য বাক্সে হ্যান্ডলারের নামটি খুঁজে নিন (নিতিনের স্ক্রিনশটটিতে দেখানো হয়েছে)। আমার ডিফল্ট নাম ছিল "lambda_function.lambda_handler"।
  3. আপনার অজগর লিপির নাম। ধরা যাক এটি "cool.py"

এই মানগুলির সাথে, আপনাকে হ্যান্ডলারের নাম পরিবর্তন করতে হবে (স্ক্রিনশটে প্রদর্শিত) "শীতল। ল্যাম্বদা_হ্যান্ডলার" করতে হবে। "ত্রুটিম্যাসেজ" ল্যাম্বডা ফাংশন "মডিউলটি আমদানি করতে অক্ষম" এর থেকে মুক্তি পাওয়ার এই এক উপায়। যদি আপনি আপনার পাইথন স্ক্রিপ্টের হ্যান্ডলারটির নাম "সাপ" করতে চান তবে আপনাকে ল্যাম্বডা ড্যাশবোর্ডের হ্যান্ডলারের নামটি "শীতল.সপ" করতে হবে


11

এডাব্লুএস ল্যাম্বডায় (পাইথনের জন্য) ডিপ্লোয়মেন্ট প্যাকেজ তৈরি করার সময় কেবলমাত্র অনেকগুলি গ্যাটাচ রয়েছে । আমি ডিবাগিং সেশনে ঘন্টা এবং ঘন্টা ব্যয় করেছি যতক্ষণ না আমি এমন একটি সূত্র পাই যা খুব কমই ব্যর্থ হয়।

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা সম্পূর্ণ প্রক্রিয়াটি স্বয়ংক্রিয় করে তোলে এবং তাই এটিকে কম ত্রুটিযুক্ত করে তোলে। আমি টিউটোরিয়ালও লিখেছি যা ব্যাখ্যা করে যে কীভাবে সবকিছু কাজ করে। আপনি এটি পরীক্ষা করে দেখতে চাইতে পারেন:

ঝামেলামুক্ত পাইথন ল্যাম্বডা মোতায়েন [টিউটোরিয়াল + স্ক্রিপ্ট]


4
দুর্দান্ত পোস্ট কিন্তু আমি সবচেয়ে শক্ত অংশে বিশদটি মিস করছি যা কীভাবে দেশীয় লিবস প্যাকেজ করতে হয়। এটি কতটা জটিল তা সত্যিই স্বাভাবিক নয়
জনআন্ড্রুজ

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উপরের উদাহরণের জন্য।


4
অতিরিক্তভাবে, পুরো ফোল্ডারটির মতো জিপ করবেন না zip -r deploy.zip deploy। এটি জিপ ফাইলের মধ্যে একটি মোতায়েন ফোল্ডার তৈরি করবে।

9

উপরের সমস্ত সমাধানের চেষ্টা করার পরে আমি এই কঠিন উপায়টি পেয়েছি। আপনি যদি জিপ ফাইলে সাব ডিরেক্টরি ব্যবহার করেন তবে নিশ্চিত __init__.pyকরুন যে আপনি প্রতিটি উপ-ডিরেক্টরিতে ফাইলটি অন্তর্ভুক্ত করেছেন এবং এটি আমার জন্য কাজ করেছে।


7

আমারও ত্রুটি ছিল আমার জিপ ফাইলটিতে কোড প্যারেন্ট ফোল্ডার অন্তর্ভুক্ত রয়েছে তা সরিয়ে দিন। আমি unzipএবং জিপ ফাইলটি পরিদর্শন করিলে ফাইলটি lambda_functionপ্যারেন্ট ফোল্ডারের অধীনে থাকে ./lambda

zipকমান্ডটি ব্যবহার করুন , ত্রুটিটি ঠিক করুন:

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

4
আপনার কোড ফোল্ডারের ভিতরে জিপ চালান। আমার কেস, সিডি ল্যাম্বদা এবং & জিপ -আর ../lambda.zip ./*
জো

4

ইন lambda_handlerবিন্যাসে হওয়া আবশ্যক lambda_filename.lambda_functionName। ধরুন আপনি lambda_handlerফাংশনটি চালাতে চান এবং এটি এতে রয়েছে lambda_fuction.py, তবে আপনার হ্যান্ডলারের ফর্ম্যাটটি রয়েছেlambda_function.lambda_handler

এই ত্রুটিটি পাওয়ার আরেকটি কারণ হ'ল মডিউল নির্ভরতা।

আপনার lambda_fuction.pyঅবশ্যই জিপ ফাইলের মূল ডিরেক্টরিতে থাকতে হবে।


2

@ নীথিন, এডাব্লুএস ফাংশনগুলির layersভিতরে ধারণা প্রকাশ করেছে Lambda। আপনি আপনার স্তরটি তৈরি করতে পারেন এবং সেখানে আপনি গ্রন্থাগারগুলির মতো আপলোড করতে পারেন এবং তারপরে আপনি লেম্বা ফাংশনগুলির সাথে স্তরটি সংযুক্ত করতে পারেন। আরও তথ্যের জন্য: https://docs.aws.amazon.com/lambda/latest/dg/configration-layers.html


2

2019 থেকে একটি দৃষ্টিকোণ:

এডাব্লুএস ল্যাম্বদা পাইথন ৩.7 সমর্থন করে, যা অনেক লোক (আমাকে সহ) ইনলাইন ল্যাম্বডাসের রানটাইম হিসাবে ব্যবহার করতে পছন্দ করে।

তারপরে আমাকে একটি বাহ্যিক নির্ভরতা আমদানি করতে হয়েছিল এবং আমি ওপিকে উল্লিখিত হিসাবে আমি ডাব্লুএস ডক্স অনুসরণ করেছি। (স্থানীয় ইনস্টল -> জিপ -> আপলোড)।

আমার আমদানি মডিউল ত্রুটি ছিল এবং আমি বুঝতে পেরেছিলাম যে আমার স্থানীয় পিসিতে পাইথনটি ডিফল্ট পাইথন হিসাবে ২.7 ছিল। আমি যখন পাইপ চালু করি তখন এটি পাইথন ২.7 এর জন্য আমার নির্ভরতা ইনস্টল করে।

সুতরাং আমি স্থানীয়ভাবে পাইথন সংস্করণে স্যুইচ করেছি যা ল্যাম্বদা কনসোলে নির্বাচিত রানটাইম সংস্করণটির সাথে মেলে এবং তারপরে বাহ্যিক নির্ভরতা পুনরায় ইনস্টল করেছিলাম। এটি আমার জন্য সমস্যার সমাধান। যেমন:

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

1

আমি একই ইস্যুতে দৌড়েছি, লিন্ডা ডটকমের টিউটোরিয়ালের অংশ হিসাবে এটি একটি অনুশীলন ছিল যদি আমি ভুল না হই। আমি যে ভুলটি করেছিলাম তা রানটাইমটি পাইথন ৩.6 হিসাবে নির্বাচন করা হয়নি যা লামদা ফাংশন কনসোলের একটি বিকল্প।


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

একই সমস্যার জন্য আমার সমাধান ভাগ করে নেওয়া, যদি এটি কাউকে সহায়তা করে তবে।

ইস্যু: আমি ত্রুটি পেয়েছি: "[এআরআরআর] রানটাইম। ইম্পোর্টমডিউল ইরর: অ্যাডব্লিউএস নিবন্ধে সরবরাহিত অ্যাউজ-বিগ-ডেটা-ব্লগ কোড [1] চালানোর সময় 'স্ট্রিংআইও'" নামে কোনও মডিউল "আমদানি করতে অক্ষম।

সমাধান: পাইথন ৩.7 থেকে পাইথন ২.7 এ পরিবর্তিত রানটাইম

[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https: // aws .amazon.com / ব্লগস / বিগ-ডেটা / বিশ্লেষণ-ভিপিসি-ফ্লো-লগ-সাথে-অ্যামাজন-কিনেসিস-ফায়ারহোজ-অ্যামাজন-অ্যাথেনা এবং অ্যামাজন-কুইকসাইট /


এটি আমার পক্ষে অন্য উপায়ে ছিল (2.7 -> 3.8)
শয়তানিকার্ডন

0

স্তরগুলির আকারে অতিরিক্ত কোড এবং সামগ্রীতে টানতে আপনি আপনার ল্যাম্বদা ফাংশনটি কনফিগার করতে পারেন। একটি স্তর হ'ল একটি জিপ সংরক্ষণাগার যা লাইব্রেরি, একটি কাস্টম রানটাইম, বা অন্যান্য নির্ভরতা ধারণ করে। স্তরগুলি সহ, আপনি আপনার কার্যকরী লাইব্রেরিগুলিকে আপনার ডিপ্লোয়মেন্ট প্যাকেজে অন্তর্ভুক্ত করার প্রয়োজন ছাড়াই ব্যবহার করতে পারেন। স্তরগুলি আপনাকে আপনার স্থাপনার প্যাকেজটিকে ছোট রাখতে দেয়, যা উন্নয়নকে আরও সহজ করে তোলে।

তথ্যসূত্র:

  1. https://docs.aws.amazon.com/lambda/latest/dg/configration-layers.html
  2. https://towardsdatasज्ञान.com/intr پيداوار-to-amazon-lambda-layers-and-boto3- using-python3-39bd390add17

0

নিশ্চিত হয়ে নিন যে আপনি এই ডকুমেন্টেশন অনুযায়ী কাজ করার জন্য কোনও ফোল্ডারের কাঠামোয় সমস্ত নির্ভরতাগুলি অজগর / [আপনার সমস্ত নির্ভরতা] হিসাবে জিপ করছেন ।

https://docs.aws.amazon.com/lambda/latest/dg/configration-layers.html#configration-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

আমি যা দেখতে পাচ্ছি তা আপনার কোডে অনুপস্থিত।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.