AWS Lambda - Funzione in NODEJS
Nodejs è uno dei linguaggi supportati dalla funzione AWS Lambda. Le versioni supportate con nodejs sono v6.10 e v8.10. In questo capitolo, impareremo in dettaglio le varie funzionalità della funzione AWS Lambda in NODEJS.
Gestore in NodeJS
Per scrivere la funzione AWS Lambda in nodejs, dobbiamo prima dichiarare un gestore. Il gestore in nodejs è il nome del file e il nome della funzione di esportazione. Ad esempio, il nome del file èindex.js e il nome della funzione di esportazione è lambda handler, quindi il suo gestore corrispondente è index.lambdahandler
Osserva un gestore di esempio mostrato qui -
exports.lambdahandler = function(event, context, callback) { //code goes here}
Parametri al gestore
Il gestore è il nucleo principale per la creazione della funzione Lambda. Il gestore prende tre parametri:event, context e callback.
Parametro evento
Ha tutti i dettagli dell'evento attivato. Ad esempio, se stiamo utilizzando la funzione Lambda da attivare su S3, l'evento avrà i dettagli dell'oggetto S3.
Parametro contesto
Contiene i dettagli del contesto come le proprietà e i dettagli di configurazione della funzione Lambda.
Funzione di richiamata
Aiuta a restituire i dettagli al chiamante. La struttura del callback è la seguente:
callback(error, result);
I parametri della funzione di callback sono spiegati di seguito:
Error −Questo avrà i dettagli se si è verificato un errore durante l'esecuzione della funzione Lambda. Se la funzione Lambda riesce,null può essere passato come primo parametro per la funzione di callback.
Result −Questo fornirà i dettagli della corretta esecuzione della funzione lambda. Se si verifica un errore, il parametro del risultato viene ignorato.
Note −Non è obbligatorio utilizzare la funzione di callback in AWS Lambda. Nel caso in cui non sia presente alcuna funzione di callback, il gestore la restituirà come null.
Le firme di callback valide sono fornite di seguito:
callback(); // It will return success, but no indication to the caller
callback(null); // It will return success, but no indication to the caller
callback(null, "success"); // It will return the success indication to the caller
callback(error); // It will return the error indication to the caller
Ogni volta che AWS Lambda viene eseguito, i dettagli del callback come errore o riuscita, vengono registrati in AWS CloudWatch insieme ai messaggi della console, se presenti.
Lavorare con AWS Lambda in Nodejs8.10
Cerchiamo di capire come lavorare con AWS Lambda in nodejs8.10 e richiamare la funzione in modo sincronizzato e asincrono.
Richiamo della funzione Lambda in modo sincronizzato
Il seguente esempio ti dà un'idea di come invocare la funzione Lambda in modo sincronizzato:
exports.handler = function(event, context, callback) {
let arrItems = [4,5,6,8,9,10,35,70,80,31];
function countevennumbers (items) {
return new Promise(resolve => {
setTimeout(() => {
let a = 0;
for (var i in items) {
if (items[i] % 2 == 0) {
a++;
}
}
resolve(a);
},2000);
});
}
let evennumber = countevennumbers(arrItems);
callback(null,'even numbers equals ='+evennumber);
};
È possibile osservare il seguente output dopo aver testato questo codice nella console AWS:
Notare che l'output del codice precedente è un oggetto di promessa. Non fornisce il conteggio, poiché il conteggio viene incrementato all'interno di un setTimeout e la chiamata alla funzione non attende l'esecuzione all'interno di setTimeout e restituisce l'oggetto promise.
Se lo avessimo async/await sulla funzione handler otterrà l'output esatto di dalla funzione lambda.
Invocare il gestore in modo asincrono
Il seguente esempio ti dà un'idea di come invocare la funzione Lambda in modo asincrono:
exports.handler = async function(event, context, callback) {
let arrItems = [4,5,6,8,9,10,35,70,80,31];
function countevennumbers (items) {
return new Promise(resolve => {
setTimeout(() => {
let a = 0;
for (var i in items) {
if (items[i] % 2 == 0) {
a++;
}
}
resolve(a);
}, 2000);
});
}
let evennumber = await countevennumbers(arrItems);
callback(null,'even numbers equals ='+evennumber);
};
Abbiamo aggiunto async e awaitnel codice sopra. Quando usiamoawaitaccanto alla chiamata alla funzione, l'esecuzione si ferma finché la promessa all'interno della funzione non viene risolta. Nota cheawait è valido solo per async funzioni.
È possibile osservare il seguente output dopo aver testato questo codice nella console AWS:
ContextDetails in NodeJS
L'oggetto contesto fornisce dettagli come il nome della funzione Lambda, il tempo rimanente in millisecondi, l'ID della richiesta, il nome del gruppo cloudwatch, i dettagli del timeout ecc.
Le tabelle seguenti mostrano l'elenco dei metodi e degli attributi disponibili con l'oggetto contesto:
Metodo disponibile per l'oggetto contesto
Suor n | Nome e descrizione del metodo |
---|---|
1 | getRemainingTimeInMillis() Questo metodo fornisce il tempo rimanente in millisecondi fino a quando la funzione Lambda non termina la funzione |
Attributi disponibili per oggetto contesto
Suor n | Nome e descrizione dell'attributo |
---|---|
1 | functionName Questo fornisce il nome della funzione AWS Lambda |
2 | functionVersion Ciò fornisce la versione della funzione AWS Lambda in esecuzione |
3 | nvokedFunctionArn Questo fornirà i dettagli ARN. |
4 | memoryLimitInMB Questo mostra il limite di memoria aggiunto durante la creazione della funzione Lambda |
5 | awsRequestId Questo fornisce l'ID richiesta AWS. |
6 | logGroupName Questo darà il nome del nome del gruppo di cloudwatch |
7 | logStreamName Questo darà il nome del nome del flusso di log di cloudwatch in cui sono scritti i log. |
8 | identity Questo fornirà dettagli sul provider di identità cognito di amazon quando utilizzato con aws mobile sdk. I dettagli forniti sono i seguenti:
|
9 | clientContext Questo fornirà i dettagli dell'applicazione client quando viene utilizzato con aws mobile sdk. I dettagli forniti sono i seguenti:
|
Guarda il seguente esempio per avere un'idea migliore dell'oggetto contesto:
exports.handler = (event, context, callback) => {
// TODO implement
console.log('Remaining time =>', context.getRemainingTimeInMillis());
console.log('functionName =>', context.functionName);
console.log('AWSrequestID =>', context.awsRequestId);
console.log('logGroupName =>', context.log_group_name);
console.log('logStreamName =>', context.log_stream_name);
console.log('clientContext =>', context.clientContext);
callback(null, 'Name of aws Lambda is=>'+context.functionName);
};
È possibile osservare il seguente output dopo aver testato questo codice nella console AWS:
È possibile osservare il seguente output di log dopo aver testato questo codice nella console AWS:
Accesso a NodeJS
Possiamo usare console.log per accedere a NodeJS. I dettagli del log possono essere recuperati dal servizio CloudWatch sulla funzione Lambda.
Osservare il seguente esempio per una migliore comprensione:
exports.handler = (event, context, callback) => {
// TODO implement
console.log('Logging for AWS Lamnda in NodeJS');
callback(null, 'Name of aws Lambda is=>'+context.functionName);
};
È possibile osservare il seguente output dopo aver testato questo codice nella console AWS:
Puoi osservare il seguente screenshot da CloudWatch:
Gestione degli errori in NodeJS
Cerchiamo di capire come viene eseguita la notifica di errore in NodeJS. Rispettare il codice seguente:
exports.handler = function(event, context, callback) {
// This Source code only throws error.
var error = new Error("something is wrong");
callback(error);
};
È possibile osservare quanto segue nell'output del registro:
I dettagli dell'errore sono forniti nella richiamata come segue:
{
"errorMessage": "something is wrong",
"errorType": "Error",
"stackTrace": [ "exports.handler (/var/task/index.js:2:17)" ]
}