Kesalahan modul impor AWS Lambda di python


93

Saya membuat paket penerapan python AWS Lambda. Saya menggunakan satu permintaan ketergantungan eksternal. Saya menginstal ketergantungan eksternal menggunakan dokumentasi AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html . Di bawah ini adalah kode python saya.

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

Membuat Zip konten direktori project-dir dan diunggah ke lambda (Zip konten direktori, bukan direktori). Ketika saya menjalankan fungsi, saya mendapatkan kesalahan yang disebutkan di bawah ini.

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

Mohon bantu saya untuk men-debug kesalahan tersebut.


Apakah ini kode lengkap Anda? Dengan kesalahan itu tampaknya suatu tempat ingin sesuatu import lambda_functionyang tidak ditemukan. Mungkin kamu mau from future import lambda_function? Atau cukup pip install lambda_function pada baris cmd.
Berci

@Berci Saya menjalankan kode python ini di platform AWS. Saya tidak bisa menggunakan pip. di mana saja di kode saya, saya menggunakan lambda_function. JIKA saya menyalin dan menempelkan kode yang sama di konsol AWS, ini akan berfungsi
Nithin K Anil

Lihat komentar terakhir di utas ini - mungkin berlaku untuk Anda?
kwinkunks

@kwinkunks Saya mencobanya. Sebenarnya saya meng-zip konten bukan direktori !!
Nithin K Anil

2
Dugaan saya adalah bahwa opsi "handler" di fungsi Anda salah. Periksa bahwa nama file Anda yang disebut "lambda_function.py" dan metode penangan adalah "lambda_handler"
Vor

Jawaban:


110

Kesalahan terjadi karena nama file dari fungsi lambda. Saat membuat fungsi lambda, ia akan meminta penangan fungsi Lambda. Anda harus menamainya sebagai Python_File_Name.Method_Name Anda . Dalam skenario ini saya menamakannya sebagai lambda.lambda_handler (lambda.py adalah nama file).

Silakan temukan di bawah snapshot. masukkan deskripsi gambar di sini


1
Kode saya hanya di lambda sebagai kode - bukan sebagai file.
Ben Wheeler

4
@BenWheeler: Meskipun ini adalah kode sebaris, ini adalah file yang benar-benar Anda tulis. Anda dapat melihat nama file dan seluruh struktur direktori di sebelah kiri jendela.
Vineeth

Jadi saya menamai kode saya sebagai "lambda_function.py", haruskah saya menamai penangannya sebagai Python_lambda_function.lambda_handler?
RB17

@RahulBanerjee No. Anda akan menyebutnya sebagai lambda_function.lambda_handler
Dinesh


24

Sumber lain dari masalah ini adalah izin pada file yang di-zip. Ini HARUS setidaknya di seluruh dunia dapat dibaca. (mnt chmod 444)

Saya menjalankan berikut ini pada file python sebelum zip dan itu berfungsi dengan baik.

chmod u=rwx,go=r

4
Ini. Saya menggunakan ZipFile Python untuk secara programatik mengemas fungsi lambda ke dalam ZIP, secara default memiliki 0600yang seperti yang Anda sebutkan tidak cukup. Lebih lanjut, editor kode sumber Lambda terintegrasi (di halaman web Amazon) dengan senang hati akan membaca file tanpa peringatan masalah izin.
cjhanks

2
Kedua. Saya membuatnya berfungsi dengan mengatur izin file menggunakan metode yang ditunjukkan di sini: stackoverflow.com/a/434689/931277
dokkaebi

16

Saya menemukan jawaban Nithin sangat membantu. Berikut ini panduan spesifiknya:

Cari nilai-nilai ini:

  1. Nama fungsi lambda_handler di skrip python Anda. Nama yang digunakan dalam contoh AWS adalah "lambda_handler" yang terlihat seperti "def lambda_handler (event, konteks)". Dalam kasus ini, nilainya adalah "lambda_handler"
  2. Di dasbor Lambda, temukan nama Handler di kotak teks "Handler" di bagian "Konfigurasi" di dasbor lambda untuk fungsi tersebut (ditampilkan di screenshot Nithin). Nama default saya adalah "lambda_function.lambda_handler".
  3. Nama skrip python Anda. Misalkan itu "cool.py"

Dengan nilai-nilai ini, Anda perlu mengganti nama penangan (ditunjukkan pada tangkapan layar) menjadi "cool.lambda_handler". Ini adalah salah satu cara untuk menyingkirkan errorMessage "Unable to import module 'lambda_function'". Jika Anda mengganti nama penangan di skrip python Anda menjadi "sup" maka Anda harus mengganti nama penangan di dasbor lambda menjadi "cool.sup"


11

Ada begitu banyak gotchas saat membuat paket penyebaran untuk AWS Lambda (untuk Python). Saya telah menghabiskan berjam-jam untuk sesi debugging sampai saya menemukan formula yang jarang gagal.

Saya telah membuat skrip yang mengotomatiskan seluruh proses dan karena itu membuatnya tidak terlalu rentan terhadap kesalahan. Saya juga menulis tutorial yang menjelaskan bagaimana semuanya bekerja. Mungkin kamu ingin memeriksanya:

Penerapan Python Lambda Tanpa Kerumitan [Tutorial + Skrip]


2
Posting yang bagus tetapi saya kehilangan detail tentang bagian tersulit yaitu cara mengemas lib asli. Benar-benar tidak normal betapa rumitnya hal ini
JohnAndrews

10

Berikut langkah cepatnya.

Asumsikan Anda memiliki folder bernama deploy, dengan file lambda Anda di dalam panggilan lambda_function.py. Mari kita asumsikan file ini terlihat seperti ini. ( p1dan p2mewakili paket pihak ketiga.)

import p1
import p2

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

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

Untuk setiap ketergantungan pihak ketiga, Anda harus pip install <third-party-package> --target .dari dalam deployfolder.

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

Setelah Anda melakukan ini, inilah tampilan struktur Anda.

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

Terakhir, Anda perlu zipmemasukkan semua konten di dalam deployfolder ke file terkompresi. Di Mac atau Linux, perintah akan terlihat seperti zip -r ../deploy.zip *dari dalam deployfolder. Perhatikan bahwa -rbendera ini untuk subfolder rekursif.

Struktur file zip harus mencerminkan folder aslinya.

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

Unggah file zip dan tentukan <file_name>.<function_name>untuk Lambda untuk masuk ke proses Anda, seperti lambda_function.lambda_handlercontoh di atas.


1
Selain itu, JANGAN membuat zip seluruh folder seperti zip -r deploy.zip deploy. Ini akan membuat folder penerapan di dalam file zip.
openwonk

9

Saya menemukan cara yang sulit ini setelah mencoba semua solusi di atas. Jika Anda menggunakan sub-direktori di file zip, pastikan Anda menyertakan __init__.pyfile tersebut di setiap sub-direktori dan itu berfungsi untuk saya.


7

Saya mengalami kesalahan juga. Ternyata file zip saya menyertakan kode folder induk. Ketika saya unzipdan memeriksa file zip, lambda_functionfile tersebut berada di bawah folder induk ./lambda.

Menggunakan zip perintah, perbaiki kesalahan:

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

1
jalankan zip di dalam folder kode Anda. kasus saya di sini, cd lambda && zip -r ../lambda.zip ./*
Joe

4

Dalam lambda_handlerformat harus lambda_filename.lambda_functionName. Misalkan Anda ingin menjalankan lambda_handlerfungsi dan sudah masuk lambda_fuction.py, maka format handler Anda adalahlambda_function.lambda_handler .

Alasan lain untuk mendapatkan kesalahan ini adalah ketergantungan modul.

Anda lambda_fuction.pyharus berada di direktori root dari file zip.



2

Perspektif dari 2019:

AWS Lambda sekarang mendukung Python 3.7, yang dipilih banyak orang (termasuk saya sendiri) sebagai runtime untuk lambda inline.

Kemudian saya harus mengimpor ketergantungan eksternal dan saya mengikuti AWS Docs sebagai OP yang dirujuk. (pemasangan lokal -> zip -> unggah).

Saya mengalami kesalahan modul impor dan saya menyadari PC lokal saya memiliki Python 2.7 sebagai Python default. Ketika saya memanggil pip, itu menginstal dependensi saya untuk Python 2.7.

Jadi saya beralih secara lokal ke versi Python yang cocok dengan versi runtime yang dipilih di konsol lambda dan kemudian menginstal ulang dependensi eksternal. Ini memecahkan masalah saya. Misalnya:

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

1

Saya mengalami masalah yang sama, ini adalah latihan sebagai bagian dari tutorial di lynda.com jika saya tidak salah. Kesalahan yang saya buat adalah tidak memilih runtime sebagai Python 3.6 yang merupakan opsi di konsol fungsi lamda.


1

Masalah di sini bahwa versi Python yang digunakan untuk membangun dependensi fungsi Lambda Anda (di mesin Anda sendiri) berbeda dari versi Python yang dipilih untuk fungsi Lambda Anda. Kasus ini umum terjadi terutama jika library Numpy merupakan bagian dari dependensi Anda.

Contoh: Versi python mesin Anda: 3.6 ---> Lambda python versi 3.6


0

Anda perlu membuat zip semua persyaratan, gunakan skrip ini

#!/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

Gunakan dengan:

package.sh <python_file>

0

Berbagi solusi saya untuk masalah yang sama, kalau-kalau itu membantu siapa pun.

Masalah: Saya mendapat kesalahan: "[ERROR] Runtime.ImportModuleError: Tidak dapat mengimpor modul 'lambda_function': Tidak ada modul bernama 'StringIO'" saat menjalankan kode aws-big-data-blog [1] yang disediakan dalam artikel AWS [2].

Solusi: Mengubah Runtime dari Python 3.7 ke Python 2.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 / blog / big-data / analyzing-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /


Itu adalah sebaliknya bagi saya (2,7 -> 3,8)
demonicdaron

0

Anda dapat mengonfigurasi fungsi Lambda Anda untuk menarik kode dan konten tambahan dalam bentuk lapisan. Lapisan adalah arsip ZIP yang berisi pustaka, runtime khusus, atau ketergantungan lainnya. Dengan lapisan, Anda dapat menggunakan pustaka dalam fungsi Anda tanpa perlu menyertakannya dalam paket penerapan Anda. Lapisan memungkinkan Anda menjaga paket penerapan Anda tetap kecil, yang membuat pengembangan lebih mudah.

Referensi:-

  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

Masalah saya adalah bahwa file .py dan dependensi tidak ada di direktori "root" zip. misalnya jalur perpustakaan dan fungsi lambda .py harus:

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

tidak

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

Sebagai contoh:

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

Sebenarnya, buka folder utama (paket penerapan) yang ingin Anda zip,

Di dalam folder itu pilih semua file dan kemudian buat zip dan unggah zip itu


0

Harap tambahkan di bawah satu setelah Import requests

import boto3

Apa yang saya lihat tidak ada di kode Anda.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.