Je reçois un message d'erreur « Unable to import module » (Impossible d'importer le module) lorsque j'essaie d'exécuter mon code AWS Lambda dans Python.
Brève description
Vous recevez généralement ce message d'erreur lorsque votre environnement Lambda ne trouve pas la bibliothèque spécifiée dans le code Python. Cela est dû au fait que Lambda n'est pas prépackagé avec l'ensemble des bibliothèques Python.
Pour la résoudre, créez un package de déploiement ou une couche Lambda qui inclut les bibliothèques que vous voulez utiliser dans votre code Python pour Lambda.
Important : assurez-vous de placer la bibliothèque que vous importez pour Python dans le dossier /python.
Solution
Remarque : les étapes suivantes vous montrent comment créer une couche Lambda plutôt qu'un package de déploiement. En effet, vous pouvez réutiliser la couche Lambda dans plusieurs fonctions Lambda. Chaque environnement d'exécution Lambda ajoute des dossiers spécifiques dans le répertoire /opt référencé par la variable PATH. Si la couche utilise la même structure de dossiers, alors le code de votre fonction Lambda peut accéder au contenu de la couche sans avoir besoin de spécifier le chemin d'accès.
La bonne pratique consiste à créer une couche Lambda sur le même système d'exploitation que celui sur lequel est basé votre environnement d'exécution Lambda. Par exemple, Python 3.8 est basé sur une Amazon Machine Image (AMI) Amazon Linux 2. Cependant, Python 3.7 et Python 3.6 sont basés sur l'AMI Amazon Linux.
Pour créer une couche Lambda pour une bibliothèque Python 3.8, procédez comme suit :
Remarque : les étapes 1 à 3 sont facultatives.
1. Dans la console AWS Cloud9, créez une instance Amazon Elastic Compute Cloud (Amazon EC2) avec l'AMI Amazon Linux 2. Pour obtenir des instructions, consultez Création d'un environnement EC2 dans le guide de l'utilisateur AWS Cloud9.
2. Créez une politique AWS Identity and Access Management (IAM) qui accorde des autorisations pour appeler l'opération d'API PublishLayerVersion.
Exemple de déclaration de politique IAM qui accorde des autorisations pour appeler l'opération d'API PublishLayerVersion
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:PublishLayerVersion",
"Resource": "*"
}
]
}
3. Créez un rôle IAM et attachez la politique IAM au rôle. Ensuite, attachez le rôle IAM à l'instance Amazon EC2.
Remarque : votre instance EC2 dispose désormais des autorisations afin de charger des couches Lambda pour l'appel d'API PublishLayerVersion.
4. Ouvrez votre environnement Amazon EC2 AWS Cloud9. Ensuite, installez Python 3.8 et pip3 en exécutant les commandes suivantes :
$ sudo amazon-linux-extras install python3.8
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3.8 get-pip.py --user
5. Créez un dossier python en exécutant la commande suivante :
$ mkdir python
6. Installez les fichiers de la bibliothèque Pandas dans le dossier python en exécutant la commande suivante :
Important : remplacez Pandas par le nom de la bibliothèque Python que vous voulez importer.
$ python3.8 -m pip install pandas -t python/
7. Compressez le contenu du dossier python dans un fichier layer.zip en exécutant la commande suivante :
$ zip -r layer.zip python
8. Publiez la couche Lambda en exécutant la commande suivante :
Important : remplacez us-east-1 par la région AWS dans laquelle se trouve votre fonction Lambda.
$ aws lambda publish-layer-version --layer-name pandas-layer --zip-file fileb://layer.zip --compatible-runtimes python3.8 --region us-east-1
9. Ajoutez la couche à votre fonction Lambda.
Informations connexes
Comment dépanner les erreurs « permission denied » (autorisation refusée) ou « unable to import module » (Impossible d'importer le module) lors du chargement d'un package de déploiement Lambda ?