No se puede importar el módulo 'lambda_function': ningún módulo nombrado *
Estoy intentando ejecutar una función python lambda que usa paquetes adicionales. Sin embargo, cada vez que subo el archivo .zip a la consola lambda, aparece el error:
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
Seguí estas instrucciones: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies que me dijo que me asegurara de que mis paquetes estuvieran en un directorio local de mi función lambda:
~/my-function$ pip install --target ./package Pillow
No estoy usando Pillow. Este es un código de muestra de su sitio. Tampoco estoy usando un paquete al que ya puede acceder en Lambda. Es uno que obtuve de github y necesito adjuntarlo a mi aplicación.
Al principio esto no funcionó, así que creé un setup.cfgarchivo y agregué:
[install]
prefix=
Ahora, cuando uso el pipcomando para instalar en el destino, funciona (y también agrega muchas otras carpetas además de mi paquete, pero asumí que eran necesarias, así que las dejé allí.
Cuando entro al directorio, el paquete está ahí.
Entonces encontré esta respuesta: https://stackoverflow.com/a/12493244/5675125 lo que sugirió que quizás algunos archivos ocultos no se estaban incluyendo y así es como debería comprimirlos.
De nuevo el mismo error.
¿Cómo hago para que lambda reconozca que mi paquete está ahí?
Respuestas
Si necesita Pillow, la forma más fácil de usarlo en su función es a través de un repositorio popular con capas públicas (incluida la almohada) como keithrozario / Klayers en github. Para usarlo, debe ubicar el ARN de la capa según su región . La lista de ARN para python 3.8 está aquí .
Por ejemplo, para us-east-1la capa agregada para Python 3.7 sería:
Actualizar
Acabo de crear la capa personalizada con instaboty puedo confirmar que funciona.
La técnica utilizada incluye la herramienta Docker descrita en el reciente blog de AWS :
- ¿Cómo creo una capa Lambda utilizando un entorno Lambda simulado con Docker?
Por lo tanto, para esta pregunta, la verifiqué de la siguiente manera:
Cree una carpeta vacía, por ejemplo
mylayer.Vaya a la carpeta y cree un
requirements.txtarchivo con el contenido de
instabot
- Ejecute el siguiente comando de la ventana acoplable:
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"
- Eliminar numpy
El instabotrequiere numpyque es muy grande. Entonces lo eliminamos manualmente, antes de crear una capa. En su lugar, usaremos la numpycapa proporcionada por AWS.
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
Si no eliminamos numpy, la capa será> 50 MB.
- Crear capa como zip:
zip -9 -r mylayer.zip python
Cree una capa lambda basada en
mylayer.zipen la consola de AWS. No se olvide de especificarCompatible runtimesapython3.8.Agrega dos capas a tu función:
El primero es AWSLambda-Python38-SciPy1xproporcionado por AWS con numpy, mientras que el segundo es el que creamos anteriormente. Entonces tu función usará dos capas.
- Pruebe la capa en lambda usando la siguiente función lambda:
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!')
}