web-dev-qa-db-fra.com

AWS Lambda - impossible d'importer le module 'lambda_function'

Comme beaucoup d'autres avant moi, j'essaie d'exécuter une fonction AWS Lambda et lorsque j'essaie de la tester, j'obtiens

"errorMessage": "Impossible d'importer le module 'lambda_function'"

Mon gestionnaire est défini sur lambda_function.lambda_handler, et j'ai en effet un fichier nommé lambda_function.py qui contient une fonction appelée lambda_handler. Voici une capture d'écran comme preuve: enter image description here

Tout fonctionnait bien lorsque j'écrivais des extraits de code en ligne dans l'IDE inclus, mais quand j'ai compressé mon programme complet avec toutes ses dépendances et l'ai téléchargé, j'ai eu l'erreur ci-dessus.

J'utilise les packages Numpy et Scipy, qui sont assez volumineux. Mon répertoire zippé fait 34 Mo et mon répertoire décompressé 122 Mo. Je pense que cela devrait être bien puisque la limite est de 50 Mo pour un répertoire zippé. Il semble que le téléchargement soit correct, car je vois le message:

Le package de déploiement de votre fonction Lambda "one-shot-image-classification" est trop volumineux pour permettre l'édition de code en ligne. Cependant, vous pouvez toujours appeler votre fonction pour le moment.

J'ai vu que certains messages résolvent ce problème en utilisant virtualenv, mais je ne connais pas cette technologie et je ne sais pas comment l'utiliser correctement.

J'ai également vu des articles disant que parfois les dépendances ont des dépendances et je devrais peut-être les inclure, mais je ne sais pas comment le découvrir.

Voici la partie supérieure de lambda_function.py, qui devrait suffire pour voir les bibliothèques que j'utilise et que j'ai effectivement une fonction lambda_handler:

import os
import boto3
import numpy as np
from scipy.ndimage import imread
from scipy.spatial.distance import cdist

def lambda_handler(event, context):

    s3 = boto3.resource('s3')

Voici une capture d'écran de la version décompressée du répertoire que je télécharge: enter image description here

Je peux également publier le rôle de stratégie que mon Lambda utilise si cela peut être un problème.

Toute idée est très appréciée!

MISE À JOUR:

Voici une solution que j'ai essayée: 1. git clone https://github.com/Miserlou/lambda-packages 2. créez un dossier dans Documents appelé new_lambda 3. copiez mon lambda_function.py et le dossier numpy des lambda-packages dans new_lambda, ainsi que la bibliothèque scipy que j'ai compilée à l'aide de Docker pour AWS conformément à l'article: https://serverlesscode.com/post/scikitlearn-with-Amazon-linux-container/ 4. Compressez le dossier new_lambda en faisant un clic droit dessus et en sélectionnant 'compresser'

Mes résultats:

Impossible d'importer le module 'lambda_function': aucun module nommé 'lambda_function'

Pour réitérer, mon fichier est nommé lambda_function.py et contient une fonction appelée lambda_handler, qui accepte deux arguments (comme vu ci-dessus). Ces informations correspondent à celles vues dans Handler, également vues ci-dessus.

J'utilise un ordinateur Mac, si cela est important.

MISE À JOUR 2

Si je suis les étapes ci-dessus, mais que je zippe les fichiers en sélectionnant directement les fichiers que je veux compresser, puis en cliquant avec le bouton droit et en sélectionnant "compresser", j'obtiens plutôt l'erreur

Impossible d'importer le module 'lambda_function': impossible d'importer le nom 'show_config'

En outre, les packages lambda précompilés indiquent qu'ils sont compilés pour "au moins Python 2.7", mais mon runtime lambda est 3.6. Cela pourrait-il être un problème?

6
Spencer Goff

La solution était de compresser les paquets précompilés numpy et scipy de la source this .

1
Spencer Goff

Le problème est que votre numpy local et pandas sont compilés pour l'architecture de la machine locale. Comme AWS Lambda utilise Linux personnalisé, ils ne sont probablement pas compatibles.

Donc, si vous souhaitez les utiliser, vous avez deux choix:

  • Compilez les dépendances sur l'instance EC2 qui utilise la même version d'Amazon Linux qu'AWS Lambda et créez un package de déploiement.

  • Utilisez l'un des packages précompilés de ici

P.S. J'ai lu des commentaires sur un post, donc je vois que le nom du fichier et de la fonction est correct et numpy vous pose des problèmes.

7
ljmocic

J'ai eu un problème similaire:

Unable to import module 'lib/lambda_function': No module named 'lib/lambda_function'

La solution pour moi et peut-être pour vous était d'inclure un __init__.py dans le même répertoire que lambda_function.py.

Pourquoi __init__.py résoudre le problème?

Je comprends qu'il est nécessaire que le répertoire (lib dans mon cas,. Dans le vôtre) soit considéré comme un package valide Python.

Voici le document de référence sur lequel j'ai fondé cette hypothèse: 5.2.1. Paquets réguliers - Python 3.7.

0
Alain O'Dea