Comment puis-je corriger les erreurs « ClassNotFoundException » et « NoSuchMethodError » liées à une fonction Lambda en Java ?

Lecture de 6 minute(s)
0

Lorsque j’essaie d’invoquer une fonction AWS Lambda en Java, les messages d’erreur « ClassNotFoundException » ou « NoSuchMethodError » s’affichent. Comment puis-je corriger ces erreurs ?

Brève description

L’erreur ClassNotFoundException se produit lorsqu’un environnement d’exécution Java charge une classe par son nom complet, mais ne parvient pas à la localiser.

Remarque : en langage Java, un nom de classe complet inclut un package de déploiement et le nom de la classe.

L’erreur NoSuchMethodError se produit lorsqu’une version de dépendance référencée diffère de la version empaquetée.

Pour plus d’informations sur la structure du package de déploiement d’une fonction Lambda en Java, consultez Déploiement de fonction Lambda en langage Java à l’aide d’archives de fichiers .zip ou JAR.

Résolution

Remarque : si des erreurs surviennent lors de l’exécution des commandes de l’interface de la ligne de commande AWS (AWS CLI), vérifiez que vous utilisez bien la version la plus récente de l’AWS CLI.

Télécharger le package de déploiement de la fonction Lambda

Pour afficher la structure de fichiers du package de déploiement de votre fonction Lambda, effectuez l’une des opérations suivantes :

Pour télécharger le package de déploiement de la fonction en exécutant la commande zipinfo

Exécutez la commande zipinfo suivante :

Important : remplacez my-deployment-package.zip par le nom de fichier du package de déploiement. La commande suivante n’est valide que pour les systèmes d’exploitation Linux, Unix et macOS.

$ zipinfo my-deployment-package.zip

Pour télécharger le package de déploiement de la fonction en exécutant la commande Lambda get-function de l’AWS CLI

Exécutez la commande get-function suivante :

Important : remplacez my-function par le nom de la fonction Lambda.

aws lambda get-function \
    --function-name  my-function

La sortie de la commande fournit une URL présignée que vous pouvez utiliser pour télécharger le fichier. Pour plus d’informations, consultez Récupération d’une fonction Lambda.

Pour télécharger le package de déploiement de la fonction depuis la console Lambda

1.    Sur la page Fonctions de la console Lambda, choisissez votre fonction.

2.    Choisissez Actions.

3.    Choisissez Exporter la fonction.

4.    Dans la boîte de dialogue Exporter votre fonction, choisissez Télécharger un package de déploiement.

Vérification du nom de la méthode du gestionnaire de fonction

Pour plus d’informations, consultez Gestionnaire de fonction AWS Lambda en langage Java.

Rechercher d’éventuels problèmes de pipeline CI/CD

Si vous utilisez un pipeline d’intégration et de livraison continues (CI/CD) pour empaqueter et déployer votre fonction, vérifiez les points suivants :

  • Toutes les dépendances requises ont été empaquetées avec la fonction.
  • La version de toutes les dépendances référencées est correcte.
  • Il existe une URL de compartiment Amazon Simple Storage Service (Amazon S3) qui pointe vers la dernière version d’un fichier.
    Remarque : une URL de compartiment Amazon S3 n’est requise que si vous utilisez une source de compartiment Amazon S3 et que la gestion des versions de compartiment est activée.
  • Les modifications de code ont été déployées avant le déploiement de la configuration modifiée du gestionnaire.
    Remarque : Lambda ne dispose pas d’un mécanisme permettant de mettre à jour le code et la configuration en appliquant une seule modification atomique.

Rechercher d’éventuels problèmes avec les fichiers de classe

Vérifiez que les conditions suivantes sont remplies pour la classe nommée dans l’erreur ClassNotFoundException :

  • La classe est incluse dans le package de déploiement.
    Remarque : si la classe est introuvable, elle n’a peut-être pas été empaquetée dans le package de déploiement que vous avez créé.
  • Son nom de classe empaquetée est identique à la valeur du gestionnaire de votre fonction.
  • Elle se trouve dans le répertoire /lib ou le répertoire racine.
  • Si elle est référencée en tant que couche Lambda, son contenu n’a pas été extrait dans un répertoire autre que java/lib.
  • La version est identique à celle de la classe empaquetée avec votre fonction. Si la classe n’a pas la même version, vérifiez si votre machine locale avait une version différente de celle que vous avez empaquetée.

Recherche d’éventuels problèmes avec les fichiers JAR

Vérifiez si la fonction s’exécute comme prévu sur une machine locale ou à partir d’un modèle d’application sans serveur AWS (AWS SAM). Si la fonction échoue uniquement lorsqu’elle est invoquée depuis Lambda, il peut y avoir des problèmes avec les dépendances référencées (fichiers JAR).

Astuce : envisagez d’utiliser l’environnement de développement intégré (IDE) Eclipse pour créer vos fonctions Lambda en langage Java. La création d’un projet à l’aide des plug-ins disponibles dans Eclipse configure automatiquement le projet pour une création correcte. Pour plus d’informations, consultez Utilisation de Lambda avec le plug-in AWS Toolkit pour Eclipse.

Vérifiez que les conditions suivantes sont remplies pour les fichiers JAR situés dans un répertoire local et spécifiés dans une variable d’environnement CLASSPATH Java :

  • Les fichiers sont inclus dans le package de déploiement de votre fonction.
    Remarque : si les fichiers JAR référencés sont introuvables, il se peut qu’ils n’aient pas été empaquetés lorsque vous avez créé le package de déploiement.
  • La version des fichiers est identique à celle des fichiers du package de déploiement.

S’il manque des fichiers ou si leur version est incorrecte, copiez toutes les dépendances (fichiers JAR) dans le répertoire /lib ou le répertoire racine. Assurez-vous de faire référence aux bonnes versions. Téléchargez ensuite le contenu compressé.

Remarque : si vous utilisez un outil de création tel qu’Apache Maven ou Gradle, assurez-vous d’installer les plug-ins requis lors de la création de l’artefact de déploiement. Par exemple, vous pouvez utiliser le plug-in Apache Maven Shade.

Rechercher d’éventuels problèmes d’autorisation

Lambda exige que les fichiers zip du package disposent d’autorisations de lecture globales. Pour plus d’informations, consultez Comment puis-je corriger les erreurs « autorisation refusée » ou « impossible d’importer le module » qui surviennent lors du téléchargement d’un package de déploiement Lambda ?

Important : après avoir identifié et résolu les problèmes, vous devez empaqueter et charger manuellement votre fonction Lambda pour la déployer. Vérifiez ensuite si le message d’erreur persiste.


Informations connexes

Erreurs liées à une fonction AWS Lambda en langage Java

Instrumentation de code Java dans AWS Lambda

Inclusion de dépendances de bibliothèque dans une couche

Bonnes pratiques d’utilisation des fonctions AWS Lambda

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans