Utilisation de couches pour les fonctions Lambda Node.js - 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 Lambda Node.js

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. Empaquetez le contenu de votre couche. Cela signifie 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 Lambda Node.js avec des dépendances de bibliothèque externes.

Prérequis

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

Tout au long de cette rubrique, nous faisons référence à l’exemple d’application layer-nodejs dans le référentiel GitHub aws-lambda-developer-guide. Cette application contient des scripts qui téléchargent une dépendance et l’empaquetent dans une couche. L’application contient également des fonctions correspondantes qui utilisent la dépendance de la couche. Après avoir créé une couche, vous pouvez déployer et invoquer la fonction correspondante pour vérifier que tout fonctionne. Cet exemple d’application utilise l’environnement d’exécution Node.js 20. Si vous ajoutez des dépendances supplémentaires à votre couche, elles doivent être compatibles avec Node.js 20.

L’exemple d’application layer-nodejs va empaqueter la bibliothèque lodash dans une couche Lambda. Le répertoire layer contient les scripts permettant de générer la couche. Le répertoire function contient un exemple de fonction permettant de vérifier le fonctionnement de la couche. Ce document explique comment créer, empaqueter, déployer et tester cette couche.

Compatibilité de la couche Node.js avec l’environnement d’exécution Lambda

Lorsque vous empaquetez du code dans une couche Node.js, vous spécifiez les environnements d’exécution Lambda avec lesquelles le code est compatible. Pour évaluer la compatibilité du code avec un environnement d’exécution, déterminez les versions de Node.js, les systèmes d’exploitation et les architectures de jeu d’instructions pour lesquelles le code est conçu.

Les environnements d’exécution Lambda Node.js spécifient leur version Node.js et leur système d’exploitation. Dans ce document, vous allez utiliser l’environnement d’exécution Node.js 20, basée sur AL2023. Pour plus d’informations sur les versions d’environnements d’exécution, consultez Environnements d'exécution pris en charge. Lorsque vous créez cette fonction Lambda, vous pouvez spécifier l’architecture de l’ensemble des instructions. Dans ce document, vous utiliserez l’architecture arm64. Pour plus d’informations sur les architectures dans Lambda, consultez Sélection et configuration d’une architecture de jeu d’instructions pour votre fonction Lambda.

Lorsque vous utilisez le code fourni dans un package, chaque responsable du package définit indépendamment sa compatibilité. La plupart des développements Node.js sont conçus pour fonctionner indépendamment du système d’exploitation et de l’architecture du jeu d’instructions. De plus, il n’est pas courant de rompre les incompatibilités avec les nouvelles versions de Node.js. Attendez-vous à passer plus de temps à évaluer la compatibilité entre les packages qu’à évaluer la compatibilité des packages avec la version de Node.js, le système d’exploitation ou l’architecture du jeu d’instructions.

Parfois, les packages Node.js incluent du code compilé, ce qui vous oblige à prendre en compte la compatibilité du système d’exploitation et de l’architecture du jeu d’instructions. Si vous devez évaluer la compatibilité du code de vos packages, il est nécessaire d’inspecter les packages et leur documentation. Dans NPM, les packages peuvent spécifier leur compatibilité via les champs engines, os et cpu de leur fichier manifeste package.json. Pour plus d’informations sur les fichiers package.json, consultez package.json dans la documentation NPM.

Chemins d’accès de couche des environnements d’exécution Node.js

Lorsque vous ajoutez une couche à une fonction, Lambda charge le contenu de la couche dans l’environnement d’exécution. Si votre couche regroupe les dépendances dans des chemins de dossier spécifiques, l’environnement d’exécution Node.js reconnaîtra les modules et vous pourrez les référencer à partir de votre code de fonction.

Pour vous assurer que vos modules sont sélectionnés, empaquez-les dans le fichier .zip de votre couche dans l’un des chemins de dossier suivants. Ces fichiers sont stockés dans /opt et les chemins d’accès aux dossiers sont chargés dans la variable d’environnement PATH.

  • nodejs/node_modules

  • nodejs/nodeX/node_modules

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

layer_content.zip └ nodejs └ node20 └ node_modules └ lodash └ <other potential dependencies> └ ...

Vous allez placer la bibliothèque lodash dans le répertoire nodejs/node20/node_modules. Cela garantit que Lambda peut localiser la bibliothèque lors des appels de fonctions.

Empaquetage du contenu de la couche

Dans cet exemple, vous allez empaqueter la bibliothèque lodash dans un fichier .zip de couche. Pour installer et empaqueter le contenu de la couche, complétez les étapes suivantes.

Pour installer et empaqueter le contenu de votre couche
  1. Clonez le référentiel aws-lambda-developer-guide depuis GitHub, qui contient l’exemple de code dont vous avez besoin dans le répertoire sample-apps/layer-nodejs.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Accédez au répertoire layer de l’exemple d’application layer-nodejs. 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-nodejs/layer
  3. Vérifiez les listes lodash du fichier package.json. Ce fichier définit les dépendances que vous souhaitez inclure dans la couche. Vous pouvez mettre à jour ce fichier pour inclure toutes les dépendances que vous souhaitez intégrer dans votre couche.

    Note

    Le package.json utilisé dans cette étape n’est pas stocké ou utilisé avec vos dépendances après qu’elles aient été chargées dans une couche Lambda. Il n’est utilisé que dans le processus d’empaquetage des couches et ne spécifie aucune commande d’exécution ni aucune compatibilité, comme le ferait le fichier dans une application Node.js ou un package publié.

  4. Assurez-vous que vous disposez de l’autorisation shell pour exécuter les scripts du répertoire layer.

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

    ./1-install.sh

    Ce script exécute npm install, qui lit votre package.json et télécharge les dépendances qui y sont définies.

    Exemple 1-install.sh
    npm install .
  6. Exécutez le script 2-package.sh à l’aide de la commande suivante :

    ./2-package.sh

    Ce script copie le contenu du répertoire node_modules dans un nouveau répertoire nommé nodejs/node20. Compressez le contenu du répertoire nodejs dans un fichier nommé layer_content.zip. Il s’agit du fichier .zip pour votre couche. Vous pouvez décompresser le fichier et vérifier qu’il contient la bonne structure de fichier, comme indiqué dans la section Chemins d’accès de couche des environnements d’exécution Node.js.

    Exemple 2-package.sh
    mkdir -p nodejs/node20 cp -r node_modules nodejs/node20/ zip -r layer_content.zip nodejs

Création de la couche

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

aws lambda publish-layer-version --layer-name nodejs-lodash-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes nodejs20.x \ --compatible-architectures "arm64"

Dans la réponse, notez le LayerVersionArn, qui ressemble à arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1. Vous aurez besoin de cet Amazon Resource Name (ARN) à l’étape suivante de ce tutoriel, lorsque vous ajouterez la couche à votre fonction.

Ajout de la couche à votre fonction

Déployez un exemple de fonction Lambda qui utilise la bibliothèque lodash dans son code de fonction, puis attachez la couche que vous avez créée. Pour déployer la fonction, vous avez besoin d’un rôle d’exécution. Pour en savoir plus, consultez Définition des autorisations de fonction Lambda avec un rôle d’exécution. Si vous ne disposez pas d’un rôle d’exécution existant, suivez les étapes de la section réductible. 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 stratégie AWSLambdaBasicExecutionRole possède les autorisations dont la fonction a besoin pour écrire des journaux dans CloudWatch Logs.

L’exemple de code de fonction utilise la méthode lodash _.findLastIndex pour lire un tableau d’objets. Il compare les objets par rapport à un critère pour trouver l’index d’une correspondance. Il renvoie ensuite l’index et la valeur de l’objet dans la réponse Lambda.

import _ from "lodash" export const handler = async (event) => { var users = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; };
Pour déployer la fonction Lambda
  1. Accédez au répertoire function/. Si vous êtes actuellement dans le répertoire layer/, exécutez la commande suivante :

    cd ../function-js
  2. Créez un package de déploiement sous forme de fichier .zip à l’aide de la commande suivante :

    zip my_deployment_package.zip index.mjs
  3. Déployez la fonction. Dans la commande AWS CLI suivante, remplacez le paramètre --role par l’ARN de votre rôle d’exécution :

    aws lambda create-function --function-name nodejs_function_with_layer \ --runtime nodejs20.x \ --architectures "arm64" \ --handler index.handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. Attachez la couche à votre fonction. Dans la commande AWS CLI suivante, remplacez le paramètre --layers par l’ARN de la version de couche que vous avez indiqué précédemment :

    aws lambda update-function-configuration --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1"
  5. Invoquez votre fonction pour vérifier qu’elle fonctionne à l’aide de la commande AWS CLI suivante :

    aws lambda invoke --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{}' response.json

    Vous devriez obtenir un résultat du type suivant :

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

    Le fichier de sortie response.json contient les détails de la réponse.

Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant des ressources AWS que vous n'utilisez plus, vous évitez les frais superflus 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 de 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).