Arbeiten mit Ebenen für Node.js Lambda-Funktionen - 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.

Arbeiten mit Ebenen für Node.js Lambda-Funktionen

Verwenden Sie Lambda-Ebenen, um Code und Abhängigkeiten zu verpacken, die Sie für mehrere Funktionen wiederverwenden möchten. Ebenen enthalten üblicherweise Bibliotheksabhängigkeiten, eine benutzerdefinierte Laufzeit oder Konfigurationsdateien. Das Erstellen einer Ebene umfasst drei allgemeine Schritte:

  1. Verpacken Ihres Ebeneninhalts. Dies bedeutet, dass Sie ein .zip-Dateiarchiv erstellen, das die Abhängigkeiten enthält, die Sie in Ihren Funktionen verwenden möchten.

  2. Erstellen Sie die Ebene in Lambda.

  3. Fügen Sie die Ebene zu Ihren Funktionen hinzu.

Verpacken Ihres Ebeneninhalts

Um eine Ebene zu erstellen, bündeln Sie Ihre Pakete in einem ZIP-Dateiarchiv, das die folgenden Anforderungen erfüllt:

  • Erstellen Sie den Layer mit derselben Version von Node.js, die Sie für die Lambda-Funktion verwenden möchten. Wenn Sie Ihren Layer beispielsweise mit Node.js 22 erstellen, verwenden Sie die Laufzeit Node.js 22 für Ihre Funktion.

  • Die ZIP-Datei Ihres Layers muss eine der folgenden Verzeichnisstrukturen verwenden:

    • nodejs/node_modules

    • nodejs/nodeX/node_modules(wo X ist zum Beispiel node22 Ihre Version von Node.js)

    Weitere Informationen finden Sie unter Ebenenpfade für jede Lambda-Laufzeit.

  • Die Pakete in Ihrem Layer müssen mit Linux kompatibel sein. Lambda-Funktionen laufen auf Amazon Linux.

  • Wenn Ihre Ebene native Binärdateien oder ausführbare Dateien enthält, müssen diese auf dieselbe Architektur (x86_64 oder arm64) abzielen wie Ihre Funktion.

Sie können Ebenen erstellen, die entweder Bibliotheken für Node.js von Drittanbietern enthalten, die mit installiert wurden npm (z. B. axios oderlodash), oder Ihre eigenen Module. JavaScript

Um eine Ebene mit NPM-Paketen zu erstellen
  1. Erstellen Sie die erforderliche Verzeichnisstruktur und installieren Sie Pakete direkt darin:

    mkdir -p nodejs npm install --prefix nodejs lodash axios

    Mit diesem Befehl werden die Pakete direkt in das nodejs/node_modules Verzeichnis installiert. Dies ist die Struktur, die Lambda benötigt.

    Anmerkung

    Stellen Sie bei Paketen mit nativen Abhängigkeiten oder binären Komponenten (wie sharp oder bcrypt) sicher, dass sie mit der Lambda-Linux-Umgebung und der Architektur Ihrer Funktion kompatibel sind. Möglicherweise müssen Sie das Flag verwenden: --platform

    npm install --prefix nodejs --platform=linux --arch=x64 sharp

    Für komplexere native Abhängigkeiten müssen Sie sie möglicherweise in einer Linux-Umgebung kompilieren, die der Lambda-Laufzeit entspricht. Zu diesem Zweck können Sie Docker verwenden.

  2. Den Inhalt der Ebene komprimieren:

    Linux/macOS
    zip -r layer.zip nodejs/
    PowerShell
    Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip

    Die Verzeichnisstruktur Ihrer ZIP-Datei sollte wie folgt aussehen:

    nodejs/              
    └── node_modules/
        ├── lodash/
        ├── axios/
        └── (dependencies of the other packages)
    Anmerkung

    Stellen Sie sicher, dass Ihre ZIP-Datei das nodejs Verzeichnis auf der Stammebene mit node_modules darin enthaltenen Verzeichnis enthält. Diese Struktur stellt sicher, dass Lambda Ihre Pakete finden und importieren kann.

Um eine Ebene mit Ihrem eigenen Code zu erstellen
  1. Erstellen Sie die erforderliche Verzeichnisstruktur für Ihre Ebene:

    mkdir -p nodejs/node_modules/validator
  2. Erstellen Sie eine package.json Datei für Ihr benutzerdefiniertes Modul, um zu definieren, wie es importiert werden soll:

    Beispiel package.json
    { "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
  3. Erstellen Sie Ihre Moduldatei JavaScript :

    Beispiel nodejs/node_modules/validator/index.mjs
    export function validateOrder(orderData) { // Validates an order and returns formatted data const requiredFields = ['productId', 'quantity']; // Check required fields const missingFields = requiredFields.filter(field => !(field in orderData)); if (missingFields.length > 0) { throw new Error(`Missing required fields: ${missingFields.join(', ')}`); } // Validate quantity const quantity = orderData.quantity; if (!Number.isInteger(quantity) || quantity < 1) { throw new Error('Quantity must be a positive integer'); } // Format and return the validated data return { productId: String(orderData.productId), quantity: quantity, shippingPriority: orderData.priority || 'standard' }; } export function formatResponse(statusCode, body) { // Formats the API response return { statusCode: statusCode, body: JSON.stringify(body) }; }
  4. Den Inhalt der Ebene komprimieren:

    Linux/macOS
    zip -r layer.zip nodejs/
    PowerShell
    Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip

    Die Verzeichnisstruktur Ihrer ZIP-Datei sollte wie folgt aussehen:

    nodejs/              
    └── node_modules/
        └── validator/
            ├── package.json
            └── index.mjs
  5. Importieren und verwenden Sie die Module in Ihrer Funktion. Beispiel:

    import { validateOrder, formatResponse } from 'validator'; export const handler = async (event) => { try { // Parse the order data from the event body const orderData = JSON.parse(event.body || '{}'); // Validate and format the order const validatedOrder = validateOrder(orderData); return formatResponse(200, { message: 'Order validated successfully', order: validatedOrder }); } catch (error) { if (error instanceof Error && error.message.includes('Missing required fields')) { return formatResponse(400, { error: error.message }); } return formatResponse(500, { error: 'Internal server error' }); } };

    Sie können das folgende Testereignis verwenden, um die Funktion aufzurufen:

    { "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }

    Erwartete Antwort:

    { "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}" }

Erstellen Sie die Ebene in Lambda

Sie können Ihren Layer entweder mit der AWS CLI oder der Lambda-Konsole veröffentlichen.

AWS CLI

Führen Sie den publish-layer-version AWS CLI Befehl aus, um die Lambda-Schicht zu erstellen:

aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes nodejs22.x

Der Parameter compatible runtimes ist optional. Wenn angegeben, verwendet Lambda diesen Parameter, um Ebenen in der Lambda-Konsole zu filtern.

Console
So erstellen Sie eine Ebene (Konsole)
  1. Öffnen Sie die Seite Ebenen der Lambda-Konsole.

  2. Wählen Sie Create Layer (Ebene erstellen) aus.

  3. Wählen Sie „.zip-Datei hochladen“ und laden Sie dann das zuvor erstellte ZIP-Archiv hoch.

  4. (Optional) Wählen Sie für Kompatible Laufzeiten die Laufzeit Node.js aus, die der Version Node.js entspricht, mit der Sie den Layer erstellt haben.

  5. Wählen Sie Erstellen aus.

Fügen Sie den Layer zu Ihrer Funktion hinzu

AWS CLI

Führen Sie den update-function-configuration AWS CLI Befehl aus, um die Ebene an Ihre Funktion anzuhängen. Verwenden Sie für den --layers Parameter den Layer-ARN. Der ARN muss die Version angeben (z. B.arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1). Weitere Informationen finden Sie unter Ebenen und Ebenenversionen.

aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"

Die cli-binary-format Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie aws configure set cli-binary-format raw-in-base64-out aus. Weitere Informationen finden Sie unter Von AWS CLI unterstützte globale Befehlszeilenoptionen im AWS Command Line Interface -Benutzerhandbuch für Version 2.

Console
Um einer Funktion eine Ebene hinzuzufügen
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die Funktion aus.

  3. Blättern Sie nach unten bis zum Abschnitt Ebenen und wählen Sie dann Eine Ebene hinzufügen.

  4. Wählen Sie unter Ebene auswählen die Option Benutzerdefinierte Ebenen und dann Ihre Ebene aus.

    Anmerkung

    Wenn Sie bei der Erstellung des Layers keine kompatible Runtime hinzugefügt haben, wird Ihr Layer hier nicht aufgeführt. Sie können stattdessen den Layer-ARN angeben.

  5. Wählen Sie Hinzufügen aus.

Beispiel-App

Weitere Beispiele für die Verwendung von Lambda-Layern finden Sie in der Layer-Nodejs-Beispielanwendung im Developer Guide-Repository. AWS Lambda GitHub Diese Anwendung enthält eine Ebene, die die Lodash-Bibliothek enthält. Nachdem Sie den Layer erstellt haben, können Sie die entsprechende Funktion bereitstellen und aufrufen, um zu überprüfen, ob der Layer erwartungsgemäß funktioniert.