Erstellen und Freigeben von Lambda-Ebenen - AWS Lambda

Erstellen und Freigeben von Lambda-Ebenen

Eine Lambda-Ebene ist ein ZIP-Dateiarchiv, das zusätzlichen Code oder Daten enthalten kann. Eine Ebene kann Bibliotheken, eine benutzerdefinierte Laufzeit, Daten oder Konfigurationsdateien enthalten. Ebenen fördern die gemeinsame Nutzung von Code und die Trennung von Verantwortlichkeiten, damit Sie beim Schreiben von Geschäftslogik schneller iterieren können.

Sie können Ebenen nur mit Lambda-Funktionen verwenden, die als ZIP-Dateiarchiv bereitgestellt werden. Bei als Container-Bild definierten Funktionen verpacken Sie Ihre bevorzugte Laufzeitumgebung und alle Codeabhängigkeiten beim Erstellen des Container-Bildes. Weitere Informationen finden Sie unter Arbeiten mit Lambda-Ebenen und Erweiterungen in Container-Images im AWS-Computing-Blog.

Sie können Ebenen mit der Lambda Konsole, der Lambda-API, AWS CloudFormation, oder der AWS Serverless Application Model (AWS SAM) erstellen. Weitere Informationen zum Erstellen von Ebenen mit AWS SAM finden Sie unter Arbeiten mit Ebenen im AWS Serverless Application Model-Entwicklerhandbuch.

Erstellen von Ebeneninhalt

Wenn Sie eine Ebene erstellen, müssen Sie den gesamten Inhalt in einem ZIP-Dateiarchiv bündeln. Sie laden das ZIP-Dateiarchiv von Amazon Simple Storage Service (Amazon S3) oder Ihrem lokalen Computer auf Ihre Ebene hoch. Lambda extrahiert den Ebenen-Inhalt in das /opt-Verzeichnis, wenn die Ausführungsumgebung für die Funktion eingerichtet wird.

Kompilieren des Zip-Dateiarchivs für Ihre Ebene

Sie erstellen Ihren Ebenen-Code in ein ZIP-Dateiarchiv, indem Sie das gleiche Verfahren verwenden, das Sie für ein Funktionsbereitstellungspaket verwenden würden. Wenn Ihre Ebene native Codebibliotheken enthält, müssen Sie diese Bibliotheken mit einem Linux-Entwicklungscomputer kompilieren und erstellen, damit die Binärdateien mit Amazon Linux kompatibel sind.

Eine Möglichkeit, die korrekte Verpackung von Bibliotheken für Lambda sicherzustellen, ist die Verwendung von AWS Cloud9. Weitere Informationen finden Sie unter Verwenden von Lambda-Ebenen zur Vereinfachung Ihres Entwicklungsprozesses im AWS-Computing-Blog.

Einbinden von Bibliotheksabhängigkeiten in einer Ebene

Für jede Lambda-Laufzeit enthält die Variable PATH bestimmte Ordner im /opt-Verzeichnis. Wenn Sie dieselbe Ordnerstruktur in Ihrem Ebenen-.zip-Dateiarchiv definieren, kann Ihr Funktionscode ohne Angabe des Pfades auf den Ebeneninhalt zugreifen.

In der folgenden Tabelle sind die Ordnerpfade aufgeführt, die jede Laufzeitumgebung unterstützt.

Ebenenpfade für jede Lambda-Laufzeit
Laufzeit Pfad

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

python/lib/python3.9/site-packages (Site-Verzeichnisse)

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.7.0 (GEM_PATH)

ruby/lib (RUBYLIB)

Alle Laufzeiten

bin (PATH)

lib (LD_LIBRARY_PATH)

Die folgenden Beispiele zeigen, wie Sie die Ordner im ZIP-Archiv Ihrer Ebene strukturieren können.

Node.js

Beispiel Dateistruktur für das AWS X-Ray-SDK für Node.js

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
Python

Beispiel Dateistruktur für die Pillow-Bibliothek

pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
Ruby

Beispiel Dateistruktur für das JSON-Gem

json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
Java

Beispiel Dateistruktur für Jackson-JAR-Datei

jackson.zip └ java/lib/jackson-core-2.2.3.jar
All

Beispiel Dateistruktur für jq-Bibliothek

jq.zip └ bin/jq

Weitere Informationen zu Pfadeinstellungen in der Lambda-Ausführungsumgebung finden Sie unter Definierte Laufzeitumgebungsvariablen.

Sprachenspezifische Anweisungen

Sprachenspezifische Anweisungen zum Erstellen eines ZIP-Dateiarchivs finden Sie in den folgenden Themen:

Erstellen einer Ebene

Sie können neue Ebenen in der Lambda-Konsole oder mit der Lambda-API erstellen.

Ebenen können eine oder mehrere Versionen haben. Wenn Sie eine Ebene erstellen, legt Lambda die Ebenen-Version auf Version 1 fest. Sie können Berechtigungen für eine vorhandene Ebenen-Version konfigurieren, doch zur Aktualisierung des Codes oder Vornahme anderer Konfigurationsänderungen müssen Sie eine neue Version der Ebene erstellen.

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. Geben Sie unter Ebenen-Konfiguration unter Name einen Namen für Ihre Ebene ein.

  4. (Optional) Geben Sie im Feld Description (Beschreibung) eine Beschreibung für Ihre Ebene ein.

  5. Um Ihren Ebenencode hochzuladen, führen Sie einen der folgenden Schritte aus:

    • Um eine ZIP-Datei von Ihrem Computer hochzuladen, wählen Sie Eine ZIP-Datei hochladen. Wählen Sie Hochladen aus, um Ihre lokale ZIP-Datei auszuwählen.

    • Um eine Datei aus Amazon S3 hochzuladen, wählen Sie Hochladen einer Datei aus Amazon S3 aus. Geben Sie dann für Amazon-S3-Link-URL einen Link zu der Datei ein.

  6. (Optional) Für Compatible Runtimes (Kompatible Laufzeiten) wählen Sie bis zu 15 Laufzeiten aus.

  7. (Optional) Für License (Lizenz) geben Sie alle erforderlichen Lizenzinformationen ein.

  8. Wählen Sie Create aus.

So erstellen Sie eine Ebene (API)

Verwenden Sie zum Erstellen einer Ebene den Befehl publish-layer-version mit einem Namen, einer Beschreibung, einem ZIP-Dateiarchiv und einer Liste von mit der Ebene kompatiblen Laufzeiten. Die Liste der Laufzeiten ist optional.

aws lambda publish-layer-version --layer-name my-layer --description "My layer" \ --license-info "MIT" --content S3Bucket=lambda-layers-us-east-2-123456789012,S3Key=layer.zip \ --compatible-runtimes python3.6 python3.7 python3.8

Die Ausgabe sollte folgendermaßen oder ähnlich aussehen:

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }
Anmerkung

Mit jedem Aufruf von publish-layer-version erstellen Sie eine neue Version der Ebene.

Löschen einer Ebenen-Version

Verwenden Sie den Befehl delete-layer-version, um eine Ebenenversion zu löschen.

aws lambda delete-layer-version --layer-name my-layer --version-number 1

Wenn Sie eine Ebenenversion löschen, können Sie keine Lambda-Funktionen mehr für deren Verwendung konfigurieren. Funktionen, die diese Version bereits vorhanden, können jedoch weiterhin darauf zugreifen. Versionsnummern werden niemals für den Namen einer Ebene wiederverwendet.

Konfigurieren von Ebenenberechtigungen

Standardmäßig ist eine von Ihnen erstellte Ebene privat für Ihr AWS-Konto. Sie können die Ebene jedoch optional mit anderen Konten teilen oder öffentlich machen.

Um einem anderen Konto Nutzungsberechtigungen für Ebenen zu erteilen, fügen Sie der Berechtigungsrichtlinie der Ebenenversion mithilfe des Befehls add-layer-version-permission eine Anweisung hinzu. In jeder Anweisung können Sie einem einzelnen Konto, allen Konten oder einer Organisation eine Berechtigung erteilen.

aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text

Die Ausgabe sollte folgendermaßen oder ähnlich aussehen:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

Berechtigungen gelten nur für eine Version mit einer Ebene. Wiederholen Sie den Vorgang bei jeder Erstellung einer neuen Ebenenversion.

Weitere Beispiele finden Sie unter Gewähren des Ebenenzugriffs für andere Konten.

Verwendung von AWS CloudFormation mit Ebenen

Sie können AWS CloudFormation verwenden, um eine Ebene zu erstellen und die Ebene mit Ihrer Lambda-Funktion verknüpfen. Die folgende Beispielvorlage erstellt eine Ebene mit dem Namen blank-nodejs-lib und hängt die Ebene mithilfe der Eigenschaft Ebenen an die Lambda-Funktion an.

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: A Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. Content: S3Bucket: my-bucket-region-123456789012 S3Key: layer.zip CompatibleRuntimes: - nodejs12.x