Utilisation de couches pour les fonctions Java Lambda - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de couches pour les fonctions Java Lambda

Une couche Lambda est une archive de fichier .zip qui contient du code ou des données supplémentaires. Les couches contiennent généralement des dépendances de bibliothèque, une exécution personnalisée, ou des fichiers de configuration. La création d'une couche implique trois étapes générales :

  1. Package le contenu de votre couche. Cela implique de créer une archive de fichiers .zip contenant les dépendances que vous souhaitez utiliser dans vos fonctions.

  2. Créez la couche dans Lambda.

  3. Ajoutez la couche à vos fonctions.

Cette rubrique contient des étapes et des conseils sur la manière d'empaqueter et de créer correctement une couche Java Lambda avec des dépendances de bibliothèque externes.

Prérequis

Pour suivre les étapes décrites dans cette section, vous devez disposer des éléments suivants :

Note

Assurez-vous que la version Java à laquelle Maven fait référence est identique à la version Java de la fonction que vous souhaitez déployer. Par exemple, pour une fonction Java 21, la mvn -v commande doit indiquer la version 21 de Java dans la sortie :

Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...

Tout au long de cette rubrique, nous faisons référence à l'layer-javaexemple d'application sur le référentiel awsdocs GitHub . Cette application contient des scripts qui téléchargent les dépendances et génèrent la couche. L'application contient également une fonction correspondante qui utilise les dépendances de la couche. Après avoir créé une couche, vous pouvez déployer et invoquer la fonction correspondante pour vérifier que tout fonctionne correctement. Comme vous utilisez le runtime Java 21 pour les fonctions, les couches doivent également être compatibles avec Java 21.

L'layer-javaexemple d'application contient un seul exemple dans deux sous-répertoires. Le layer répertoire contient un pom.xml fichier qui définit les dépendances des couches, ainsi que des scripts permettant de générer la couche. Le function répertoire contient un exemple de fonction permettant de vérifier le fonctionnement de la couche. Ce didacticiel explique comment créer et empaqueter cette couche.

Compatibilité de la couche Java avec Amazon Linux

La première étape de la création d'une couche consiste à regrouper l'ensemble du contenu de la couche dans une archive de fichiers .zip. Parce que les fonctions Lambda s'exécutent sur Amazon Linux, le contenu de votre couche doit pouvoir être compilé et construit dans un environnement Linux.

Le code Java est conçu pour être indépendant de la plate-forme. Vous pouvez donc empaqueter vos couches sur votre machine locale même si celle-ci n'utilise pas d'environnement Linux. Une fois que vous aurez chargé la couche Java sur Lambda, elle sera toujours compatible avec Amazon Linux.

Chemins de couche pour les environnements d'exécution Java

Lorsque vous ajoutez une couche à une fonction, Lambda charge le contenu de la couche dans le répertoire /opt de cet environnement d’exécution. Pour chaque exécution Lambda, la variable PATH inclut déjà des chemins de dossiers spécifiques dans le répertoire /opt. Pour garantir que la PATH variable capte le contenu de votre couche, le fichier .zip de votre couche doit avoir ses dépendances dans les chemins de dossier suivants :

  • java/lib

Par exemple, le fichier de couche .zip obtenu que vous créez dans ce didacticiel possède la structure de répertoire suivante :

layer_content.zip └ java └ lib └ layer-java-layer-1.0-SNAPSHOT.jar

Le fichier layer-java-layer-1.0-SNAPSHOT.jar JAR (un uber-jar contenant toutes les dépendances requises) est correctement situé dans le répertoire. java/lib Cela garantit que Lambda peut localiser la bibliothèque lors des appels de fonctions.

Empaqueter le contenu de la couche

Dans cet exemple, vous regroupez les deux bibliothèques Java suivantes dans un seul fichier JAR :

  • aws-lambda-java-core— Un ensemble minimal de définitions d'interface pour travailler avec Java dans AWS Lambda

  • Jackson — Une suite populaire d'outils de traitement de données, en particulier pour travailler avec JSON.

Procédez comme suit pour installer et empaqueter le contenu de la couche.

Pour installer et empaqueter le contenu de votre couche
  1. Clonez le aws-lambda-developer-guide GitHub dépôt, qui contient l'exemple de code dont vous avez besoin dans le sample-apps/layer-java répertoire.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Accédez au layer répertoire de l'layer-javaexemple d'application. Ce répertoire contient les scripts que vous utilisez pour créer et empaqueter correctement la couche.

    cd aws-lambda-developer-guide/sample-apps/layer-java/layer
  3. Examinez le pom.xmlfichier. Dans <dependencies> cette section, vous définissez les dépendances que vous souhaitez inclure dans la couche, à savoir les jackson-databind bibliothèques aws-lambda-java-core et. Vous pouvez mettre à jour ce fichier pour inclure les dépendances que vous souhaitez inclure dans votre propre couche.

    Exemple pom.xml
    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
    Note

    La <build> section de ce pom.xml fichier contient deux plugins. maven-compiler-pluginCompile ensuite le code source. Ils maven-shade-pluginempaquetent vos artefacts dans un seul uber-jar.

  4. Vérifiez que vous êtes autorisé à exécuter les deux scripts.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Exécutez le 1-install.shscript à l'aide de la commande suivante :

    ./1-install.sh

    Ce script s'exécute mvn clean install dans le répertoire en cours. Cela crée l'uber-jar avec toutes les dépendances requises dans le répertoire. target/

    Exemple 1-install.sh
    mvn clean install
  6. Exécutez le 2-package.shscript à l'aide de la commande suivante :

    ./2-package.sh

    Ce script crée la structure de java/lib répertoire dont vous avez besoin pour empaqueter correctement le contenu de votre couche. Il copie ensuite le fichier uber-jar du /target répertoire dans le répertoire nouvellement créé. java/lib Enfin, le script compresse le contenu du java répertoire dans un fichier nommélayer_content.zip. Il s'agit du fichier .zip de votre couche. Vous pouvez décompresser le fichier et vérifier qu'il contient la bonne structure de fichier, comme indiqué dans la Chemins de couche pour les environnements d'exécution Java section.

    Exemple 2-package.sh
    mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java

Création de la couche

Dans cette section, vous allez prendre le layer_content.zip fichier que vous avez généré dans la section précédente et le télécharger en tant que couche Lambda. Vous pouvez télécharger une couche à l'aide de l'API Lambda AWS Management Console ou de l'API Lambda via le AWS Command Line Interface ()AWS CLI. Lorsque vous téléchargez le fichier .zip de votre couche, dans la PublishLayerVersion AWS CLI commande suivante, spécifiez java21 comme environnement d'exécution compatible et arm64 comme architecture compatible.

aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"

Dans la réponse, notez leLayerVersionArn, qui ressemble àarn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1. Vous aurez besoin de cet Amazon Resource Name (ARN) à l'étape suivante de ce didacticiel, lorsque vous ajouterez la couche à votre fonction.

Ajouter la couche à votre fonction

Dans cette section, vous déployez un exemple de fonction Lambda qui utilise la bibliothèque Jackson dans son code de fonction, puis vous attachez la couche. Pour déployer la fonction, vous avez besoin d'unDéfinition des autorisations d'une fonction Lambda avec un rôle d'exécution. Si vous n'avez pas de rôle d'exécution existant, suivez les étapes décrites dans la section pliable. Sinon, passez à la section suivante pour déployer la fonction.

Pour créer un rôle d’exécution
  1. Ouvrez la page Roles (Rôles) dans la console IAM.

  2. Sélectionnez Créer un rôle.

  3. Créez un rôle avec les propriétés suivantes :

    • Entité de confianceLambda.

    • AutorisationsAWSLambdaBasicExecutionRole.

    • Nom de rôlelambda-role.

    La AWSLambdaBasicExecutionRolepolitique dispose des autorisations dont la fonction a besoin pour écrire des CloudWatch journaux dans Logs.

Pour déployer la fonction Lambda
  1. Accédez au répertoire function/. Si vous vous trouvez actuellement dans le layer/ répertoire, exécutez la commande suivante :

    cd ../function
  2. Vérifiez le code de fonction. La fonction prend un Map<String, String> as en entrée et utilise Jackson pour écrire l'entrée sous forme de chaîne JSON avant de la convertir en un objet Java F1Car prédéfini. Enfin, la fonction utilise les champs de l'objet F1Car pour créer une chaîne qu'elle renvoie.

    package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
  3. Créez le projet à l'aide de la commande Maven suivante :

    mvn package

    Cette commande produit un fichier JAR dans le target/ répertoire nommélayer-java-function-1.0-SNAPSHOT.jar.

  4. Déployez la fonction. Dans la AWS CLI commande suivante, remplacez le --role paramètre par l'ARN de votre rôle d'exécution :

    aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar

À ce stade, vous pouvez éventuellement essayer d'appeler votre fonction avant d'attacher la couche. Si vous essayez cela, vous devriez obtenir un ClassNotFoundException car votre fonction ne peut pas référencer le requests package. Pour appeler votre fonction, utilisez la AWS CLI commande suivante :

aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

Vous devriez obtenir un résultat du type suivant :

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Pour afficher l'erreur spécifique, ouvrez le response.json fichier de sortie. Le message ClassNotFoundException d'erreur suivant devrait s'afficher :

"errorMessage":"com.fasterxml.jackson.databind.ObjectMapper","errorType":"java.lang.ClassNotFoundException"

Ensuite, attachez la couche à votre fonction. Dans la AWS CLI commande suivante, remplacez le --layers paramètre par l'ARN de la version de couche que vous avez indiqué précédemment :

aws lambda update-function-configuration --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1"

Enfin, essayez d'appeler votre fonction à l'aide de la AWS CLI commande suivante :

aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

Vous devriez obtenir un résultat du type suivant :

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }

Cela indique que la fonction a pu utiliser la dépendance de Jackson pour exécuter correctement la fonction. Vous pouvez vérifier que le response.json fichier de sortie contient la bonne chaîne renvoyée :

"Max Verstappen is a driver for team Red Bull"

Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant AWS les ressources que vous n'utilisez plus, vous évitez des frais inutiles pour votre Compte AWS.

Pour supprimer la couche Lambda
  1. Ouvrez la page Couches de la console Lambda.

  2. Sélectionnez la couche que vous avez créée.

  3. Choisissez Supprimer, puis sélectionnez à nouveau Supprimer.

Pour supprimer la fonction Lambda
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Sélectionnez la fonction que vous avez créée.

  3. Sélectionnez Actions, Supprimer.

  4. Saisissez delete dans la zone de saisie de texte et choisissez Delete (Supprimer).