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.
Lambda-Funktions-Handler in TypeScript definieren
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.
Themen
TypeScript-Handler – Grundlagen
Beispiel TypeScript-Handler
Diese Beispielfunktion protokolliert den Inhalt des Ereignisobjekts und gibt den Speicherort der Protokolle zurück. Beachten Sie Folgendes:
-
Bevor Sie diesen Code in einer Lambda-Funktion verwenden, müssen Sie das Paket @types/aws-lambda
als Entwicklungsabhängigkeit hinzufügen. Dieses Paket enthält die Typdefinitionen für Lambda. Bei der Installation von @types/aws-lambda
importiert dieimport
-Anweisung (import ... from 'aws-lambda'
) die Typdefinitionen. Dasaws-lambda
-NPM-Paket wird nicht importiert, da es sich um ein unabhängiges Tool eines Drittanbieters handelt. Weitere Informationen finden Sie unter aws-lambdaim DefinitelyTyped-GitHub-Repository. -
Der Handler in diesem Beispiel ist ein ES-Modul und muss in der Datei
package.json
oder mithilfe der Dateierweiterung.mjs
entsprechend angegeben werden. Weitere Informationen hierzu finden Sie unter Designieren eines Funktionshandlers als ES-Modul.
import { Handler } from 'aws-lambda'; export const handler: Handler = async (event, context) => { console.log('EVENT: \n' + JSON.stringify(event, null, 2)); return context.logStreamName; };
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 Laufzeit konvertiert sie in ein Objekt. Wenn ein AWS-Service Ihre Funktion aufruft, variiert die Ereignisstruktur je nach Service. Bei TypeScript empfehlen wir die Verwendung von Typ-Annotationen für das Ereignisobjekt. Weitere Informationen finden Sie unter Typen für das Ereignisobjekt verwenden.
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.
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.
Beispiel TypeScript-Funktion – asynchron
In diesem Beispiel wird fetch
verwendet, das in der nodejs18.x
-Laufzeit verfügbar ist. Beachten Sie Folgendes:
-
Bevor Sie diesen Code in einer Lambda-Funktion verwenden, müssen Sie das Paket @types/aws-lambda
als Entwicklungsabhängigkeit hinzufügen. Dieses Paket enthält die Typdefinitionen für Lambda. Bei der Installation von @types/aws-lambda
importiert dieimport
-Anweisung (import ... from 'aws-lambda'
) die Typdefinitionen. Dasaws-lambda
-NPM-Paket wird nicht importiert, da es sich um ein unabhängiges Tool eines Drittanbieters handelt. Weitere Informationen finden Sie unter aws-lambdaim DefinitelyTyped-GitHub-Repository. -
Der Handler in diesem Beispiel ist ein ES-Modul und muss in der Datei
package.json
oder mithilfe der Dateierweiterung.mjs
entsprechend angegeben werden. Weitere Informationen hierzu finden Sie unter Designieren eines Funktionshandlers als ES-Modul.
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; const url = 'https://aws.amazon.com/'; export const lambdaHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => { try { // fetch is available with Node.js 18 const res = await fetch(url); return { statusCode: res.status, body: JSON.stringify({ message: await res.text(), }), }; } catch (err) { console.log(err); return { statusCode: 500, body: JSON.stringify({ message: 'some error happened', }), }; } };
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
Die Callback-Funktion verwendet zwei Argumente, einen Error
und eine Antwort. Das Response-Objekt muss mit kompatibel sei JSON.stringify
.
Beispiel TypeScript-Funktion mit Callback
Diese Beispielfunktion empfängt ein Ereignis von Amazon API Gateway, protokolliert die Ereignis- und Kontextobjekte und gibt dann eine Antwort an API Gateway zurück. Beachten Sie Folgendes:
-
Bevor Sie diesen Code in einer Lambda-Funktion verwenden, müssen Sie das Paket @types/aws-lambda
als Entwicklungsabhängigkeit hinzufügen. Dieses Paket enthält die Typdefinitionen für Lambda. Bei der Installation von @types/aws-lambda
importiert dieimport
-Anweisung (import ... from 'aws-lambda'
) die Typdefinitionen. Dasaws-lambda
-NPM-Paket wird nicht importiert, da es sich um ein unabhängiges Tool eines Drittanbieters handelt. Weitere Informationen finden Sie unter aws-lambdaim DefinitelyTyped-GitHub-Repository. -
Der Handler in diesem Beispiel ist ein ES-Modul und muss in der Datei
package.json
oder mithilfe der Dateierweiterung.mjs
entsprechend angegeben werden. Weitere Informationen hierzu finden Sie unter Designieren eines Funktionshandlers als ES-Modul.
import { Context, APIGatewayProxyCallback, APIGatewayEvent } from 'aws-lambda'; export const lambdaHandler = (event: APIGatewayEvent, context: Context, callback: APIGatewayProxyCallback): void => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); callback(null, { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }); };
Typen für das Ereignisobjekt verwenden
Wir empfehlen, dass Sie keinen
Generieren eines Ereignisses mit dem Befehl sam local generate-event
-
Generieren Sie ein Amazon Simple Storage Service (Amazon S3)-Proxy-Ereignis.
sam local generate-event s3 put >> S3PutEvent.json
-
Verwenden Sie das QuickType-Dienstprogramm
, um Typ-Definitionen aus der S3PutEvent.json-Datei zu generieren. npm install -g quicktype quicktype S3PutEvent.json -o S3PutEvent.ts
-
Verwenden Sie die generierten Typen in Ihrem Code.
import { S3PutEvent } from './S3PutEvent'; export const lambdaHandler = async (event: S3PutEvent): Promise<void> => { event.Records.map((record) => console.log(record.s3.object.key)); };
Generieren eines Ereignisses mit einer Open-Source-Definition aus dem @types/aws-lambda-Paket
-
Fügen Sie das @types/aws-lambda
-Paket als Entwicklungsabhängigkeit hinzu. npm install -D @types/aws-lambda
-
Verwenden Sie die Typen in Ihrem Code.
import { S3Event } from "aws-lambda"; export const lambdaHandler = async (event: S3Event): Promise<void> => { event.Records.map((record) => console.log(record.s3.object.key)); };
Bewährte Codemethoden für Typescript-Lambda-Funktionen
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 Funktions-Handlers und speichern Sie statische Komponenten 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 rekursive Aufrufe in Ihrer Lambda-Funktion, bei denen die Funktion sich selbst aufruft oder einen Prozess initiiert, der die Funktion erneut aufrufen kann. Dies kann zu unvorhergesehenen Mengen an Funktionsaufrufen führen und höhere Kosten zur Folge haben. Wenn Sie eine unbeabsichtigte Menge von Aufrufen feststellen, 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 keine nicht dokumentierten, nicht öffentlichen APIs in Ihrem Lambda-Funktionscode. Für AWS Lambda-verwaltete Laufzeiten wendet Lambda regelmäßig Sicherheits- und Funktionsupdates auf Lambdas interne APIs an. Diese internen API-Updates können abwärtskompatibel sein, was zu unbeabsichtigten Konsequenzen wie Aufruffehlern führt, wenn Ihre Funktion von diesen nicht öffentlichen APIs abhängig ist. Eine Liste öffentlich zugänglicher APIs finden Sie in der API-Referenz.
-
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?
.