La fonction AWS Lambda de My Python (Boto3) renvoie les erreurs « unknown service », « parameter validation failed » ou « object has no attribute ».
Brève description
Une fonction Python (Boto3) qui n'utilise pas la dernière version de Boto3 peut renvoyer les erreurs suivantes :
- service inconnu
- échec de la validation des paramètres
- l'objet n'a pas d'attribut
Ces erreurs se produisent lorsque la fonction essaie d'appeler un service AWS ou une API AWS nécessitant la dernière version de Boto3.
Pour résoudre ce problème, créez une couche Lambda qui utilise la dernière version de Boto3. Vous pouvez créer une couche Lambda manuellement ou avec Docker. Il est recommandé de mettre à niveau votre couche Lambda via Docker afin de vous assurer que vos fichiers binaires sont adaptés au système d'exploitation Lambda.
Important : Les procédures suivantes supposent que vous disposez de la dernière version de Botocore. Si vous ne disposez pas de la dernière version de Botocore, vous devez effectuer la mise à niveau de Botocore avant de pouvoir passer à la dernière version de Boto3. Pour en savoir plus, consultez la page botocore sur le site Web de GitHub.
Résolution
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.
Il est recommandé de créer une couche Lambda sur le même système d'exploitation que celui sur lequel repose votre environnement d'exécution Lambda. Par exemple, les versions 3.8 et 3.9 de Python sont basées sur une Amazon Machine Image (AMI) Amazon Linux 2. Toutefois, Python 3.7 et Python 3.6 sont basés sur l'AMI Amazon Linux.
Prérequis :
- Installez le package pip3 pour Python 3. Ou, si vous possédez une version précédente de pip, mettez-la à niveau. Pour en savoir plus, consultez la page Installation du site Web de pip.
- Installez ou mettez à jour l'AWS CLI avec pip3.
**Remarque :**La dernière version de l'interface de ligne de commande AWS inclut le modèle d'API Lambda Layers.
Utilisez Docker pour créer ou mettre à jour une couche Lambda qui utilise la dernière version de Boto3
Prérequis : Installez Docker sur votre système. Pour télécharger la dernière version de Docker, consultez la section Installation de Docker.
Créez et appliquez votre couche
Procédez comme suit :
-
Accédez au répertoire dans lequel vous souhaitez créer le fichier de couches.
-
Exécutez la commande suivante dans l'interface de ligne de commande de votre système :
docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/python:3.9.2023.03.21.20" /bin/sh -c "mkdir -p /tmp/python && pip3 install boto3 -t /tmp/python && cd /tmp && yum install -y zip && zip -r /var/task/boto3-mylayer.zip ."
Remarque : Remplacez public.ecr.aws/lambda/python:3.9.2023.03.21.20 par l'image de base de votre version de Python. Remplacez boto3-mylayer par un nom personnalisé pour votre package.
Une fois l'exécution de la commande terminée, un fichier portant le nom de votre package s'affiche dans le répertoire actuel, tel que boto3-mylayer.zip.
-
Pour créer ou mettre à jour votre couche Lambda, exécutez la commande suivante :
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb://boto3-mylayer.zip --compatible-runtimes python3.9 --region REGION_NAME
**Remarque :**Remplacez boto3-mylayer par le nom de votre package. Remplacez REGION_NAME par votre Région AWS. Incluez également les environnements d'exécution compatibles que vous avez spécifiés précédemment.
Créez manuellement une couche Lambda qui utilise la dernière version de Boto3
Les commandes de l'interface de ligne de commande AWS suivantes fonctionnent pour les systèmes d'exploitation Linux, Unix et macOS.
Remarque : Dans chaque commande, veillez à remplacer boto3-mylayer par le nom que vous préférez pour le dossier lib et la couche Lambda.
Procédez comme suit :
-
Créez un dossier lib :
LIB_DIR=boto3-mylayer/pythonmkdir
-
Installez la bibliothèque dans LIB_DIR.
pip3 install boto3 -t $LIB_DIR
-
Pour compresser toutes les dépendances dans ** /tmp/boto3-mylayer.zip**, exécutez la commande suivante.
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip
-
Pour publier la couche, exécutez la commande suivante.
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip
La commande renvoie l’Amazon Resource Name (ARN) de la nouvelle couche.
Exemple de sortie :
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
Ajoutez la nouvelle couche à la configuration de votre fonction Lambda
Pour ajouter la nouvelle couche à la configuration de votre fonction Lambda, exécutez la commande suivante :
aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN
Remarque : Remplacez MY_FUNCTION par le nom de votre fonction. Remplacez LAYER_ARN par l'ARN de votre couche.
Tous les services et arguments AWS sont maintenant disponibles pour votre fonction Lambda.
Pour confirmer la version de Boto3 et de Botocore, utilisez print(boto3.__version__) et print(botocore.__version__) dans votre code de fonction.
Informations connexes
Création de fonctions Lambda avec Python
Utilisation d'archives de fichiers .zip pour les fonctions Python Lambda