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

Eine Lambda-Ebene ist ein ZIP-Dateiarchiv mit ergänzendem Code oder ergänzenden Daten. 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.

Dieses Thema enthält Schritte und Anleitungen zum ordnungsgemäßen Verpacken und Erstellen einer Node.js-Lambda-Ebene mit externen Bibliotheksabhängigkeiten.

Voraussetzungen

Um die Schritte in diesem Abschnitt ausführen zu können, müssen Sie über folgende Voraussetzungen verfügen:

In diesem Thema verweisen wir auf die layer-nodejs-Beispielanwendung im GitHub-Repository aws-lambda-developer-guide. Diese Anwendung enthält Skripte, die eine Abhängigkeit herunterladen und in eine Ebene packen. Die Anwendung enthält auch entsprechende Funktionen, die die Abhängigkeit von der Ebene nutzen. Nachdem Sie eine Ebene erstellt haben, können Sie die entsprechende Funktion bereitstellen und aufrufen, um zu überprüfen, ob alles funktioniert. Diese Beispielanwendung verwendet die 20-Laufzeit von Node.js. Wenn Sie zusätzliche Abhängigkeiten zu Ihrer Ebene hinzufügen, müssen diese mit Node.js 20 kompatibel sein.

Die layer-nodejs-Beispielanwendung packt die lodash-Bibliothek in eine Lambda-Ebene. Das layer-Verzeichnis enthält die Skripten zur Generierung der Ebene. Das function-Verzeichnis enthält eine Beispielfunktion, mit der Sie testen können, ob die Ebene funktioniert. In diesem Dokument wird beschrieben, wie Sie diese Ebene erstellen, verpacken, bereitstellen und testen.

Kompatibilität der Node.js- Ebene mit der Lambda-Laufzeitumgebung

Wenn Sie Code in einer Node.js- Ebene verpacken, geben Sie die Lambda-Laufzeitumgebungen an, mit denen der Code kompatibel ist. Um die Codekompatibilität mit einer Laufzeit zu beurteilen, sollten Sie sich überlegen, für welche Versionen von Node.js, für welche Betriebssysteme und für welche Befehlssatzarchitekturen der Code konzipiert ist.

Lambda-Node.js-Laufzeiten geben ihre Node.js-Version und ihr Betriebssystem an. In diesem Dokument verwenden Sie die Node.js-20-Laufzeit, die auf AL2023 basiert. Weitere Informationen zu Laufzeitversionen finden Sie unter Unterstützte Laufzeiten. Wenn Sie eine Lambda-Funktion erstellen, geben Sie die Befehlssatzarchitektur an. In diesem Dokument verwenden Sie die arm64-Architektur. Weitere Informationen über Architekturen in Lambda finden Sie unter Auswahl und Konfiguration einer Befehlssatzarchitektur für Ihre Lambda-Funktion.

Wenn Sie Code verwenden, der in einem Paket bereitgestellt wird, definiert jeder Paketbetreuer unabhängig dessen Kompatibilität. Die meisten Node.js-Entwicklungen sind so konzipiert, dass sie unabhängig von Betriebssystem und Befehlssatzarchitektur funktionieren. Außerdem sind Inkompatibilitäten mit neuen Node.js-Versionen nicht so häufig. Rechnen Sie damit, dass Sie mehr Zeit damit verbringen werden, die Kompatibilität zwischen den Paketen zu prüfen, als die Kompatibilität der Pakete mit der Node.js-Version, dem Betriebssystem oder der Befehlssatzarchitektur zu prüfen.

Manchmal enthalten Node.js-Pakete kompilierten Code, bei dem Sie die Kompatibilität mit dem Betriebssystem und der Befehlssatzarchitektur berücksichtigen müssen. Wenn Sie die Kompatibilität des Codes für Ihre Pakete beurteilen müssen, müssen Sie die Pakete und ihre Dokumentation untersuchen. NPM-Pakete können ihre Kompatibilität über die Felder engines, os und cpu in ihrer Manifestdatei package.json angeben. Weitere Informationen über package.json-Dateien finden Sie unter package.json in der NPM-Dokumentation.

Ebenenpfade für Node.js-Laufzeiten

Wenn Sie einer Funktion eine Ebene hinzufügen, lädt Lambda den Ebeneninhalt in die Ausführungsumgebung. Wenn Ihre Ebene Abhängigkeiten in bestimmten Ordnerpfaden verpackt, erkennt die Node.js-Ausführungsumgebung die Module, und Sie können in Ihrem Funktionscode auf die Module verweisen.

Um sicherzustellen, dass Ihre Module aufgenommen werden, verpacken Sie sie in Ihre Ebenen-.zip-Datei in einem der folgenden Ordnerpfade. Diese Dateien werden in /opt gespeichert, und die Ordnerpfade werden in die Umgebungsvariable PATH geladen.

  • nodejs/node_modules

  • nodejs/nodeX/node_modules

Die resultierende Ebenen-.zip-Datei, die Sie in diesem Tutorial erstellen, hat beispielsweise die folgende Verzeichnisstruktur:

layer_content.zip └ nodejs └ node20 └ node_modules └ lodash └ <other potential dependencies> └ ...

Sie werden die lodash Bibliothek in das nodejs/node20/node_modules-Verzeichnis einfügen. Dadurch wird sichergestellt, dass Lambda die Bibliothek bei Funktionsaufrufen finden kann.

Verpacken des Ebeneninhalts

In diesem Beispiel verpacken Sie die lodash-Bibliothek in einer Ebenen-.zip-Datei. Führen Sie die folgenden Schritte aus, um den Ebeneninhalt zu installieren und zu verpacken.

So installieren und verpacken Sie Ihren Ebeneninhalt
  1. Klonen Sie das aws-lambda-developer-guide-Repository von GitHub, das den Beispielcode enthält, den Sie im sample-apps/layer-nodejs-Verzeichnis benötigen.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Wechseln Sie in das Verzeichnis layer der layer-nodejs-Beispielanwendung. Dieses Verzeichnis enthält die Skripts, die Sie verwenden, um die Ebene ordnungsgemäß zu erstellen und zu verpacken.

    cd aws-lambda-developer-guide/sample-apps/layer-nodejs/layer
  3. Vergewissern Sie sich, dass in der package.json-Datei lodash aufgeführt ist. Diese Datei definiert die Abhängigkeiten, die Sie in die Ebene aufnehmen möchten. Sie können diese Datei aktualisieren, um alle Abhängigkeiten einzubeziehen, die Sie in Ihrer Ebene wünschen.

    Anmerkung

    Das in diesem Schritt verwendete package.json wird nicht gespeichert oder mit Ihren Abhängigkeiten verwendet, nachdem sie in eine Lambda-Ebene hochgeladen wurden. Sie wird nur im Paketierungsprozess der Ebene verwendet und gibt keinen Ausführungsbefehl und keine Kompatibilität an, wie es die Datei in einer Node.js-Anwendung oder einem veröffentlichten Paket tun würde.

  4. Vergewissern Sie sich, dass Sie über eine Shell-Berechtigung zur Ausführung der Skripte im layer-Verzeichnis verfügen.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Führen Sie das Skript 1-install.sh mit dem folgenden Befehl aus:

    ./1-install.sh

    Dieses Skript führt npm install aus, das Ihr package.json liest und die darin definierten Abhängigkeiten herunterlädt.

    Beispiel 1-install.sh
    npm install .
  6. Führen Sie das Skript 2-package.sh mit dem folgenden Befehl aus:

    ./2-package.sh

    Dieses Skript kopiert den Inhalt aus dem node_modules-Verzeichnis in ein neues Verzeichnis mit dem Namen nodejs/node20. Anschließend wird der Inhalt des Verzeichnisses nodejs in eine Datei namens layer_content.zip gepackt. Dies ist die ZIP-Datei für Ihre Ebene. Sie können die Datei entpacken und überprüfen, ob sie die richtige Dateistruktur enthält, wie im Abschnitt Ebenenpfade für Node.js-Laufzeiten gezeigt.

    Beispiel 2-package.sh
    mkdir -p nodejs/node20 cp -r node_modules nodejs/node20/ zip -r layer_content.zip nodejs

Erstellen der Ebene

Nehmen Sie die layer_content.zip-Datei, die Sie im vorherigen Abschnitt erstellt haben und laden Sie sie als Lambda-Ebene hoch. Sie können eine Ebene mit der AWS Management Console oder der Lambda-API über die AWS Command Line Interface (AWS CLI) hochladen. Wenn Sie die .zip-Datei Ihrer Ebene hochladen, geben Sie im folgenden Befehl PublishLayerVersion AWS CLI nodejs20.x als kompatible Laufzeit und arm64 als kompatible Architektur an.

aws lambda publish-layer-version --layer-name nodejs-lodash-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes nodejs20.x \ --compatible-architectures "arm64"

Notieren Sie sich aus der Antwort den LayerVersionArn, der wie arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1 aussieht. Sie benötigen diesen Amazon-Ressourcennamen (ARN) im nächsten Schritt dieses Tutorials, wenn Sie die Ebene zu Ihrer Funktion hinzufügen.

Hinzufügen der Ebene zur Funktion

Stellen Sie eine Lambda-Beispielfunktion bereit, die die lodash-Bibliothek in ihrem Funktionscode verwendet, und fügen Sie dann die von Ihnen erstellte Ebene hinzu. Um die Funktion bereitzustellen, benötigen Sie eine Ausführungsrolle. Weitere Informationen finden Sie unter Definieren von Lambda-Funktionsberechtigungen mit einer Ausführungsrolle. Wenn Sie noch keine Ausführungsrolle haben, folgen Sie den Schritten im zusammenklappbaren Abschnitt. Andernfalls überspringen Sie diesen Abschnitt und gehen Sie direkt zum Bereitstellen der Funktion.

So erstellen Sie eine Ausführungsrolle
  1. Öffnen Sie die Seite Roles (Rollen) in der IAM-Konsole.

  2. Wählen Sie Rolle erstellen.

  3. Erstellen Sie eine Rolle mit den folgenden Eigenschaften.

    • Trusted entity (Vertrauenswürdige Entität)Lambda.

    • Permissions (Berechtigungen)AWSLambdaBasicExecutionRole.

    • Role name (Name der Rollelambda-role.

    Die Richtlinie AWSLambdaBasicExecutionRole verfügt über die Berechtigungen, die die Funktion zum Schreiben von Protokollen in CloudWatch Logs benötigt.

Der Beispielfunktionscode verwendet die Methode lodash _.findLastIndex, um ein Array von Objekten zu lesen. Er vergleicht die Objekte mit einem Kriterium, um den Index einer Übereinstimmung zu finden. Anschließend werden der Index und der Wert des Objekts in der Lambda-Antwort zurückgegeben.

import _ from "lodash" export const handler = async (event) => { var users = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; };
So stellen Sie die Lambda-Funktion bereit
  1. Navigieren Sie zum function/ Verzeichnis . Wenn Sie sich gerade in dem layer/-Verzeichnis befinden, führen Sie den folgenden Befehl aus:

    cd ../function-js
  2. Erstellen Sie mit dem folgenden Befehl ein Bereitstellungspaket in Form einer .zip-Datei:

    zip my_deployment_package.zip index.mjs
  3. Bereitstellen der Funktion. Ersetzen Sie im folgenden AWS CLI-Befehl den --role-Parameter durch den ARN Ihrer Ausführungsrolle:

    aws lambda create-function --function-name nodejs_function_with_layer \ --runtime nodejs20.x \ --architectures "arm64" \ --handler index.handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. Fügen Sie die Ebene zu Ihrer Funktion hinzu. Ersetzen Sie im folgenden AWS CLI-Befehl den --layers-Parameter durch die ARN der Ebenenversion, die Sie zuvor notiert haben:

    aws lambda update-function-configuration --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1"
  5. Rufen Sie Ihre Funktion mit dem folgenden AWS CLI-Befehl auf, um zu überprüfen, ob sie funktioniert:

    aws lambda invoke --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{}' response.json

    Die Ausgabe sollte in etwa wie folgt aussehen:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    Die response.json-Ausgabedatei enthält Details zur Antwort.

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS-Ressourcen, die Sie nicht mehr verwenden, können Sie verhindern, dass unnötige Gebühren in Ihrem AWS-Konto-Konto anfallen.

Um die Lambda-Ebene zu löschen
  1. Öffnen Sie die Seite Ebenen der Lambda-Konsole.

  2. Wählen Sie die Ebene aus, die Sie erstellt haben.

  3. Klicken Sie auf Löschen und dann erneut auf Löschen.

So löschen Sie die Lambda-Funktion:
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die Funktion aus, die Sie erstellt haben.

  3. Wählen Sie Aktionen, Löschen aus.

  4. Geben Sie delete in das Texteingabefeld ein und wählen Sie Delete (Löschen) aus.