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:
-
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.
-
Erstellen Sie die Ebene in Lambda.
-
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.
Themen
Voraussetzungen
Um die Schritte in diesem Abschnitt ausführen zu können, müssen Sie über folgende Voraussetzungen verfügen:
-
Node.js 20
und der npm -Paketmanager. Weitere Informationen zur Installation von Node.js finden Sie unter Installation von Node.js über den Paketmanager in der Node.js-Dokumentation.
In diesem Thema verweisen wir auf die layer-nodejs
Die layer-nodejs
-Beispielanwendung packt die lodashlayer
-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
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/node
X
/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
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
-
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
-
Wechseln Sie in das Verzeichnis
layer
derlayer-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
-
Vergewissern Sie sich, dass in der
package.json
-Dateilodash
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. -
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
-
Führen Sie das Skript 1-install.sh
mit dem folgenden Befehl aus: ./1-install.sh
Dieses Skript führt
npm install
aus, das Ihrpackage.json
liest und die darin definierten Abhängigkeiten herunterlädt.Beispiel 1-install.sh
npm install .
-
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 Namennodejs/node20
. Anschließend wird der Inhalt des Verzeichnissesnodejs
in eine Datei namenslayer_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:
aussieht. Sie benötigen diesen Amazon-Ressourcennamen (ARN) im nächsten Schritt dieses Tutorials, wenn Sie die Ebene zu Ihrer Funktion hinzufügen.123456789012
:layer:nodejs-lodash-layer:1
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
-
Öffnen Sie die Seite Roles (Rollen)
in der IAM-Konsole. -
Wählen Sie Rolle erstellen.
-
Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
-
Trusted entity (Vertrauenswürdige Entität) – Lambda.
-
Permissions (Berechtigungen) – AWSLambdaBasicExecutionRole.
-
Role name (Name der Rolle –
lambda-role
.
Die Richtlinie AWSLambdaBasicExecutionRole verfügt über die Berechtigungen, die die Funktion zum Schreiben von Protokollen in CloudWatch Logs benötigt.
-
Der Beispielfunktionscode_.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
-
Navigieren Sie zum
function/
Verzeichnis . Wenn Sie sich gerade in demlayer/
-Verzeichnis befinden, führen Sie den folgenden Befehl aus:cd ../function-js
-
Erstellen Sie mit dem folgenden Befehl ein Bereitstellungspaket in Form einer .zip-Datei:
zip my_deployment_package.zip index.mjs
-
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 -
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
" -
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
-
Öffnen Sie die Seite Ebenen
der Lambda-Konsole. -
Wählen Sie die Ebene aus, die Sie erstellt haben.
-
Klicken Sie auf Löschen und dann erneut auf Löschen.
So löschen Sie die Lambda-Funktion:
-
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie die Funktion aus, die Sie erstellt haben.
-
Wählen Sie Aktionen, Löschen aus.
-
Geben Sie
delete
in das Texteingabefeld ein und wählen Sie Delete (Löschen) aus.