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.
python
amazon-web-services
aws-lambda
Nithin K Anil
sumber
sumber
import lambda_function
yang tidak ditemukan. Mungkin kamu maufrom future import lambda_function
? Atau cukup pip install lambda_function pada baris cmd.Jawaban:
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.
sumber
Jika Anda mengupload file zip. Pastikan Anda meng-zip konten direktori dan bukan direktori itu sendiri.
sumber
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.
sumber
0600
yang 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.Saya menemukan jawaban Nithin sangat membantu. Berikut ini panduan spesifiknya:
Cari nilai-nilai ini:
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"
sumber
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]
sumber
Berikut langkah cepatnya.
Asumsikan Anda memiliki folder bernama
deploy
, dengan file lambda Anda di dalam panggilanlambda_function.py
. Mari kita asumsikan file ini terlihat seperti ini. (p1
danp2
mewakili 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 dalamdeploy
folder.Setelah Anda melakukan ini, inilah tampilan struktur Anda.
Terakhir, Anda perlu
zip
memasukkan semua konten di dalamdeploy
folder ke file terkompresi. Di Mac atau Linux, perintah akan terlihat sepertizip -r ../deploy.zip *
dari dalamdeploy
folder. Perhatikan bahwa-r
bendera ini untuk subfolder rekursif.Struktur file zip harus mencerminkan folder aslinya.
Unggah file zip dan tentukan
<file_name>.<function_name>
untuk Lambda untuk masuk ke proses Anda, sepertilambda_function.lambda_handler
contoh di atas.sumber
zip -r deploy.zip deploy
. Ini akan membuat folder penerapan di dalam file zip.Saya menemukan cara yang sulit ini setelah mencoba semua solusi di atas. Jika Anda menggunakan sub-direktori di file zip, pastikan Anda menyertakan
__init__.py
file tersebut di setiap sub-direktori dan itu berfungsi untuk saya.sumber
Saya mengalami kesalahan juga. Ternyata file zip saya menyertakan kode folder induk. Ketika saya
unzip
dan memeriksa file zip,lambda_function
file tersebut berada di bawah folder induk./lambda
.Menggunakan
zip
perintah, perbaiki kesalahan:zip -r ../lambda.zip ./*
sumber
Dalam
lambda_handler
format haruslambda_filename.lambda_functionName
. Misalkan Anda ingin menjalankanlambda_handler
fungsi dan sudah masuklambda_fuction.py
, maka format handler Anda adalahlambda_function.lambda_handler
.Alasan lain untuk mendapatkan kesalahan ini adalah ketergantungan modul.
Anda
lambda_fuction.py
harus berada di direktori root dari file zip.sumber
@nithin, AWS merilis
layers
konsep di dalamLambda
fungsi. Anda dapat membuat lapisan Anda dan di sana Anda dapat mengunggah sebanyak pustaka dan kemudian Anda dapat menghubungkan lapisan tersebut dengan fungsi lambda. Untuk lebih jelasnya: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.htmlsumber
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:
sumber
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.
sumber
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
sumber
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:
sumber
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 /
sumber
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:-
sumber
Pastikan Anda membuat zip semua dependensi dalam struktur folder sebagai python / [Your All Dependencies] untuk membuatnya berfungsi sesuai dokumentasi ini.
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
sumber
Masalah saya adalah bahwa file .py dan dependensi tidak ada di direktori "root" zip. misalnya jalur perpustakaan dan fungsi lambda .py harus:
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
sumber
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
sumber
Harap tambahkan di bawah satu setelah
Import requests
import boto3
Apa yang saya lihat tidak ada di kode Anda.
sumber
Tidak perlu melakukan kekacauan itu.
gunakan python-lambda
https://github.com/nficano/python-lambda
dengan satu perintah
pylambda deploy
, secara otomatis akan menyebarkan fungsi Andasumber