Definieren Sie den Lambda-Funktionshandler in Node.js - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Definieren Sie den Lambda-Funktionshandler in Node.js

Der Lambda-Funktionshandler ist die Methode in Ihrem Funktionscode, die Ereignisse verarbeitet. Wenn Ihre Funktion aufgerufen wird, führt Lambda die Handler-Methode aus. Ihre Funktion wird so lange ausgeführt, bis der Handler eine Antwort zurückgibt, beendet wird oder ein Timeout auftritt.

Grundlagen des Node.js Handlers

Die folgende Beispielfunktion protokolliert den Inhalt des Ereignisobjekts und gibt den Speicherort der Protokolle zurück.

Anmerkung

Diese Seite zeigt Beispiele für CommonJS- und ES-Modulhandler. Weitere Informationen zu den Unterschieden zwischen diesen beiden Handler-Typen finden Sie unter Designieren eines Funktionshandlers als ES-Modul.

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; };

Wenn Sie eine Funktion konfigurieren, besteht der Wert der Handler-Einstellung aus dem Dateinamen und dem Namen der exportierten Handler-Methode, getrennt durch einen Punkt. Der Standardwert in der Konsole und für die Beispiele in diesem Handbuch ist index.handler. Dies deutet auf die handler-Methode hin, die aus der index.js-Datei wurde.

Die Laufzeit übergibt Argumente an die Handler-Methode. Das erste Argument ist das Objekt event, das Informationen aus dem Aufrufer enthält. Der Aufrufer übergibt diese Informationen als Zeichenfolge im JSON -Format, wenn er Invoke aufruft, und die Runtime konvertiert sie in ein Objekt. Wenn ein AWS Dienst Ihre Funktion aufruft, variiert die Ereignisstruktur je nach Dienst.

Das zweite Argument ist das Context-Objekt, das Informationen über den Aufruf, die Funktion und die Ausführungsumgebung enthält. Im vorherigen Beispiel ruft die Funktion den Namen des Protokollstreams aus dem Context-Objekt ab und gibt ihn an den Aufrufer zurück.

Sie können ein Callback-Argument verwenden, ist eine Funktion, die Sie in nicht-asynchronen Handlern aufrufen können, um eine Antwort zu senden. Wir empfehlen Ihnen, Async/Await anstelle von Callback zu verwenden. Async/Await bietet eine verbesserte Lesbarkeit, Fehlerbehandlung und Effizienz. Weitere Informationen zu den Unterschieden zwischen Async/Await und Callbacks finden Sie unter Callbacks verwenden.

Benennung

Wenn Sie eine Funktion konfigurieren, besteht der Wert der Handler-Einstellung aus dem Dateinamen und dem Namen der exportierten Handler-Methode, getrennt durch einen Punkt. Die Standardeinstellung für Funktionen, die in der Konsole erstellt wurden, und für Beispiele in diesem Handbuch istindex.handler. Dies gibt die handler Methode an, die aus der index.js index.mjs OR-Datei exportiert wird.

Wenn Sie eine Funktion in der Konsole mit einem anderen Dateinamen oder Funktionshandlernamen erstellen, müssen Sie den Standardhandlernamen bearbeiten.

So ändern Sie den Funktionshandlernamen (Konsole)
  1. Öffnen Sie die Seite Functions (Funktionen) der Lambda-Konsole und wählen Sie eine Funktion aus.

  2. Wählen Sie die Registerkarte Code (Code).

  3. Scrollen Sie nach unten zum Bereich Laufzeiteinstellungen und wählen Sie Bearbeiten.

  4. Geben Sie unter Handler den neuen Namen für Ihren Funktionshandler ein.

  5. Wählen Sie Save (Speichern) aus.

Verwenden von async/await

Wenn Ihr Code eine asynchrone Aufgabe ausführt, verwenden Sie das Async-/Await, um sicherzustellen, dass die Ausführung des Handler beendet wird. Async/Await ist eine präzise und lesbare Methode, um asynchronen Code in Node.js zu schreiben, ohne dass verschachtelte Callbacks oder Verkettungsversprechen erforderlich sind. Mit Async/Await können Sie Code schreiben, der sich wie synchroner Code liest, aber dennoch asynchron und blockierungsfrei ist.

Das async-Schlüsselwort kennzeichnet eine Funktion als asynchron, und das await-Schlüsselwort unterbricht die Ausführung der Funktion, bis Promise aufgelöst ist.

Anmerkung

Stellen Sie sicher, dass Sie warten, bis die asynchronen Ereignisse abgeschlossen sind. Wenn die Funktion zurückgibt, bevor die asynchronen Ereignisse abgeschlossen sind, könnte die Funktion fehlschlagen oder ein unerwartetes Verhalten in Ihrer Anwendung verursachen. Dies kann passieren, wenn eine forEach-Schleife ein asynchrones Ereignis enthält. forEach-Schleifen erwarten einen synchronen Aufruf. Weitere Informationen finden Sie unter Array.prototype. forEach() in der Mozilla-Dokumentation.

ES module handler
Beispiel — HTTP Anfrage mit 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
Beispiel — HTTP Anfrage mit 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; };

Das nächste Beispiel verwendet Async/Await, um Ihre Buckets von Amazon Simple Storage Service aufzulisten.

Anmerkung

Bevor Sie dieses Beispiel verwenden, stellen Sie sicher, dass die Ausführungsrolle Ihrer Funktion über Amazon-S3-Leseberechtigungen verfügt.

ES module handler
Beispiel — AWS SDK v3 mit Async/Await

In diesem Beispiel wird AWS SDK for JavaScript Version 3 verwendet, die in nodejs18.x und späteren Laufzeiten verfügbar ist.

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
Beispiel — AWS SDK v3 mit Async/Await

In diesem Beispiel wird AWS SDK for JavaScript Version 3 verwendet, die in nodejs18.x und späteren Laufzeiten verfügbar ist.

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; };

Callbacks verwenden

Wir empfehlen, dass Sie Async/Await verwenden, um den Funktionshandler zu deklarieren, anstatt Callbacks zu verwenden. Async/Await ist aus mehreren Gründen eine bessere Wahl:

  • Lesbarkeit: Async/Await-Code ist einfacher zu lesen und zu verstehen als Callback-Code, der schnell schwer zu verstehen sein kann und in die Callback-Hölle führen kann.

  • Debugging und Fehlerbehandlung: Das Debuggen von Callback-basiertem Code kann schwierig sein. Der Aufrufliste kann schwer zu folgen sein und Fehler können leicht verschluckt werden. Mit Async/Await können Sie Try/Catch-Blöcke verwenden, um Fehler zu behandeln.

  • Effizienz: Callbacks erfordern oft das Umschalten zwischen verschiedenen Teilen des Codes. Async/Await kann die Anzahl der Kontextwechsel reduzieren, was zu effizienterem Code führt.

Wenn Sie in Ihrem Handler verwenden, wird die Funktion so lange ausgeführt, bis die Ereignisschleife leer ist oder eine Zeitüberschreitung auftritt. Die Antwort wird erst an den Aufrufer gesendet, wenn alle Ereignisschleifenaufgaben abgeschlossen sind. Wenn eine Zeitüberschreitung der Funktion auftritt, wird stattdessen ein Fehler zurückgegeben. Sie können die Laufzeit so konfigurieren, dass die Antwort sofort gesendet wird, indem Sie den Kontext festlegen. callbackWaitsForEmptyEventLoopauf „Falsch“ setzen.

Die Callback-Funktion verwendet zwei Argumente, einen Error und eine Antwort. Das Response-Objekt muss mit kompatibel sei JSON.stringify.

Die folgende Beispielfunktion überprüft a URL und gibt den Statuscode an den Aufrufer zurück.

ES module handler
Beispiel — HTTP Anfrage mit Rückruf
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
Beispiel — HTTP Anfrage mit Rückruf
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)); }); };

Im folgenden Beispiel wird die Antwort von Amazon S3 an den Aufrufer zurückgegeben, sobald sie verfügbar ist. Die Zeitüberschreitung für die Ereignisschleife wird eingefroren und die Ausführung wird fortgesetzt, wenn die Funktion das nächste Mal aufgerufen wird.

Anmerkung

Bevor Sie dieses Beispiel verwenden, stellen Sie sicher, dass die Ausführungsrolle Ihrer Funktion über Amazon-S3-Leseberechtigungen verfügt.

ES module handler
Beispiel — AWS SDK v3 mit callbackWaitsFor EmptyEventLoop

In diesem Beispiel wird AWS SDK for JavaScript Version 3 verwendet, die in nodejs18.x und späteren Laufzeiten verfügbar ist.

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
Beispiel — AWS SDK v3 mit callbackWaitsFor EmptyEventLoop

In diesem Beispiel wird AWS SDK for JavaScript Version 3 verwendet, die in nodejs18.x und späteren Laufzeiten verfügbar ist.

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); };

Bewährte Codemethoden für Lambda-Funktionen von Node.js

Halten Sie sich an die Richtlinien in der folgenden Liste, um beim Erstellen Ihrer Lambda-Funktionen die besten Codierungspraktiken anzuwenden:

  • Trennen Sie den Lambda-Handler von Ihrer Core-Logik. Auf diese Weise können Sie eine Funktion zur besseren Prüfbarkeit von Einheiten schaffen. In Node.js kann dies etwa wie folgt aussehen:

    exports.myHandler = function(event, context, callback) { var foo = event.foo; var bar = event.bar; var result = MyLambdaFunction (foo, bar); callback(null, result); } function MyLambdaFunction (foo, bar) { // MyLambdaFunction logic here }
  • Kontrollieren Sie die Abhängigkeiten im Bereitstellungspaket Ihrer Funktion. Die AWS Lambda Ausführungsumgebung enthält eine Reihe von Bibliotheken. Für die Laufzeiten Node.js und Python gehören dazu die AWS SDKs. Um die neuesten Funktionen und Sicherheitsupdates zu aktivieren, wird Lambda diese Bibliotheken regelmäßig aktualisieren. Diese Updates können das Verhalten Ihrer Lambda-Funktion geringfügig verändern. Um die Abhängigkeiten, die Ihre Funktion verwendet, vollständig zu kontrollieren, empfehlen wir, alle Abhängigkeiten mit Ihrem Bereitstellungspaket zu bündeln.

  • Minimieren Sie die Komplexität Ihrer Abhängigkeiten. Ziehen Sie einfachere Frameworks vor, die sich schnell beim Start der Ausführungsumgebung laden lassen.

  • Minimieren Sie die Größe Ihres Bereitstellungspakets auf die für die Laufzeit erforderliche Größe. Dadurch verkürzt sich die Zeit, die für das Herunterladen und Entpacken Ihres Bereitstellungspakets vor dem Aufruf benötigt wird.

  • Nutzen Sie die Wiederverwendung der Ausführungsumgebung zur Verbesserung Ihrer Funktion. Initialisieren Sie SDK Clients und Datenbankverbindungen außerhalb des Funktionshandlers und speichern Sie statische Assets lokal im /tmp Verzeichnis. Nachfolgende Aufrufe, die von derselben Instance Ihrer Funktion verarbeitet werden, können diese Ressourcen wiederverwenden. Dies spart Kosten durch Reduzierung der Funktionslaufzeit.

    Um potenzielle Datenlecks über Aufrufe hinweg zu vermeiden, verwenden Sie die Ausführungsumgebung nicht, um Benutzerdaten, Ereignisse oder andere Informationen mit Sicherheitsauswirkungen zu speichern. Wenn Ihre Funktion auf einem veränderbaren Zustand beruht, der nicht im Speicher innerhalb des Handlers gespeichert werden kann, sollten Sie für jeden Benutzer eine separate Funktion oder separate Versionen einer Funktion erstellen.

  • Verwenden Sie eine Keep-Alive-Direktive, um dauerhafte Verbindungen zu pflegen. Lambda bereinigt Leerlaufverbindungen im Laufe der Zeit. Der Versuch, eine Leerlaufverbindung beim Aufruf einer Funktion wiederzuverwenden, führt zu einem Verbindungsfehler. Um Ihre persistente Verbindung aufrechtzuerhalten, verwenden Sie die Keep-Alive-Direktive, die Ihrer Laufzeit zugeordnet ist. Ein Beispiel finden Sie unter Wiederverwenden von Verbindungen mit Keep-Alive in Node.js.

  • Verwenden Sie Umgebungsvariablen um Betriebsparameter an Ihre Funktion zu übergeben. Wenn Sie z. B. Daten in einen Amazon-S3-Bucket schreiben, anstatt den Bucket-Namen, in den Sie schreiben, hartzucodieren, konfigurieren Sie den Bucket-Namen als Umgebungsvariable.

  • Vermeiden Sie in Ihrer Lambda-Funktion rekursiven Code, bei dem sich die Funktion automatisch selbst aufruft, bis irgendein Kriterium erfüllt ist. Dies kann zu unvorhergesehenen Mengen an Funktionsaufrufen führen und höhere Kosten zur Folge haben. Wenn Sie dies versehentlich auslösen, legen Sie die reservierte gleichzeitige Ausführung der Funktion auf 0 fest, um sofort alle Aufrufe der Funktion zu drosseln, während Sie den Code aktualisieren.

  • Verwenden Sie APIs in Ihrem Lambda-Funktionscode nicht undokumentiert, nicht öffentlich. Für AWS Lambda verwaltete Laufzeiten führt Lambda regelmäßig Sicherheits- und Funktionsupdates für interne Lambda-Laufzeiten durch. APIs Diese internen API Updates können abwärtsinkompatibel sein, was zu unbeabsichtigten Folgen wie Aufruffehlern führen kann, wenn Ihre Funktion von diesen nicht öffentlichen Daten abhängig ist. APIs Eine Liste der öffentlich verfügbaren Dateien finden Sie in der API Referenz. APIs

  • Schreiben Sie idempotenten Code. Das Schreiben idempotenter Code für Ihre Funktionen stellt sicher, dass doppelte Ereignisse auf die gleiche Weise behandelt werden. Ihr Code sollte Ereignisse ordnungsgemäß validieren und doppelte Ereignisse ordnungsgemäß behandeln. Weitere Informationen finden Sie unter Wie mache ich meine Lambda-Funktion idempotent?.