Definire il gestore della funzione Lambda in Node.js - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Definire il gestore della funzione Lambda in Node.js

Il gestore di funzioni Lambda è il metodo nel codice della funzione che elabora gli eventi. Quando viene richiamata la funzione, Lambda esegue il metodo del gestore. La funzione viene eseguita fino a quando il gestore non restituisce una risposta, termina o scade.

La funzione di esempio seguente registra il contenuto dell'oggetto evento e restituisce la posizione dei registri.

Nota

Questa pagina mostra esempi di gestori di moduli sia CommonJS sia ES. Per informazioni sulle differenze tra questi due tipi di gestori, consulta Impostazione di un gestore di funzioni come modulo 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; };

Quando si configura una funzione, il valore dell'impostazione dell'handler è costituito dal nome del file e dal nome del metodo dell'handler esportato, separati da un punto. L'impostazione predefinita nella console e negli esempi in questa guida è index.handler. Questo indica il metodo handler che viene esportato dal file index.js.

Il runtime trasferisce gli argomenti al metodo del gestore. Il primo argomento è l'oggetto event, che contiene le informazioni sull'invoker. L'invoker trasferisce queste informazioni come stringa in formato JSON quando chiama Invoke e il runtime le converte in un oggetto. Quando un AWS servizio richiama la funzione, la struttura degli eventi varia in base al servizio.

Il secondo argomento è l'oggetto context, che contiene le informazioni sulla chiamata, la funzione, e l'ambiente di esecuzione. In questo esempio, la funzione ottiene il nome del flusso di log dall'oggetto context e lo restituisce all'invoker.

Inoltre puoi utilizzare un argomento di richiamo, ovvero una funzione che puoi richiamare nei gestori non asincroni per inviare una risposta. È consigliato l'utilizzo di async/await, anziché dei richiami. Async/Await fornisce una migliore leggibilità, gestione degli errori ed efficienza. Per ulteriori informazioni sulla differenza tra async/await e richiami, consulta Utilizzo dei richiami.

Denominazione

Quando si configura una funzione, il valore dell'impostazione dell'handler è costituito dal nome del file e dal nome del metodo dell'handler esportato, separati da un punto. L'impostazione predefinita per le funzioni create nella console e per gli esempi in questa guida è. index.handler Indica il handler metodo che viene esportato dal index.mjs file index.js or.

Se si crea una funzione nella console utilizzando un nome di file o un nome del gestore di funzione diverso, è necessario modificare il nome del gestore predefinito.

Modifica del nome del gestore funzioni (console)
  1. Apri la pagina Funzioni della console Lambda e scegli la tua funzione.

  2. Scegli la scheda Codice.

  3. Scorri verso il basso fino al riquadro Impostazioni di runtime e scegli Modifica.

  4. In Gestore, inserisci il nuovo nome per il tuo gestore di funzioni.

  5. Selezionare Salva.

Utilizzo di async/await

Se il codice esegue un'attività asincrona, usa lo schema aync/await per assicurarti che il gestore termini l'esecuzione. Async/await è un modo conciso e leggibile per scrivere codice asincrono in Node.js, senza la necessità di richiami nidificati o di concatenamento di promesse. Con async/await puoi scrivere codice che si legga come codice sincrono, pur rimanendo asincrono e privo di blocchi.

La parola chiave async contrassegna una funzione come asincrona, mentre la parola chiave await mette in pausa l'esecuzione della funzione fino alla risoluzione di Promise.

Nota

Assicurati di attendere il completamento degli eventi asincroni. Se la funzione restituisce un risultato prima del completamento degli eventi asincroni, potrebbe avere esito negativo o causare un comportamento imprevisto nell'applicazione. Ciò può accadere quando un ciclo forEach contiene un evento asincrono. I loop forEach prevedono una chiamata sincrona. Per ulteriori informazioni, consulta la sezione Array.prototype.forEach() nella documentazione di Mozilla.

ES module handler
Esempio — Richiesta HTTP con async/await
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
Esempio — Richiesta HTTP con 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; };

Nell'esempio successivo async/await è utilizzato per elencare i bucket Amazon Simple Storage Service.

Nota

Prima di utilizzare questo esempio, assicurati che il ruolo di esecuzione della tua funzione disponga delle autorizzazioni di lettura di Amazon S3.

ES module handler
Esempio — AWS SDK v3 con async/await

Questo esempio utilizza la versione AWS SDK for JavaScript v3, disponibile nei runtime e nelle versioni successive. nodejs18.x

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
Esempio — AWS SDK v3 con async/await

Questo esempio utilizza la versione AWS SDK for JavaScript v3, disponibile nei runtime e nelle versioni successive. nodejs18.x

const { S3Client, ListBucketsCommand } = require('@aws-sdk/client-s3'); const s3 = new S3Client({ region: 'us-east-1' }); exports.handler = async (event) => { const data = await s3.send(new ListBucketsCommand({})); return data.Buckets; };

Utilizzo dei richiami

Per dichiarare il gestore della funzione è consigliato l'utilizzo di async/await, anziché di quello dei richiami. Async/await rappresenta una scelta migliore per diverse ragioni:

  • Leggibilità: il codice async/await è più facile da leggere e comprendere rispetto al codice con richiami, che, invece, può di colpo diventare difficile da seguire e provocare problemi con i richiami.

  • Debug e gestione degli errori: il debug del codice basato su richiami può essere difficile. La pila delle chiamate può diventare difficile da seguire e gli errori possono essere facilmente ingeriti. Con async/await, puoi utilizzare i blocchi try/catch per gestire gli errori.

  • Efficienza: i richiami richiedono spesso il passaggio tra diverse parti del codice. Async/await può ridurre il numero dei passaggi di contesto, realizzando un codice più efficiente.

Quando utilizzi i richiami nel gestore, la funzione continua ad essere eseguita finché il ciclo di eventi è vuoto o la funzione va in timeout. La risposta non viene inviata all'invoker finché tutte le attività del ciclo di eventi non giungono a termine. Se la funzione va in timeout, viene invece restituito un errore. È possibile configurare il runtime per inviare immediatamente la risposta impostando WaitsForEmptyEventcontext.callback Loop su false.

La funzione di callback richiede due argomenti, un Error e una risposta. L'oggetto risposta deve essere compatibile con JSON.stringify.

La seguente funzione di esempio controlla un URL e restituisce il codice di stato all'invoker.

ES module handler
Esempio – richiesta HTTP con 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
Esempio – richiesta HTTP con 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)); }); };

Nell'esempio che segue, la risposta da Amazon S3 viene restituita all'invoker non appena disponibile. Il timeout in esecuzione sul ciclo di eventi viene bloccato e l'esecuzione continua la volta successiva in cui la funzione viene richiamata.

Nota

Prima di utilizzare questo esempio, assicurati che il ruolo di esecuzione della tua funzione disponga delle autorizzazioni di lettura di Amazon S3.

ES module handler
Esempio — AWS SDK v3 con Loop callbackWaitsFor EmptyEvent

Questo esempio utilizza la versione AWS SDK for JavaScript v3, disponibile nei runtime nodejs18.x e nelle versioni successive.

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
Esempio — AWS SDK v3 con Loop callbackWaitsFor EmptyEvent

Questo esempio utilizza la versione AWS SDK for JavaScript v3, disponibile nei runtime nodejs18.x e nelle versioni successive.

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