Comment résoudre les erreurs « unknown service » (service inconnu), « parameter validation failed » (échec de validation du paramètre) ou « object has no attribute » (l'objet n'a pas d'attribut) à partir d'une fonction Lambda Python (Boto 3) ?

Dernière mise à jour : 29/11/2021

Ma fonction AWS Lambda Python (Boto 3) renvoie des erreurs « unknown service » (service inconnu), « parameter validation failed » (échec de validation du paramètre) ou « object has no attribute » (l'objet n'a pas d'attribut). Pourquoi ma fonction renvoie ces erreurs et comment puis-je résoudre le problème ?

Brève description

Une fonction Lambda Python (Boto 3) qui n'utilise pas la dernière version de Boto 3 peut renvoyer l'une des erreurs suivantes :

  • unknown service (service inconnu)
  • parameter validation failed (échec de validation des paramètres)
  • object has no attribute (l'objet n'a aucun attribut)

Ces erreurs se produisent lorsque la fonction tente d'appeler un service AWS ou une API AWS qui nécessite la dernière version de Boto 3.

Pour résoudre le problème, créez une couche Lambda qui utilise la dernière version de Boto 3. Ajoutez ensuite la couche à la configuration de votre fonction.

Important : les procédures suivantes supposent que vous utilisez la dernière version de Botocore. Si vous n'utilisez pas la dernière version de Botocore, vous devez mettre à niveau Botocore avant de pouvoir passer à la dernière version de Boto 3. Adaptez les étapes que vous exécutez en fonction de votre système d'exploitation et de votre configuration Python.

Résolution

Remarque : si des erreurs se produisent lors de l'exécution de commandes AWS Command Line Interface (AWS CLI), vérifiez que vous utilisez la version la plus récente de l'AWS CLI.

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.

(Prérequis) Installez pip3 et la dernière version de l'interface de l'AWS CLI

1.    Si ce n'est déjà fait, installez pip3 pour l'empaquetage Python 3. -ou- Si vous avez une version précédente de pip, mettez-la à niveau.

2.    Installez ou mettez à niveau l'AWS CLI à l'aide de pip3. Remarque : La dernière version de l'AWS CLI inclut le modèle d'API de couches Lambda.

Créez une couche Lambda qui utilise la dernière version de Boto 3

Remarque : les commandes AWS CLI suivantes fonctionnent uniquement pour les systèmes d'exploitation Linux, Unix et macOS. Dans chaque commande, assurez-vous de remplacer boto3-mylayer par votre nom préféré pour le dossier lib et la couche Lambda.

1.    Créez un dossier lib en exécutant la commande suivante :

LIB_DIR=boto3-mylayer/python
mkdir -p $LIB_DIR

2.    Installez la bibliothèque dans LIB_DIR en exécutant la commande suivante :

pip3 install boto3 -t $LIB_DIR

3.    Compressez toutes les dépendances dans /tmp/boto3-mylayer.zip en exécutant la commande suivante :

cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip .

4.    Publiez la couche en exécutant 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 d'ARN de couche Lambda

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 :

Remarque : remplacez myfunction par le nom de votre fonction. Remplacez<layer ARN> par l'ARN de votre couche.

aws lambda update-function-configuration --function-name myfunction --layers <layer ARN>

Tous les services et arguments AWS sont désormais disponibles pour votre fonction Lambda.

Astuce : utilisez print(boto3.__version__) et print(botocore.__version__) dans le code de votre fonction pour vérifier la version de Boto 3 et Botocore.