AWS Lambda gestionnaire de fonctions dans 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.

AWS Lambda gestionnaire de fonctions dans Node.js

Le gestionnaire de fonction Lambda est la méthode dans votre code de fonction qui traite les événements. Lorsque votre fonction est invoquée, Lambda exécute la méthode du gestionnaire. Votre fonction s’exécute jusqu’à ce que le gestionnaire renvoie une réponse, se ferme ou expire.

L'exemple de fonction suivant enregistre le contenu de l'objet d'événement et renvoie l'emplacement des journaux.

Note

Cette page présente des exemples de gestionnaires de modules CommonJS et ES. Pour en savoir plus sur la différence entre ces deux types de gestionnaires, consultez Désignation d’un gestionnaire de fonctions en tant que module ES.

ES module handler
export const handler = async (event, context) => { console.log("EVENT: \n" + JSON.stringify(event, null, 2)); return context.logStreamName; };
CommonJS module handler
exports.handler = async function (event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)); return context.logStreamName; };

Lorsque vous configurez une fonction, la valeur du paramètre du gestionnaire est le nom du fichier et le nom de la méthode du gestionnaire exporté, séparés par un point. La valeur par défaut dans la console et pour les exemples de ce guide est index.handler. Cela indique la méthode handler qui est exportée à partir du fichier index.js.

L’exécution transmet des arguments à la méthode du gestionnaire. Le premier argument est l’objet event, qui contient les informations de l’appelant. L’appelant transmet ces informations sous la forme d’une chaîne au format JSON lorsqu’il appelle Invoke, et l’environnement d’exécution les convertit en objet. Lorsqu'un AWS service invoque votre fonction, la structure de l'événement varie d'un service à l'autre.

Le deuxième argument est l’objet de contexte, qui contient des informations sur l’invocation, la fonction et l’environnement d’exécution. Dans l’exemple précédent, la fonction obtient le nom du flux de journaux de l’objet de contexte et le renvoie au mécanisme d’invocation.

Vous pouvez également utiliser un argument callback, qui est une fonction que vous pouvez appeler dans les gestionnaires non asynchrones pour envoyer une réponse. Nous vous recommandons d’utiliser async/await plutôt que des callbacks. Async/await améliore la lisibilité, la gestion des erreurs et l’efficacité. Pour plus d’informations sur les différences entre async/await et les callbacks, consultez Utilisation de callbacks.

Dénomination

Lorsque vous configurez une fonction, la valeur du paramètre du gestionnaire est le nom du fichier et le nom de la méthode du gestionnaire exporté, séparés par un point. La valeur par défaut pour les fonctions créées dans la console et pour les exemples présentés dans ce guide estindex.handler. Cela indique la handler méthode qui est exportée depuis le index.mjs fichier index.js or.

Si vous créez une fonction dans la console en utilisant un nom de fichier ou un nom de gestionnaire de fonction différent, vous devez modifier le nom du gestionnaire par défaut.

Pour modifier le nom du gestionnaire de fonction (console)
  1. Ouvrez la page Fonctions de la console Lambda et choisissez votre fonction.

  2. Cliquez sur l'onglet Code.

  3. Faites défiler l'écran jusqu'au volet Paramètres d'exécution et choisissez Modifier.

  4. Dans Gestionnaire, saisissez le nouveau nom de votre gestionnaire de fonction.

  5. Choisissez Enregistrer.

Utilisation d’async/await

Si votre code exécute une tâche asynchrone, utilisez le modèle async/await pour vous assurer que le gestionnaire termine son exécution. Async/await est un moyen concis et lisible d’écrire du code asynchrone dans Node.js, sans avoir besoin de callbacks imbriqués ou de promesses en chaîne. Avec async/await, vous pouvez écrire du code qui se lit comme du code synchrone, tout en étant asynchrone et non bloquant.

Le mot-clé async marque une fonction comme étant asynchrone, et le mot-clé await met en pause l’exécution de la fonction jusqu’à ce qu’une Promise soit résolue.

Note

Assurez-vous d’attendre la fin des événements asynchrones. Si la fonction retourne avant que les événements asynchrones ne soient terminés, elle risque d’échouer ou de provoquer un comportement inattendu dans votre application. Cela peut se produire lorsqu’une boucle forEach contient un événement asynchrone. Les boucles forEach attendent un appel synchrone. Pour plus d’informations, consultez Array.prototype.forEach() dans la documentation Mozilla.

ES module handler
Exemple – Requête HTTP avec async/await

Cet exemple utilisefetch, qui est disponible dans les environnements d'exécution nodejs18.x et ultérieurs.

const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available in Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };
CommonJS module handler
Exemple – Requête HTTP avec async/await
const https = require("https"); let url = "https://aws.amazon.com/"; exports.handler = async function (event) { let statusCode; await new Promise(function (resolve, reject) { https.get(url, (res) => { statusCode = res.statusCode; resolve(statusCode); }).on("error", (e) => { reject(Error(e)); }); }); console.log(statusCode); return statusCode; };

L’exemple suivant utilise async/await pour répertorier vos compartiments Amazon Simple Storage Service.

Note

Avant d’utiliser cet exemple, assurez-vous que le rôle d’exécution de votre fonction dispose d’autorisations de lecture Amazon S3.

ES module handler
Exemple — AWS SDK v3 avec async/await

Cet exemple utilise la AWS SDK for JavaScript version 3, qui est disponible dans les environnements d'exécution nodejs18.x et ultérieurs.

import {S3Client, ListBucketsCommand} from '@aws-sdk/client-s3'; const s3 = new S3Client({region: 'us-east-1'}); export const handler = async(event) => { const data = await s3.send(new ListBucketsCommand({})); return data.Buckets; };
CommonJS module handler
Exemple — AWS SDK v2 avec async/await

Cet exemple utilise AWS SDK for JavaScript v2, qui est disponible dans l’exécution Lambda nodejs16.x.

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { const buckets = await s3.listBuckets().promise() return buckets }

Utilisation de callbacks

Nous vous recommandons d’utiliser async/await pour déclarer le gestionnaire de fonctions au lieu d’utiliser des callbacks. Async/await est un meilleur choix pour plusieurs raisons :

  • Lisibilité : le code Async/await est plus facile à lire et à comprendre que le code callback, qui peut rapidement devenir difficile à suivre et entraîner l’enfer du callback.

  • Débogage et gestion des erreurs : le débogage du code basé sur des callbacks peut être difficile. La pile d’appels peut devenir difficile à suivre et les erreurs peuvent facilement se perdre. Avec async/await, vous pouvez utiliser des blocs try/catch pour gérer les erreurs.

  • Efficacité : les callbacks nécessitent souvent de basculer entre différentes parties du code. Async/await permet de réduire le nombre de changements de contexte, ce qui se traduit par un code plus efficace.

Lorsque vous utilisez des callbacks dans votre gestionnaire, la fonction continue à s’exécuter jusqu’à ce que la boucle d’événement soit vide ou que la fonction s’arrête. La réponse n’est pas envoyée à l’appelant tant que toutes les tâches d’événement de boucle ne sont pas terminées. Si la fonction expire, une erreur est renvoyée à la place. Vous pouvez configurer le moteur d'exécution pour envoyer la réponse immédiatement en définissant le contexte. callbackWaitsForEmptyEventLoopà faux.

La fonction de rappel accepte deux arguments : un(e) Error et une réponse. L’objet de réponse doit être compatible avec JSON.stringify.

L’exemple suivant vérifie la fonction d’une URL et renvoie le code de statut au mécanisme d’appel.

ES module handler
Exemple – Requête HTTP avec callback
import https from "https"; let url = "https://aws.amazon.com/"; export function handler(event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode); }).on("error", (e) => { callback(Error(e)); }); }
CommonJS module handler
Exemple – Requête HTTP avec callback
const https = require("https"); let url = "https://aws.amazon.com/"; exports.handler = function (event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode); }).on("error", (e) => { callback(Error(e)); }); };

Dans l’exemple suivant, la réponse du Simple Storage Service (Amazon S3) est renvoyée au mécanisme d’invocation dès qu’elle est disponible. Le délai d’expiration de l’événement en boucle est gelé et reprend lors de l’invocation suivante de la fonction.

Note

Avant d’utiliser cet exemple, assurez-vous que le rôle d’exécution de votre fonction dispose d’autorisations de lecture Amazon S3.

ES module handler
Exemple — AWS SDK v3 avec callbackWaitsFor EmptyEventLoop

Cet exemple utilise la AWS SDK for JavaScript version 3, qui est disponible dans les environnements d'exécution nodejs18.x et ultérieurs.

import AWS from "@aws-sdk/client-s3"; const s3 = new AWS.S3({}); export const handler = function (event, context, callback) { context.callbackWaitsForEmptyEventLoop = false; s3.listBuckets({}, callback); setTimeout(function () { console.log("Timeout complete."); }, 5000); };
CommonJS module handler
Exemple — AWS SDK v2 avec callbackWaitsFor EmptyEventLoop

Cet exemple utilise AWS SDK for JavaScript v2, qui est disponible dans l’exécution Lambda nodejs16.x.

const AWS = require("aws-sdk"); const s3 = new AWS.S3(); exports.handler = function (event, context, callback) { context.callbackWaitsForEmptyEventLoop = false; s3.listBuckets(null, callback); setTimeout(function () { console.log("Timeout complete."); }, 5000); };