'Lambda_function' modülü içe aktarılamıyor: * adlı modül yok
Ek paketler kullanan bir python lambda işlevi çalıştırmaya çalışıyorum. Ancak .zip dosyasını lambda konsoluna her yüklediğimde şu hatayı alıyorum:
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
Şu talimatları takip ettim: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies bu da bana paketlerimin lambda fonksiyonum için yerel bir dizinde olduğundan emin olmamı söyledi:
~/my-function$ pip install --target ./package Pillow
Yastık kullanmıyorum. Bu, kendi sitelerinden alınan örnek koddur. Halihazırda Lambda'da erişebileceğiniz bir paket kullanmıyorum. Github'dan aldığım ve uygulamama eklemem gereken bir şey.
İlk başta bu işe yaramadı, bu yüzden bir setup.cfgdosya oluşturdum ve ekledim:
[install]
prefix=
Şimdi, piphedefe yüklemek için komutu kullandığımda, çalışıyor (ve ayrıca paketim dışında başka klasörler de ekliyor, ancak gerekli olduklarını varsayarak onları orada bıraktım.
Dizine girdiğimde paket oradadır.
Sonra şu cevabı buldum: https://stackoverflow.com/a/12493244/5675125 Bu, belki bazı gizli dosyaların dahil edilmediğini ve onları bu şekilde sıkıştırmam gerektiğini önerdi.
Yine aynı hata.
Lambda'yı paketimin orada olduğunu nasıl anlayabilirim?
Yanıtlar
Pillow'a ihtiyacınız varsa, işlevinizde kullanmanın en kolay yolu, github'da keithrozario / Klayers gibi genel katmanlara (yastık dahil) sahip popüler bir havuzdur . Kullanmak için, bölgenize göre katmanın ARN'sini bulmanız gerekir . Python 3.8 için ARN'lerin listesi burada .
Örneğin, us-east-1Python 3.7 için eklenen katman şu şekilde olacaktır:
Güncelleme
Özel katmanı yeni oluşturdum ve instabotçalıştığını doğrulayabilirim.
Kullanılan teknik , son AWS blogunda açıklanan docker aracını içerir :
- Docker ile benzetilmiş bir Lambda ortamı kullanarak nasıl Lambda katmanı oluşturabilirim?
Bu nedenle, bu soru için aşağıdaki gibi doğruladım :
Örneğin boş bir klasör oluşturun
mylayer.Klasöre gidin
requirements.txtve içeriği olan bir dosya oluşturun .
instabot
- Aşağıdaki docker komutunu çalıştırın:
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"
- Numpy'yi kaldır
instabotGerektirir numpyçok büyük olduğu. Bu yüzden bir katman oluşturmadan önce onu manuel olarak kaldırıyoruz. numpyBunun yerine AWS tarafından sağlanan katmanı kullanacağız .
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
Numpy'yi kaldırmazsak, katman> 50MB olacaktır.
- Katmanı zip olarak oluşturun:
zip -9 -r mylayer.zip python
mylayer.zipAWS Konsolu'na dayalı olarak lambda katmanı oluşturun . Belirtmek unutmayınCompatible runtimesetmekpython3.8.İşlevinize iki katman ekleyin:
İlki, AWSLambda-Python38-SciPy1xAWS tarafından numpy ile sağlanırken, ikincisi yukarıda oluşturduğumuzdur. Yani işleviniz iki katman kullanacaktır.
- Aşağıdaki lambda işlevini kullanarak katmanı lambda'da test edin:
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!')
}