test - Error del módulo de importación de AWS Lambda en python
servidor lambda (14)
@nithin, AWS lanzó el concepto de
layers
dentro de las funciones de
Lambda
.
Puede crear su capa y allí puede cargar tanto como bibliotecas y luego puede conectar la capa con las funciones lambda.
Para más detalles:
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
Estoy creando un paquete de implementación de AWS Lambda python. Estoy usando una solicitud de dependencia externa. Instalé la dependencia externa utilizando la documentación de AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html . A continuación se muestra mi código de Python.
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
Creé el Zip del contenido del directorio project-dir y lo subí a la lambda (comprima el contenido del directorio, no el directorio). Cuando ejecuto la función obtengo el error mencionado a continuación.
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
Amablemente ayúdame a depurar el error.
Aquí hay un paso rápido.
Suponga que tiene una carpeta llamada
deploy
, con su archivo lambda dentro de la llamada
lambda_function.py
.
Supongamos que este archivo se parece a esto.
(
p1
y
p2
representan paquetes de terceros).
import p1 import p2 def lambda_handler(event, context): # more code here return { "status": 200, "body" : "Hello from Lambda!", }
Para cada dependencia de terceros, debe
pip install <third-party-package> --target .
desde dentro de la carpeta de
deploy
.
pip install p1 --target . pip install p2 --target .
Una vez que hayas hecho esto, así es como debería verse tu estructura.
deploy/ ├── lambda_function.py ├── p1/ │ ├── __init__.py │ ├── a.py │ ├── b.py │ └── c.py └── p2/ ├── __init__.py ├── x.py ├── y.py └── z.py
Finalmente, necesita
zip
todos los contenidos dentro de la carpeta de
deploy
en un archivo comprimido.
En una Mac o Linux, el comando se vería como
zip -r ../deploy.zip *
desde la carpeta de
deploy
.
Tenga en cuenta que el indicador
-r
es para subcarpetas recursivas.
La estructura del archivo zip debe reflejar la carpeta original.
deploy.zip/ ├── lambda_function.py ├── p1/ │ ├── __init__.py │ ├── a.py │ ├── b.py │ └── c.py └── p2/ ├── __init__.py ├── x.py ├── y.py └── z.py
Cargue el archivo zip y especifique el
<file_name>.<function_name>
para que Lambda entre en su proceso, como
lambda_function.lambda_handler
para el ejemplo anterior.
El error se debió al nombre de archivo de la función lambda. Al crear la función lambda, pedirá el controlador de la función Lambda. Debe nombrarlo como su Python_File_Name.Method_Name . En este escenario, lo denominé lambda.lambda_handler (lambda.py es el nombre del archivo).
Encontré este camino difícil después de probar todas las soluciones anteriores.
Si está utilizando subdirectorios en el archivo zip, asegúrese de incluir el archivo
__init__.py
en cada uno de los subdirectorios y eso funcionó para mí.
Encontré la respuesta de Nithin muy útil. Aquí hay un recorrido específico:
Busque estos valores:
- El nombre de la función lambda_handler en su script de Python. El nombre utilizado en los ejemplos de AWS es "lambda_handler", que se parece a "def lambda_handler (evento, contexto)". En este caso, el valor es "lambda_handler"
- En el panel de Lambda, busque el nombre del controlador en el cuadro de texto "Controlador" en la sección "Configuración" en el panel de lambda para la función (que se muestra en la captura de pantalla de Nithin). Mi nombre predeterminado era "lambda_function.lambda_handler".
- El nombre de tu script de Python. Digamos que es "cool.py"
Con estos valores, deberá cambiar el nombre del controlador (que se muestra en la captura de pantalla) a "cool.lambda_handler". Esta es una manera de deshacerse del mensaje de error "No se puede importar el módulo ''lambda_function''". Si tuviera que cambiar el nombre del controlador en su secuencia de comandos de Python a "sup", entonces debería cambiar el nombre del controlador en el panel lambda a "cool.sup"
Hay tantas trampas al crear paquetes de implementación para AWS Lambda (para Python). He pasado horas y horas en sesiones de depuración hasta que encontré una fórmula que rara vez falla.
He creado un script que automatiza todo el proceso y, por lo tanto, lo hace menos propenso a errores. También escribí un tutorial que explica cómo funciona todo. Es posible que desee verlo:
Implementación de Python Lambda sin complicaciones [Tutorial + Script]
Me encontré con el mismo problema, este fue un ejercicio como parte de un tutorial en lynda.com si no me equivoco. El error que cometí fue no seleccionar el tiempo de ejecución como Python 3.6, que es una opción en la consola de funciones lamda.
Necesita comprimir todos los requisitos, use este script
#!/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
usar con:
package.sh <python_file>
No hay necesidad de hacer ese desastre.
usar python-lambda
https://github.com/nficano/python-lambda
con un solo comando
pylambda deploy
desplegará automáticamente su función
Otra fuente de este problema son los permisos en el archivo comprimido.
DEBE
ser al menos legible en todo el mundo.
(min
chmod 444
)
Ejecuté lo siguiente en el archivo de Python antes de comprimirlo y funcionó bien.
chmod u=rwx,go=r
Si está cargando un archivo zip. Asegúrese de comprimir el contenido del directorio y no el directorio en sí.
También tuve el error.
Resulta que mi archivo zip incluye la carpeta del código padre.
Cuando
unzip
e inspecciono el archivo zip, el archivo
lambda_function
está en la carpeta principal
./lambda
.
Use el comando
zip
, corrija el error:
zip -r ../lambda.zip ./*
Una perspectiva desde 2019:
AWS Lambda ahora es compatible con Python 3.7, que muchas personas (incluido yo mismo) eligen usar como tiempo de ejecución para lambdas en línea.
Luego tuve que importar una dependencia externa y seguí a AWS Docs como se refería al OP. (instalación local -> zip -> subir).
Tuve el error del módulo de importación y me di cuenta de que mi PC local tenía Python 2.7 como Python predeterminado. Cuando invoqué pip, instaló mi dependencia para Python 2.7.
Así que cambié localmente a la versión de Python que coincide con la versión de tiempo de ejecución seleccionada en la consola lambda y luego reinstalé las dependencias externas. Esto resolvió mi problema. P.ej:
$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>
en lambda_handler, el formato debe ser lambda_filename.lambda_functionName, suponga que si desea ejecutar la función lambda_handler y si está en lambda_fuction.py, el formato de su controlador es "lambda_function.lambda_handler". Otra razón para obtener el error son las dependencias del módulo. su lambda_fuction.py debe estar en el directorio raíz de zip.