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 Java-Lambda-Funktionen
Eine Lambda-Schicht ist ein ZIP-Dateiarchiv, das zusätzlichen Code oder Daten enthält. Ebenen enthalten üblicherweise Bibliotheksabhängigkeiten, eine benutzerdefinierte Laufzeit oder Konfigurationsdateien. Das Erstellen einer Ebene umfasst drei allgemeine Schritte:
-
Package Sie Ihren Layer-Inhalt. Das bedeutet, dass Sie ein ZIP-Dateiarchiv erstellen müssen, 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 Java-Lambda-Schicht mit externen Bibliotheksabhängigkeiten.
Themen
Voraussetzungen
Um die Schritte in diesem Abschnitt ausführen zu können, müssen Sie über Folgendes verfügen:
Anmerkung
Stellen Sie sicher, dass die Java-Version, auf die sich Maven bezieht, mit der Java-Version der Funktion identisch ist, die Sie bereitstellen möchten. Für eine Java 21-Funktion sollte der mvn -v
Befehl beispielsweise die Java-Version 21 in der Ausgabe auflisten:
Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...
In diesem Thema verweisen wir auf die layer-java
Die layer-java
Beispielanwendung enthält ein einzelnes Beispiel in zwei Unterverzeichnissen. Das layer
Verzeichnis enthält eine pom.xml
Datei, die die Layer-Abhängigkeiten definiert, sowie Skripts zur Generierung der Ebene. Das function
Verzeichnis enthält eine Beispielfunktion, mit deren Hilfe getestet werden kann, ob der Layer funktioniert. In diesem Tutorial wird beschrieben, wie Sie diesen Layer erstellen und verpacken.
Java-Layer-Kompatibilität mit Amazon Linux
Der erste Schritt beim Erstellen einer Ebene besteht darin, den gesamten Ebeneninhalt in einem ZIP-Dateiarchiv zu bündeln. Da Lambda-Funktionen unter Amazon Linux ausgeführt werden, muss Ihr Ebeneninhalt in einer Linux-Umgebung kompiliert und erstellt werden können.
Java-Code ist plattformunabhängig konzipiert, sodass Sie Ihre Ebenen auf Ihrem lokalen Computer packen können, auch wenn dieser keine Linux-Umgebung verwendet. Nachdem Sie den Java-Layer auf Lambda hochgeladen haben, ist er weiterhin mit Amazon Linux kompatibel.
Layer-Pfade für Java-Laufzeiten
Wenn Sie einer Funktion eine Ebene hinzufügen, lädt Lambda den Ebeneninhalt in das Verzeichnis /opt
der Ausführungsumgebung. Für jede Lambda-Laufzeit enthält die Variable PATH
bereits spezifische Ordnerpfade innerhalb des Verzeichnisses /opt
. Um sicherzustellen, dass die PATH
Variable Ihren Layer-Inhalt aufnimmt, sollte Ihre Layer-.zip-Datei ihre Abhängigkeiten in den folgenden Ordnerpfaden haben:
-
java/lib
Die resultierende Layer-ZIP-Datei, die Sie in diesem Tutorial erstellen, hat beispielsweise die folgende Verzeichnisstruktur:
layer_content.zip
└ java
└ lib
└ layer-java-layer-1.0-SNAPSHOT.jar
Die layer-java-layer-1.0-SNAPSHOT.jar
JAR Datei (eine Uber-Jar-Datei, die alle unsere erforderlichen Abhängigkeiten enthält) befindet sich korrekt im Verzeichnis. java/lib
Dadurch wird sichergestellt, dass Lambda die Bibliothek bei Funktionsaufrufen finden kann.
Verpacken des Layer-Inhalts
In diesem Beispiel packen Sie die folgenden zwei Java-Bibliotheken in eine einzige JAR Datei:
-
aws-lambda-java-core
— Ein minimaler Satz von Schnittstellendefinitionen für die Arbeit mit Java in AWS Lambda -
Jackson
— Eine beliebte Suite von Datenverarbeitungstools, insbesondere für die Arbeit mitJSON.
Gehen Sie wie folgt vor, um den Layer-Inhalt zu installieren und zu verpacken.
So installieren und verpacken Sie Ihre Layer-Inhalte
-
Klonen Sie das
aws-lambda-developer-guide
GitHub Repo, das den Beispielcode enthält, den Sie im sample-apps/layer-java
Verzeichnis benötigen.git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
Navigieren Sie zum
layer
Verzeichnis derlayer-java
Beispiel-App. Dieses Verzeichnis enthält die Skripts, die Sie verwenden, um den Layer ordnungsgemäß zu erstellen und zu verpacken.cd aws-lambda-developer-guide/sample-apps/layer-java/layer
-
Untersuchen Sie die
pom.xml
Datei. In <dependencies>
diesem Abschnitt definieren Sie die Abhängigkeiten, die Sie in die Ebene aufnehmen möchten, nämlich diejackson-databind
Bibliothekenaws-lambda-java-core
und. Sie können diese Datei so aktualisieren, dass sie alle Abhängigkeiten enthält, die Sie in Ihre eigene Ebene aufnehmen möchten.Beispiel pom.xml
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
Anmerkung
Der
<build>
Abschnitt dieserpom.xml
Datei enthält zwei Plugins. Das maven-compiler-pluginkompiliert den Quellcode. Das maven-shade-plugin packt deine Artefakte in ein einziges Uber-Jar. -
Stellen Sie sicher, dass Sie berechtigt sind, beide Skripts auszuführen.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Führen Sie das
1-install.sh
Skript mit dem folgenden Befehl aus: ./1-install.sh
Dieses Skript wird
mvn clean install
im aktuellen Verzeichnis ausgeführt. Dadurch wird das Uber-Jar mit allen erforderlichen Abhängigkeiten imtarget/
Verzeichnis erstellt.Beispiel 1-install.sh
mvn clean install
-
Führen Sie das
2-package.sh
Skript mit dem folgenden Befehl aus: ./2-package.sh
Dieses Skript erstellt die
java/lib
Verzeichnisstruktur, die Sie benötigen, um Ihren Layer-Inhalt ordnungsgemäß zu verpacken. Anschließend kopiert es die Uber-Jar-Datei aus dem/target
Verzeichnis in das neu erstelltejava/lib
Verzeichnis. Schließlich komprimiert das Skript den Inhalt desjava
Verzeichnisses in eine Datei mit dem Namen.layer_content.zip
Dies ist die ZIP-Datei für Ihren Layer. Sie können die Datei entpacken und überprüfen, ob sie die richtige Dateistruktur enthält, wie im Layer-Pfade für Java-Laufzeiten Abschnitt gezeigt.Beispiel 2-package.sh
mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java
Die Ebene erstellen
In diesem Abschnitt nehmen Sie die layer_content.zip
Datei, die Sie im vorherigen Abschnitt generiert haben, und laden sie als Lambda-Schicht hoch. Sie können eine Ebene mit dem AWS Management Console oder dem Lambda API über die AWS Command Line Interface (AWS CLI) hochladen. Wenn Sie Ihre Layer-.zip-Datei hochladen, geben Sie java21
im folgenden PublishLayerVersion AWS CLI Befehl die kompatible Laufzeit und die kompatible arm64
Architektur an.
aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"
Notieren Sie sich aus der Antwort denLayerVersionArn
, der wie arn:aws:lambda:us-east-1:
aussieht. Sie benötigen diesen Amazon-Ressourcennamen (ARN) im nächsten Schritt dieses Tutorials, wenn Sie den Layer zu Ihrer Funktion hinzufügen.123456789012
:layer:java-jackson-layer:1
Hinzufügen der Ebene zu Ihrer Funktion
In diesem Abschnitt stellen Sie eine Lambda-Beispielfunktion bereit, die die Jackson-Bibliothek in ihrem Funktionscode verwendet, und fügen dann den Layer hinzu. Um die Funktion bereitzustellen, benötigen Sie eineDefinieren von Lambda-Funktionsberechtigungen mit einer Ausführungsrolle. Wenn Sie noch keine Ausführungsrolle haben, folgen Sie den Schritten im Abschnitt „Zusammenklappbar“.
So erstellen Sie eine Ausführungsrolle
-
Öffnen Sie die Rollenseite
in der IAM Konsole. -
Wählen Sie Rolle erstellen.
-
Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
-
Trusted entity (Vertrauenswürdige Entität) – Lambda.
-
Berechtigungen — AWSLambdaBasicExecutionRole.
-
Role name (Name der Rolle –
lambda-role
.
Die AWSLambdaBasicExecutionRoleRichtlinie verfügt über die Berechtigungen, die die Funktion benötigt, um Protokolle in Logs zu CloudWatch schreiben.
-
Der Lambda-FunktionscodeMap<String, String>
als Eingabe auf und verwendet Jackson, um die Eingabe als JSON Zeichenfolge zu schreiben, bevor sie in ein vordefiniertes F1Car-Java-Objekt
package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
So stellen Sie die Lambda-Funktion bereit
-
Navigieren Sie zum
function/
Verzeichnis . Wenn Sie sich derzeit in demlayer/
Verzeichnis befinden, führen Sie den folgenden Befehl aus:cd ../function
-
Erstellen Sie das Projekt mit dem folgenden Maven-Befehl:
mvn package
Dieser Befehl erzeugt eine JAR Datei in dem
target/
Verzeichnis mit dem Namenlayer-java-function-1.0-SNAPSHOT.jar
. -
Stellen Sie die Funktion bereit. Ersetzen Sie im folgenden AWS CLI Befehl den
--role
Parameter durch Ihre AusführungsrolleARN:aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role
arn:aws:iam::123456789012:role/lambda-role
\ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar -
Als Nächstes fügen Sie die Ebene Ihrer Funktion hinzu. Ersetzen Sie im folgenden AWS CLI Befehl den
--layers
Parameter durch die Layer-VersionARN, die Sie zuvor notiert haben:aws lambda update-function-configuration --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1
" -
Versuchen Sie abschließend, Ihre Funktion mit dem folgenden AWS CLI Befehl aufzurufen:
aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json
Die Ausgabe sollte in etwa wie folgt aussehen:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
Dies deutet darauf hin, dass die Funktion die Jackson-Abhängigkeit verwenden konnte, um die Funktion ordnungsgemäß auszuführen. Sie können überprüfen, ob die
response.json
Ausgabedatei den richtigen zurückgegebenen String enthält:"Max Verstappen is a driver for team Red Bull"
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, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.
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.
-
Wählen Sie „Löschen“ und anschließend erneut „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.