Arbeiten mit Ebenen für Java 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 Java 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 Java-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:

Anmerkung

Stellen Sie sicher, dass die Java-Version, auf die sich Maven bezieht, mit der Java-Version der Funktion übereinstimmt, 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 Beispielanwendung imGitHub-Repository awsdocs. Diese Anwendung enthält Skripts, mit denen die Abhängigkeiten heruntergeladen und die Ebene generiert werden. Die Anwendung enthält auch eine entsprechende Funktion, die Abhängigkeiten aus der Ebene verwendet. Nachdem Sie eine Ebene erstellt haben, können Sie die entsprechende Funktion bereitstellen und aufrufen, um zu überprüfen, ob alles ordnungsgemäß funktioniert. Da Sie die Java 21-Laufzeit für die Funktionen verwenden, müssen die Ebenen auch mit Java 21 kompatibel sein.

Die layer-java-Beispielanwendung enthält ein einzelnes Beispiel in zwei Unterverzeichnissen. Das layer-Verzeichnis enthält eine pom.xml-Datei, die die Ebenen-Abhängigkeiten definiert, sowie Skripts zur Generierung der Ebene. Das function-Verzeichnis enthält eine Beispielfunktion, mit deren Hilfe getestet werden kann, ob die Ebene funktioniert. In diesem Tutorial wird beschrieben, wie Sie diese Ebene 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 so konzipiert, dass er plattformunabhängig ist, sodass Sie Ihre Ebenen auf Ihrem lokalen Computer packen können, auch wenn dieser keine Linux-Umgebung verwendet. Nachdem Sie die Java-Ebene auf Lambda hochgeladen haben, ist sie weiterhin mit Amazon Linux kompatibel.

Ebenenpfade 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 Ebeneninhalt aufnimmt, sollte Ihre Ebenen-.zip-Datei ihre Abhängigkeiten in den folgenden Ordnerpfaden haben:

  • java/lib

Die resultierende Ebenen-.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, die alle unsere erforderlichen Abhängigkeiten enthält) befindet sich korrekt im java/lib-Verzeichnis. Dadurch wird sichergestellt, dass Lambda die Bibliothek bei Funktionsaufrufen finden kann.

Verpacken des Ebeneninhalts

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 mit JSON.

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 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
  2. Wechseln Sie in das Verzeichnis layer der layer-java-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-java/layer
  3. Überprüfen der pom.xml Datei. Im Abschnitt <dependencies> definieren Sie die Abhängigkeiten, die Sie in die Ebene aufnehmen wollen, nämlich die aws-lambda-java-core- und jackson-databind-Bibliotheken. 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 dieser pom.xml-Datei enthält zwei Plugins. Das maven-compiler-plugin kompiliert den Quellcode. Das maven-shade-plugin packt Ihre Artefakte in ein einziges uber-jar.

  4. Stellen Sie sicher, dass Sie berechtigt sind, beide Skripte auszuführen.

    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 mvn clean install im aktuellen Verzeichnis aus. Dadurch wird das uber-jar mit allen erforderlichen Abhängigkeiten im target/-Verzeichnis erstellt.

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

    ./2-package.sh

    Dieses Skript erstellt die java/lib-Verzeichnisstruktur, die Sie benötigen, um Ihre Ebeneninhalte ordnungsgemäß zu verpacken. Es kopiert dann das uber-jar aus dem /target-Verzeichnis in das neu erstellte java/lib-Verzeichnis. Schließlich komprimiert das Skript den Inhalt des java-Verzeichnisses in eine Datei mit dem Namen layer_content.zip. 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 Java-Laufzeiten 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

Erstellen der Ebene

In diesem Abschnitt nehmen Sie die layer_content.zip-Datei, die Sie im vorherigen Abschnitt generiert haben und laden 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 java21 als kompatible Laufzeit und arm64 als kompatible 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 den LayerVersionArn, der wie arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-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

In diesem Abschnitt stellen Sie eine Beispiel-Lambda-Funktion bereit, die die Jackson-Bibliothek in ihrem Funktionscode verwendet und fügen dann die Ebene hinzu. Um die Funktion bereitzustellen, benötigen Sie eine Definieren von Lambda-Funktionsberechtigungen mit einer Ausführungsrolle. Wenn Sie noch keine Ausführungsrolle haben, folgen Sie den Schritten im zusammenklappbaren Abschnitt.

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 Lambda-Funktionscode nimmt ein Map<String, String> als Eingabe auf und verwendet Jackson, um die Eingabe als JSON-String zu schreiben, bevor er sie in ein vordefiniertes Java-Objekt F1Car umwandelt. Schließlich verwendet die Funktion Felder aus dem F1Car-Objekt, um einen String zu erstellen, den die Funktion zurückgibt.

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
  1. Navigieren Sie zum function/ Verzeichnis . Wenn Sie sich gerade in dem layer/-Verzeichnis befinden, führen Sie den folgenden Befehl aus:

    cd ../function
  2. Erstellen Sie das Projekt mit dem folgenden Maven-Befehl:

    mvn package

    Dieser Befehl erzeugt eine JAR-Datei im target/-Verzeichnis namens layer-java-function-1.0-SNAPSHOT.jar.

  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 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
  4. Fügen Sie als Nächstes 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 java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1"
  5. 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 bedeutet, dass die Funktion die Jackson-Abhängigkeit nutzen konnte, um die Funktion ordnungsgemäß auszuführen. Sie können überprüfen, ob die Ausgabedatei response.json die richtige zurückgegebene Zeichenfolge 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, 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.