Comment puis-je ajouter des packages Python avec des fichiers binaires compilés à mon package de déploiement et rendre le package compatible avec Lambda ?

Dernière mise à jour : 26-04-2022

J'ai utilisé pip pour installer un package Python qui contient du code compilé et maintenant ma fonction AWS Lambda renvoie une erreur « Impossible d'importer le module ». D'où vient le problème et comment le résoudre ?

Brève description

Les packages Python qui contiennent du code compilé (par exemple : NumPy et pandas) ne sont pas toujours compatibles avec les environnements d'exécution Lambda par défaut. Si vous installez ces packages à l'aide de pip, alors les packages téléchargent et compilent un package module-name pour l’architecture de l’ordinateur local. Cela rend votre package de déploiement incompatible avec Lambda si vous n’utilisez pas un système d'exploitation Linux.

Pour créer un package de déploiement Lambda ou une couche compatible avec les environnements d'exécution Lambda Python lors de l'utilisation de pip en dehors du système d'exploitation Linux, procédez comme suit :

1.    Téléchargez votre package Python précompilé sous forme de fichier wheel (.whl).

2.    Exécutez la commande pip install avec manylinux2014 comme valeur pour le paramètre de la --plateforme.

Remarque : Les étiquettes macOS --plateforme ne fonctionnent pas. Par exemple : les étiquettes win_amd64 and macosx_10_6_intel n'installeront pas de package de déploiement compatible avec Lambda.

Résolution

Remarque : Cet exemple de procédure montre comment installer pandas pour l’environnement d'exécution Lambda Python 3.9 qui s'exécute sur une architecture x86_64.

1.    Ouvrez une invite de commande. Ensuite, confirmez que vous utilisez une version de pip 19.3.0 ou plus récente en exécutant la commande pip suivante :

pip --version

Si vous utilisez une version de pip antérieure à la version 19.3.0, effectuez une mise à niveau vers la dernière version de pip en exécutant la commande suivante :

python3.9 -m pip install --upgrade pip

2.    Installez le fichier .whl du package Python précompilé en tant que dépendance dans le répertoire de projet de votre fonction Lambda en exécutant la commande suivante :

Important : Remplacez my-lambda-function par le nom du répertoire de projet de votre fonction.

pip install \
    --platform manylinux2014_x86_64 \
    --target=my-lambda-function \
    --implementation cp \
    --python 3.9 \
    --only-binary=:all: --upgrade \
    pandas

3.    Ouvrez le répertoire de projet de votre fonction Lambda. Si vous utilisez macOS, exécutez la commande suivante :

cd my-lambda-function

4.    Dans un éditeur de texte, créez un nouveau fichier nommé lambda_function.py. Ensuite, copiez et collez l'exemple de code suivant dans le fichier et enregistrez-le dans le répertoire de projet de votre fonction Lambda :

import numpy as np
import pandas as pd
def lambda_handler(event, context):
    df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=["a", "b", "c"])
    number = np.pi
    print(df2)
    print(number)

5.    Créez une archive de fichier .zip de package de déploiement Lambda qui inclut toutes les bibliothèques installées et le code source en exécutant la commande suivante :

zip -r ../my-deployment-package.zip .

6.    Utilisez l'archive de fichier my-deployment-package.zip pour créer une nouvelle fonction Lambda Python 3.9 ou pour mettre à jour une fonction existante. Pour obtenir des instructions, consultez Déployer votre fichier .zip vers la fonction dans le Guide du développeur AWS Lambda.

Remarque : Vous pouvez utiliser une procédure similaire pour créer une couche Lambda pouvant être utilisée dans plusieurs fonctions. Par exemple, la commande suivante crée une nouvelle couche Lambda pour installer des pandas pour l’environnement d'exécution Lambda Python 3.9 qui s’exécute sur l'architecture arm64 :

pip install \
    --platform manylinux2014_aarch64 \
    --target=./python/lib/python3.9/site-packages \
    --implementation cp \
    --python 3.9 \
    --only-binary=:all: --upgrade \
    pandas

Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?