'Lambda_function' modülü içe aktarılamıyor: * adlı modül yok

Oct 12 2020

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

1 Marcin Oct 12 2020 at 10:28

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 :

  1. Örneğin boş bir klasör oluşturun mylayer.

  2. Klasöre gidin requirements.txtve içeriği olan bir dosya oluşturun .

instabot
  1. 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"
  1. 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.

  1. Katmanı zip olarak oluşturun:
zip -9 -r mylayer.zip python 
  1. mylayer.zipAWS Konsolu'na dayalı olarak lambda katmanı oluşturun . Belirtmek unutmayın Compatible runtimesetmek python3.8.

  2. İş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.

  1. 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!')
    }