Erstellen von Lambda-Funktionen mit 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.

Erstellen von Lambda-Funktionen mit Node.js

Sie können JavaScript Code mit Node.js in AWS Lambda ausführen. Lambda bietet Laufzeiten für Node.js, die Ihren Code ausführen, um Ereignisse zu verarbeiten. Ihr Code wird in einer Umgebung ausgeführt, die die Rolle AWS SDK for JavaScript, with credentials from a AWS Identity and Access Management (IAM) enthält, die Sie verwalten. Weitere Informationen zu den SDK-Versionen, die in den Laufzeiten von Node.js enthalten sind, finden Sie unter. SDK-Versionen, die Runtime enthalten

Lambda unterstützt die folgenden Node.js-Laufzeiten.

Node.js
Name ID Betriebssystem Datum der Veraltung Blockfunktion erstellen Blockfunktion aktualisieren

Node.js 20

nodejs20.x

Amazon Linux 2023

Node.js 18

nodejs18.x

Amazon Linux 2

Node.js 16

nodejs16.x

Amazon Linux 2

12. Juni 2024

28. Februar 2025

31. März 2025

Anmerkung

Laufzeiten von Node.js 18 und höher verwenden AWS SDK für JavaScript v3. Um eine Funktion aus einer früheren Runtime zu migrieren, folgen Sie dem Migrations-Workshop unter GitHub. Weitere Informationen zum AWS SDK für JavaScript Version 3 finden Sie im Blogbeitrag Modular AWS SDK for JavaScript is now general available.

Erstellen einer Funktion Node.js.
  1. Öffnen Sie die Lambda-Konsole.

  2. Wählen Sie Funktion erstellen.

  3. Konfigurieren Sie die folgenden Einstellungen:

    • Funktionsname: Geben Sie einen Namen für die Funktion ein.

    • Laufzeit: Wählen Sie Node.js 20.x aus.

  4. Wählen Sie Funktion erstellen.

  5. Um ein Testereignis zu konfigurieren, wählen Sie Test.

  6. Geben Sie für Event name (Ereignisname) test ein.

  7. Wählen Sie Änderungen speichern aus.

  8. Wählen Sie Test, um die Funktion aufzurufen.

Die Konsole erstellt eine Lambda-Funktion mit einer einzigen Quelldatei mit dem Namen index.js oder index.mjs. Mit dem integrierten Code-Editor können Sie diese Datei bearbeiten und weitere Dateien hinzufügen. Klicken Sie auf Save (Speichern), um die Änderungen zu speichern. Um Ihren Code auszuführen, wählen Sie Test.

Anmerkung

Die Lambda-Konsole dient AWS Cloud9 dazu, eine integrierte Entwicklungsumgebung im Browser bereitzustellen. Sie können es auch verwenden AWS Cloud9 , um Lambda-Funktionen in Ihrer eigenen Umgebung zu entwickeln. Weitere Informationen finden Sie AWS Toolkit im AWS Cloud9 Benutzerhandbuch unter Arbeiten mit AWS Lambda Funktionen unter Verwendung von.

Die index.js- oder index.mjs-Datei exportiert eine Funktion mit dem Namen handler, die ein Ereignisobjekt und ein Kontext-Objekt übernimmt. Dies ist die Handler-Funktion, die bei einem Aufruf der Funktion von Lambda aufgerufen wird. Die Node.js-Funktionslaufzeit ruft Aufrufereignisse von Lambda ab und leitet sie an den Handler weiter. In der Konfiguration der Funktion lautet der Wert für den Handler index.handler.

Wenn Sie Ihren Funktionscode speichern, erstellt die Lambda-Konsole ein Bereitstellungspaket für das ZIP-Dateiarchiv. Wenn Sie Ihren Funktionscode außerhalb der Konsole (mit einer IDE) entwickeln, müssen Sie ein Bereitstellungspaket erstellen, um Ihren Code in die Lambda-Funktion hochzuladen.

Anmerkung

Um mit der Anwendungsentwicklung in Ihrer lokalen Umgebung zu beginnen, stellen Sie eine der Beispielanwendungen bereit, die im GitHub Repository dieses Handbuchs verfügbar sind.

Lambda-Beispielanwendungen in Node.js
  • blank-nodejs — Eine Funktion von Node.js, die die Verwendung von Logging, Umgebungsvariablen, AWS X-Ray Tracing, Layern, Unit-Tests und dem SDK zeigt. AWS

  • nodejs-apig – Eine Funktion mit einem öffentlichen API-Endpunkt, die ein Ereignis aus API Gateway verarbeitet und eine HTTP-Antwort zurückgibt.

  • efs-nodejs – Eine Funktion, die ein Amazon-EFS-Dateisystem in einer Amazon VPC nutzt. Dieses Beispiel umfasst eine VPC, ein Dateisystem, Bindungsbereitstellung-Ziele und einen Zugriffspunkt, der für die Verwendung mit Lambda konfiguriert ist.

Die Funktionslaufzeit übergibt neben dem Aufrufereignis ein Context-Objekt an den Handler. Das Context-Objekt enthält zusätzliche Informationen zum Aufruf, zur Funktion und zur Ausführungsumgebung. Weitere Informationen erhalten Sie über die Umgebungsvariablen.

Ihre Lambda-Funktion wird mit einer CloudWatch Logs-Protokollgruppe geliefert. Die Funktionslaufzeit sendet Details zu jedem Aufruf an CloudWatch Logs. Es leitet alle Protokolle weiter, die Ihre Funktion während des Aufrufs ausgibt. Wenn Ihre Funktion einen Fehler zurückgibt, formatiert Lambda den Fehler und gibt ihn an den Aufrufer zurück.

Initialisierung von Node.js

Node.js verfügt über ein eindeutiges Ereignisschleifenmodell, das bewirkt, dass sich das Initialisierungsverhalten von anderen Laufzeiten unterscheidet. Insbesondere verwendet Node.js ein nicht blockierendes I/O-Modell, das asynchrone Operationen unterstützt. Dieses Modell ermöglicht es Node.js, für die meisten Workloads effizient zu arbeiten. Wenn beispielsweise eine Node.js-Funktion einen Netzwerkaufruf durchführt, kann diese Anforderung als asynchrone Operation bezeichnet und in eine Callback-Warteschlange gestellt werden. Die Funktion verarbeitet möglicherweise andere Vorgänge innerhalb des Hauptaufruf-Batches, ohne blockiert zu werden, indem sie darauf wartet, dass der Netzwerkaufruf zurückgegeben wird. Sobald der Netzwerkaufruf abgeschlossen ist, wird sein Rückruf ausgeführt und dann aus der Rückrufwarteschlange entfernt.

Einige Initialisierungsaufgaben werden möglicherweise asynchron ausgeführt. Diese asynchronen Aufgaben garantieren nicht, dass sie die Ausführung vor einem Aufruf abschließen. Beispielsweise ist Code, der einen Netzwerkaufruf zum Abrufen eines Parameters aus dem AWS Parameterspeicher durchführt, möglicherweise nicht vollständig, wenn Lambda die Handler-Funktion ausführt. Infolgedessen kann die Variable während eines Aufrufs null sein. Um dies zu vermeiden, stellen Sie sicher, dass Variablen und anderer asynchroner Code vollständig initialisiert sind, bevor Sie mit der restlichen Kerngeschäftslogik der Funktion fortfahren.

Alternativ können Sie Ihren Funktionscode als ES-Modul bezeichnen, sodass Sie await auf der obersten Ebene der Datei außerhalb des Bereichs Ihres Funktionshandlers verwenden können. Wenn Sie await jedes Promise verwenden, wird der asynchrone Initialisierungscode vor den Handler-Aufrufen abgeschlossen, wodurch die Wirksamkeit der bereitgestellten Gleichzeitigkeit bei der Reduzierung der Kaltstart-Latenz maximiert wird. Weitere Informationen und ein Beispiel finden Sie unter Verwenden von Node.js-ES-Modulen und Erwarten auf oberster Ebene in AWS Lambda.

Designieren eines Funktionshandlers als ES-Modul

Standardmäßig behandelt Lambda Dateien mit dem .js-Suffix als CommonJS-Module. Optional können Sie Ihren Code als ES-Modul festlegen. Sie können dies auf zwei Arten tun: durch Angabe von type als module in der package.json-Datei der Funktion oder durch Verwendung der Dateinamenerweiterung .mjs. Im ersten Ansatz behandelt Ihr Funktionscode alle .js-Dateien als ES-Module, während im zweiten Szenario nur die Datei, die Sie mit .mjs angeben, ein ES-Modul ist. Sie können ES-Module und CommonJS-Module mischen, indem Sie sie als .mjs bzw. .cjs benennen, da .mjs-Dateien immer ES-Module sind und .cjs-Dateien immer CommonJS-Module sind.

Lambda durchsucht beim Laden von ES-Modulen Ordner in der NODE_PATH Umgebungsvariablen. Sie können das AWS SDK, das in der Laufzeit enthalten ist, mithilfe von import ES-Modulanweisungen laden. Sie können ES-Module auch aus Ebenen laden.

SDK-Versionen, die Runtime enthalten

Die Version des AWS SDK, die in der Runtime von Node.js enthalten ist, hängt von der Runtime-Version und Ihrer ab. AWS-Region Um die Version des SDK zu finden, die in der von Ihnen verwendeten Runtime enthalten ist, erstellen Sie eine Lambda-Funktion mit dem folgenden Code.

Anmerkung

Der unten gezeigte Beispielcode für die Versionen 18 und höher von Node.js verwendet das CommonJS-Format. Wenn Sie die Funktion in der Lambda-Konsole erstellen, müssen Sie die Datei, die den Code enthält, unbedingt in umbenennen. index.js

Beispiel Node.js 18 und höher
const { version } = require("@aws-sdk/client-s3/package.json"); exports.handler = async () => ({ version });

Dies gibt eine Antwort im folgenden Format zurück:

{ "version": "3.462.0" }

Verwenden von Keepalive für TCP-Verbindungen

Der standardmäßige Node.js-HTTP/HTTPS-Agent erstellt eine neue TCP-Verbindung für jede neue Anforderung. Um die Kosten für den Aufbau neuer Verbindungen keepAlive: true zu vermeiden, können Sie Verbindungen wiederverwenden, für die Ihre Funktion das AWS SDK verwendet JavaScript. Keepalive kann die Anforderungszeiten für Lambda-Funktionen reduzieren, die mehrere API-Aufrufe unter Verwendung des SDK ausführen.

Im AWS SDK für JavaScript 3.x, das in nodejs18.x und späteren Lambda-Laufzeiten enthalten ist, ist Keep-Alive standardmäßig aktiviert. Informationen zur Deaktivierung von Keep-Alive finden Sie unter Wiederverwenden von Verbindungen mit Keep-Alive in Node.js im SDK for 3.x Developer Guide.AWS JavaScript Weitere Informationen zur Verwendung von Keep-Alive finden Sie im Developer Tools Blog unter HTTP keep-alive is default on in modular SDK. AWS JavaScript AWS

CA-Zertifikat wird geladen

Für Laufzeitversionen von Node.js bis Node.js 18 lädt Lambda automatisch Amazon-spezifische CA-Zertifikate (Certificate Authority), um Ihnen die Erstellung von Funktionen zu erleichtern, die mit anderen Diensten interagieren. AWS Lambda enthält beispielsweise die Amazon-RDS-Zertifikate, die für die Validierung des in Ihrer Amazon-RDS-Datenbank installierten Server-Identitätszertifikats erforderlich sind. Dieses Verhalten kann sich bei Kaltstarts auf die Leistung auswirken.

Ab Node.js 20 lädt Lambda standardmäßig keine zusätzlichen CA-Zertifikate mehr. Die Laufzeit Node.js 20 enthält eine Zertifikatsdatei mit allen Amazon-CA-Zertifikaten, die sich unter /var/runtime/ca-cert.pem befinden. Um dasselbe Verhalten aus Node.js 18 und früheren Laufzeiten wiederherzustellen, setzen Sie die Umgebungsvariable NODE_EXTRA_CA_CERTS auf /var/runtime/ca-cert.pem.

Für eine optimale Leistung empfehlen wir, nur die benötigten Zertifikate mit Ihrem Bereitstellungspaket zu bündeln und diese über die Umgebungsvariable NODE_EXTRA_CA_CERTS zu laden. Die Zertifikatsdatei sollte aus einem oder mehreren vertrauenswürdigen Stammzertifikaten oder Zertifikaten von Zwischenzertifizierungsstellen im PEM-Format bestehen. Fügen Sie für RDS die erforderlichen Zertifikate beispielsweise zusammen mit Ihrem Code als certificates/rds.pem hinzu. Laden Sie dann die Zertifikate, indem Sie NODE_EXTRA_CA_CERTS auf /var/task/certificates/rds.pem festlegen.