View a markdown version of this page

Bereitstellen von Java-Lambda-Funktionen mit Container-Images - 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.

Bereitstellen von Java-Lambda-Funktionen mit Container-Images

Es gibt drei Möglichkeiten, ein Container-Image für eine Java-Lambda-Funktion zu erstellen:

Tipp

Um die Zeit zu reduzieren, die benötigt wird, bis Lambda-Container-Funktionen aktiv werden, siehe die Docker-Dokumentation unter Verwenden mehrstufiger Builds. Um effiziente Container-Images zu erstellen, folgen Sie den Bewährte Methoden für das Schreiben von Dockerfiles.

Auf dieser Seite wird erklärt, wie Sie Container-Images für Lambda erstellen, testen und bereitstellen.

AWS Basisimages für Java

AWS stellt die folgenden Basisimages für Java bereit:

Tags (Markierungen) Laufzeit Betriebssystem Dockerfile Ablehnung

25

Java 2.5 Amazon Linux 2023 Dockerfile für Java 25 auf GitHub

30. Juni 2029

21

Java 21 Amazon Linux 2023 Dockerfile für Java 21 an GitHub

30. Juni 2029

17. April 2023

Java 17 Amazon Linux 2023 Dockerfile für Java 17 auf GitHub

Nicht geplant

11. April 2023

Java 11 Amazon Linux 2023 Dockerfile für Java 11 an GitHub

Nicht geplant

8. April 2023

Java 8 Amazon Linux 2023 Dockerfile für Java 8 an GitHub

Nicht geplant

17

Java 17 Amazon Linux 2 Dockerfile für Java 17 an GitHub

30. Juni 2027

11

Java 11 Amazon Linux 2 Dockerfile für Java 11 an GitHub

30. Juni 2027

8.al2

Java 8 Amazon Linux 2 Dockerfile für Java 8 an GitHub

30. Juni 2027

Amazon ECR-Repository: gallery.ecr. aws/lambda/java

Die Basis-Images für Java 21 und höher basieren auf dem Amazon Linux 2023 Minimal Container Image. Frühere Basis-Images verwenden Amazon Linux 2. AL2023 bietet mehrere Vorteile gegenüber Amazon Linux 2, darunter einen geringeren Bereitstellungsaufwand und aktualisierte Versionen von Bibliotheken wie glibc.

AL2023-based Bilder verwenden microdnf (symbolisch verlinkt alsdnf) als Paketmanager, anstattyum, was der Standard-Paketmanager in Amazon Linux 2 ist. microdnfist eine eigenständige Implementierung von. dnf Eine Liste der Pakete, die in AL2023-based Images enthalten sind, finden Sie in den Spalten Minimaler Container unter Vergleichen von Paketen, die auf Amazon Linux 2023 Container Images installiert sind. Weitere Informationen zu den Unterschieden zwischen AL2023 und Amazon Linux 2 finden Sie unter Introducing the Amazon Linux 2023 runtime for AWS Lambda im AWS -Compute-Blog.

Anmerkung

Um AL2023-based Images lokal auszuführen, einschließlich mit AWS Serverless Application Model (AWS SAM), müssen Sie die Docker-Version 20.10.10 oder höher verwenden.

Mit einem AWS Basis-Image für Java

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Maven
  1. Führen Sie den folgenden Befehl aus, um ein Maven-Projekt mit dem Archetyp für Lambda zu erstellen. Die folgenden Parameter sind erforderlich:

    • service — Der AWS-Service Client, der in der Lambda-Funktion verwendet werden soll. Eine Liste der verfügbaren Quellen finden Sie unter aws-sdk-java- on. v2/services GitHub

    • Region — Der AWS-Region Ort, an dem Sie die Lambda-Funktion erstellen möchten.

    • groupId – Der vollständige Paket-Namespace Ihrer Anwendung.

    • artifactId – Ihr Projektname. Dies wird der Name des Verzeichnisses für Ihr Projekt.

    Führen Sie unter Linux und macOS folgenden Befehl aus:

    mvn -B archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-lambda -Dservice=s3 -Dregion=US_WEST_2 \ -DgroupId=com.example.myapp \ -DartifactId=myapp

    Führen Sie in PowerShell den folgenden Befehl aus:

    mvn -B archetype:generate ` "-DarchetypeGroupId=software.amazon.awssdk" ` "-DarchetypeArtifactId=archetype-lambda" "-Dservice=s3" "-Dregion=US_WEST_2" ` "-DgroupId=com.example.myapp" ` "-DartifactId=myapp"

    Der Maven-Archetyp für Lambda ist für die Kompilierung mit Java SE 8 vorkonfiguriert und enthält eine Abhängigkeit von der AWS SDK for Java. Wenn Sie Ihr Projekt mit einem anderen Archetyp oder mit einer anderen Methode erstellen, müssen Sie den Java-Compiler für Maven konfigurieren und das SDK als Abhängigkeit deklarieren.

  2. Öffnen Sie das myapp/src/main/java/com/example/myapp-Verzeichnis, und suchen Sie die App.java-Datei. Dies ist der Code für die Lambda-Funktion. Sie können den bereitgestellten Beispielcode zum Testen verwenden oder ihn durch Ihren eigenen ersetzen.

  3. Navigieren Sie zurück zum Stammverzeichnis des Projekts und erstellen Sie ein neues Dockerfile mit der folgenden Konfiguration:

    • Setzen Sie die FROM-Eigenschaft auf den URI des Basis-Images.

    • Legen Sie das CMD-Argument auf den Lambda-Funktionshandler fest.

    Beachten Sie, dass das Dockerfile-Beispiel keine USER-Anweisung enthält. Wenn Sie ein Container-Image für Lambda bereitstellen, definiert Lambda automatisch einen Standard-Linux-Benutzer mit Berechtigungen mit geringsten Rechten. Dies unterscheidet sich vom Standardverhalten von Docker, bei dem standardmäßig der root-Benutzer verwendet wird, wenn keine USER-Anweisung bereitgestellt wird.

    Beispiel Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Maven layout COPY target/classes ${LAMBDA_TASK_ROOT} COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/ # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.myapp.App::handleRequest" ]
  4. Kompilieren Sie das Projekt und erfassen Sie die Laufzeitabhängigkeiten.

    mvn compile dependency:copy-dependencies -DincludeScope=runtime
  5. Erstellen Sie Ihr Docker-Image mit dem docker build-Befehl. Das folgende Beispiel benennt das Bild in docker-image und gibt ihm den test Tag. Um Ihr Image mit Lambda kompatibel zu machen, müssen Sie die Option --provenance=false verwenden.

    docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
    Anmerkung

    Der Befehl gibt die --platform linux/amd64-Option an, um sicherzustellen, dass Ihr Container mit der Lambda-Ausführungsumgebung kompatibel ist, unabhängig von der Architektur des Entwicklungsrechners. Wenn Sie beabsichtigen, eine Lambda-Funktion mithilfe der ARM64-Befehlssatzarchitektur zu erstellen, müssen Sie den Befehl unbedingt so ändern, dass stattdessen die --platform linux/arm64-Option verwendet wird.

Gradle
  1. Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.

    mkdir example cd example
  2. Führen Sie den folgenden Befehl aus, um Gradle ein neues Java-Anwendungsprojekt im Verzeichnis example der Umgebung generieren zu lassen. Wählen Sie für Select Build Script DSL die Option 2: Groovy aus.

    gradle init --type java-application
  3. Öffnen Sie das /example/app/src/main/java/example-Verzeichnis, und suchen Sie die App.java-Datei. Dies ist der Code für die Lambda-Funktion. Sie können den folgenden Beispielcode zum Testen verwenden oder ihn durch Ihren eigenen ersetzen.

    Beispiel App.java
    package com.example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class App implements RequestHandler<Object, String> { public String handleRequest(Object input, Context context) { return "Hello world!"; } }
  4. Öffnen Sie die build.gradle Datei. Wenn Sie den Beispiel-Funktionscode aus dem vorherigen Schritt verwenden, ersetzen Sie den Inhalt von build.gradle durch den folgenden. Wenn Sie Ihren eigenen Funktionscode verwenden, ändern Sie Ihre build.gradle-Datei nach Bedarf.

    Beispiel build.gradle (Groovy DSL)
    plugins { id 'java' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' } jar { manifest { attributes 'Main-Class': 'com.example.App' } }
  5. Der gradle init-Befehl aus Schritt 2 generierte auch einen Dummy-Testfall im app/test-Verzeichnis. Überspringen Sie in diesem Tutorial das Ausführen von Tests, indem Sie das /test-Verzeichnis löschen.

  6. Erstellen Sie das Projekt.

    gradle build
  7. Erstellen Sie im Stammverzeichnis (/example) des Projekts eine Docker-Datei mit der folgenden Konfiguration:

    Beachten Sie, dass das Dockerfile-Beispiel keine USER-Anweisung enthält. Wenn Sie ein Container-Image für Lambda bereitstellen, definiert Lambda automatisch einen Standard-Linux-Benutzer mit Berechtigungen mit geringsten Rechten. Dies unterscheidet sich vom Standardverhalten von Docker, bei dem standardmäßig der root-Benutzer verwendet wird, wenn keine USER-Anweisung bereitgestellt wird.

    Beispiel Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Gradle layout COPY app/build/classes/java/main ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.App::handleRequest" ]
  8. Erstellen Sie Ihr Docker-Image mit dem docker build-Befehl. Das folgende Beispiel benennt das Bild in docker-image und gibt ihm den test Tag. Um Ihr Image mit Lambda kompatibel zu machen, müssen Sie die Option --provenance=false verwenden.

    docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
    Anmerkung

    Der Befehl gibt die --platform linux/amd64-Option an, um sicherzustellen, dass Ihr Container mit der Lambda-Ausführungsumgebung kompatibel ist, unabhängig von der Architektur des Entwicklungsrechners. Wenn Sie beabsichtigen, eine Lambda-Funktion mithilfe der ARM64-Befehlssatzarchitektur zu erstellen, müssen Sie den Befehl unbedingt so ändern, dass stattdessen die --platform linux/arm64-Option verwendet wird.

  1. Starten Sie Ihr Docker-Image mit dem docker run-Befehl. In diesem Beispiel ist docker-image der Image-Name und test der Tag.

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    Dieser Befehl führt das Image als Container aus und erstellt einen lokalen Endpunkt bei localhost:9000/2015-03-31/functions/function/invocations.

    Anmerkung

    Wenn Sie das Docker-Image für die ARM64-Befehlssatz-Architektur erstellt haben, müssen Sie die Option --platform linux/arm64 statt --platform linux/amd64 verwenden.

  2. Veröffentlichen Sie in einem neuen Terminalfenster ein Ereignis an den lokalen Endpunkt.

    Linux/macOS

    Führen Sie unter Linux oder macOS den folgenden curl-Befehl aus:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Dieser Befehl ruft die Funktion mit einem leeren Ereignis auf und gibt eine Antwort zurück. Wenn Sie Ihren eigenen Funktionscode anstelle des Beispielfunktionscodes verwenden, wird empfohlen, die Funktion mit einer JSON-Nutzlast aufzurufen. Beispiel:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Führen Sie in PowerShell den folgenden Invoke-WebRequest Befehl aus:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Dieser Befehl ruft die Funktion mit einem leeren Ereignis auf und gibt eine Antwort zurück. Wenn Sie Ihren eigenen Funktionscode anstelle des Beispielfunktionscodes verwenden, wird empfohlen, die Funktion mit einer JSON-Nutzlast aufzurufen. Beispiel:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. Die Container-ID erhalten.

    docker ps
  4. Verwenden Sie den Befehl docker kill, um den Container zu anzuhalten. Ersetzen Sie in diesem Befehl 3766c4ab331c durch die Container-ID aus dem vorherigen Schritt.

    docker kill 3766c4ab331c
Um das Image in Amazon ECR hochzuladen und die Lambda-Funktion zu erstellen
  1. Führen Sie den Befehl get-login-password aus, um die Docker-CLI bei Ihrem Amazon-ECR-Registry zu authentifizieren.

    • Stellen Sie den --region Wert auf die AWS-Region Stelle ein, an der Sie das Amazon ECR-Repository erstellen möchten.

    • Ersetzen Sie 111122223333 durch Ihre AWS-Konto ID.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Erstellen Sie ein Repository in Amazon ECR mithilfe des Befehls create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    Anmerkung

    Das Amazon ECR-Repository muss mit der AWS-Region Lambda-Funktion identisch sein.

    Wenn erfolgreich, sehen Sie eine Antwort wie diese:

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Kopieren Sie das repositoryUri aus der Ausgabe im vorherigen Schritt.

  4. Führen Sie den Befehl docker tag aus, um Ihr lokales Image als neueste Version in Ihrem Amazon-ECR-Repository zu markieren. In diesem Befehl gilt Folgendes:

    • docker-image:test ist der Name und das Tag Ihres Docker-Images. Dies sind der Imagename und das Tag, die Sie im docker build-Befehl angegeben haben.

    • Ersetzen Sie <ECRrepositoryUri> durch den repositoryUri, den Sie kopiert haben. Stellen Sie sicher, dass Sie :latest am Ende der URI angeben.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Beispiel:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Führen Sie den Befehl docker push aus, um Ihr lokales Image im Amazon-ECR-Repository bereitzustellen. Stellen Sie sicher, dass Sie :latest am Ende der Repository-URI angeben.

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Erstellen Sie eine Ausführungsrolle für die Funktion, wenn Sie noch keine haben. Sie benötigen den Amazon-Ressourcennamen (ARN) der Rolle im nächsten Schritt.

  7. So erstellen Sie die Lambda-Funktion: Geben Sie für ImageUri die Repository-URI von zuvor an. Stellen Sie sicher, dass Sie :latest am Ende der URI angeben.

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    Anmerkung

    Sie können eine Funktion mithilfe eines Images in einem anderen AWS Konto erstellen, sofern sich das Bild in derselben Region wie die Lambda-Funktion befindet. Weitere Informationen finden Sie unter Kontoübergreifende Berechtigungen von Amazon ECR.

  8. Die Funktion aufrufen.

    aws lambda invoke --function-name hello-world response.json

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Um die Ausgabe der Funktion zu sehen, überprüfen Sie die response.json-Datei.

Um den Funktionscode zu aktualisieren, müssen Sie das Image erneut erstellen, das neue Image in das Amazon-ECR-Repository hochladen und dann den Befehl update-function-code verwenden, um das Image für die Lambda-Funktion bereitzustellen.

Lambda löst das Image-Tag in einen bestimmten Image-Digest auf. Das heißt, wenn Sie das Image-Tag, das zur Bereitstellung der Funktion verwendet wurde, auf ein neues Image in Amazon ECR verweisen, aktualisiert Lambda die Funktion nicht automatisch, um das neue Image zu verwenden.

Um das neue Image für dieselbe Lambda-Funktion bereitzustellen, müssen Sie den Befehl update-function-code verwenden, auch wenn das Image-Tag in Amazon ECR gleich bleibt. Im folgenden Beispiel erstellt die --publish-Option eine neue Version der Funktion unter Verwendung des aktualisierten Container-Images.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish

Verwenden eines alternativen Basis-Images mit dem Laufzeitschnittstellen-Client

Wenn Sie ein OS-only Basisimage oder ein alternatives Basis-Image verwenden, müssen Sie den Runtime Interface Client in Ihr Image aufnehmen. Der Laufzeitschnittstellen-Client erweitert die Laufzeit-API, die die Interaktion zwischen Lambda und Ihrem Funktionscode verwaltet.

Installieren Sie den Laufzeitschnittstellen-Client für Java in Ihrem Dockerfile oder als Abhängigkeit in Ihrem Projekt. Um beispielsweise den Laufzeitschnittstellen-Client mit dem Maven-Paketmanager zu installieren, fügen Sie Ihrer pom.xml-Datei Folgendes hinzu:

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency>

Einzelheiten zum Paket finden Sie unter AWS Lambda Java Runtime Interface Client im Maven-Central-Repository. Sie können auch den Quellcode des Runtime Interface Clients im AWS Lambda Java Support Libraries GitHub Repository überprüfen.

Das folgende Beispiel zeigt, wie Sie mithilfe eines Amazon-Corretto-Images ein Container-Image für Java erstellen. Amazon Corretto ist eine kostenlose, plattformübergreifende und produktionsbereite Distribution des Open Java Development Kit (OpenJDK). Das Maven-Projekt beinhaltet den Laufzeitschnittstellen-Client als Abhängigkeit.

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

  1. Erstellen Sie ein Maven-Projekt. Die folgenden Parameter sind erforderlich:

    • groupId – Der vollständige Paket-Namespace Ihrer Anwendung.

    • artifactId – Ihr Projektname. Dies wird der Name des Verzeichnisses für Ihr Projekt.

    Linux/macOS
    mvn -B archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DgroupId=example \ -DartifactId=myapp \ -DinteractiveMode=false
    PowerShell
    mvn -B archetype:generate ` -DarchetypeArtifactId=maven-archetype-quickstart ` -DgroupId=example ` -DartifactId=myapp ` -DinteractiveMode=false
  2. Öffnen Sie das Projektverzeichnis.

    cd myapp
  3. Öffnen Sie die Datei pom.xml und ersetzen Sie den Inhalt durch Folgendes. Diese Datei enthält aws-lambda-java-runtime-interface-client als Abhängigkeit. Alternativ können Sie den Laufzeitschnittstellen-Client im Dockerfile installieren. Der einfachste Ansatz besteht jedoch darin, die Bibliothek als Abhängigkeit einbinden.

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>hello-lambda</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>hello-lambda</name> <url>http://maven.apache.org</url> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
  4. Öffnen Sie das myapp/src/main/java/com/example/myapp-Verzeichnis, und suchen Sie die App.java-Datei. Dies ist der Code für die Lambda-Funktion. Ersetzen Sie den Code durch Folgendes:

    Beispiel Funktions-Handler
    package example; public class App { public static String sayHello() { return "Hello world!"; } }
  5. Der mvn -B archetype:generate-Befehl aus Schritt 1 generierte auch einen Dummy-Testfall im src/test-Verzeichnis. Überspringen Sie in diesem Tutorial das Ausführen von Tests, indem Sie das gesamte generierte Verzeichnis /test löschen.

  6. Navigieren Sie zurück zum Stammverzeichnis des Projekts und erstellen Sie dann ein neues Dockerfile. Das folgende Beispiel-Dockerfile verwendet ein Amazon-Corretto-Image. Amazon Corretto ist eine kostenlose, plattformübergreifende und produktionsbereite Distribution des OpenJDK.

    • Setzen Sie die FROM-Eigenschaft auf den URI des Basis-Images.

    • Legen Sie ENTRYPOINT auf das Modul fest, das der Docker-Container beim Start ausführen soll. In diesem Fall ist das Modul der Laufzeitschnittstellen-Client.

    • Legen Sie das CMD-Argument auf den Lambda-Funktionshandler fest.

    Beachten Sie, dass das Dockerfile-Beispiel keine USER-Anweisung enthält. Wenn Sie ein Container-Image für Lambda bereitstellen, definiert Lambda automatisch einen Standard-Linux-Benutzer mit Berechtigungen mit geringsten Rechten. Dies unterscheidet sich vom Standardverhalten von Docker, bei dem standardmäßig der root-Benutzer verwendet wird, wenn keine USER-Anweisung bereitgestellt wird.

    Beispiel Dockerfile
    FROM public.ecr.aws/amazoncorretto/amazoncorretto:21 as base # Configure the build environment FROM base as build RUN yum install -y maven WORKDIR /src # Cache and copy dependencies ADD pom.xml . RUN mvn dependency:go-offline dependency:copy-dependencies # Compile the function ADD . . RUN mvn package # Copy the function artifact and dependencies onto a clean base FROM base WORKDIR /function COPY --from=build /src/target/dependency/*.jar ./ COPY --from=build /src/target/*.jar ./ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] # Pass the name of the function handler as an argument to the runtime CMD [ "example.App::sayHello" ]
  7. Erstellen Sie Ihr Docker-Image mit dem docker build-Befehl. Das folgende Beispiel benennt das Bild in docker-image und gibt ihm den test Tag. Um Ihr Image mit Lambda kompatibel zu machen, müssen Sie die Option --provenance=false verwenden.

    docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
    Anmerkung

    Der Befehl gibt die --platform linux/amd64-Option an, um sicherzustellen, dass Ihr Container mit der Lambda-Ausführungsumgebung kompatibel ist, unabhängig von der Architektur des Entwicklungsrechners. Wenn Sie beabsichtigen, eine Lambda-Funktion mithilfe der ARM64-Befehlssatzarchitektur zu erstellen, müssen Sie den Befehl unbedingt so ändern, dass stattdessen die --platform linux/arm64-Option verwendet wird.

Verwenden Sie den Laufzeit-Schnittstellen-Emulator, um das Image lokal zu testen. Sie können den Emulator in Ihr Image integrieren oder ihn mit dem folgenden Verfahren auf Ihrem lokalen Computer installieren.

Installieren des Laufzeitschnittstellen-Emulators auf Ihrem lokalen Computer
  1. Führen Sie in Ihrem Projektverzeichnis den folgenden Befehl aus, um den Runtime-Interface-Emulator (x86-64-Architektur) von herunterzuladen GitHub und auf Ihrem lokalen Computer zu installieren.

    Linux/macOS
    mkdir -p ~/.aws-lambda-rie && \ curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \ chmod +x ~/.aws-lambda-rie/aws-lambda-rie

    Um den Arm64-Emulator zu installieren, ersetzen Sie die GitHub Repository-URL im vorherigen Befehl durch Folgendes:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    $dirPath = "$HOME\.aws-lambda-rie" if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory } $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie" Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

    Um den arm64-Emulator zu installieren, ersetzen Sie das $downloadLink durch Folgendes:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  2. Starten Sie Ihr Docker-Image mit dem docker run-Befehl. Beachten Sie Folgendes:

    • docker-image ist der Image-Name und test ist das Tag.

    • /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello ist der ENTRYPOINT gefolgt von dem CMD aus Ihrem Dockerfile.

    Linux/macOS
    docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie \ docker-image:test \ /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
    PowerShell
    docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` docker-image:test ` /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello

    Dieser Befehl führt das Image als Container aus und erstellt einen lokalen Endpunkt bei localhost:9000/2015-03-31/functions/function/invocations.

    Anmerkung

    Wenn Sie das Docker-Image für die ARM64-Befehlssatz-Architektur erstellt haben, müssen Sie die Option --platform linux/arm64 statt --platform linux/amd64 verwenden.

  3. Veröffentlichen Sie ein Ereignis auf dem lokalen Endpunkt.

    Linux/macOS

    Führen Sie unter Linux oder macOS den folgenden curl-Befehl aus:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Dieser Befehl ruft die Funktion mit einem leeren Ereignis auf und gibt eine Antwort zurück. Wenn Sie Ihren eigenen Funktionscode anstelle des Beispielfunktionscodes verwenden, wird empfohlen, die Funktion mit einer JSON-Nutzlast aufzurufen. Beispiel:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Führen Sie in PowerShell den folgenden Invoke-WebRequest Befehl aus:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Dieser Befehl ruft die Funktion mit einem leeren Ereignis auf und gibt eine Antwort zurück. Wenn Sie Ihren eigenen Funktionscode anstelle des Beispielfunktionscodes verwenden, wird empfohlen, die Funktion mit einer JSON-Nutzlast aufzurufen. Beispiel:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  4. Die Container-ID erhalten.

    docker ps
  5. Verwenden Sie den Befehl docker kill, um den Container zu anzuhalten. Ersetzen Sie in diesem Befehl 3766c4ab331c durch die Container-ID aus dem vorherigen Schritt.

    docker kill 3766c4ab331c
Um das Image in Amazon ECR hochzuladen und die Lambda-Funktion zu erstellen
  1. Führen Sie den Befehl get-login-password aus, um die Docker-CLI bei Ihrem Amazon-ECR-Registry zu authentifizieren.

    • Stellen Sie den --region Wert auf die AWS-Region Stelle ein, an der Sie das Amazon ECR-Repository erstellen möchten.

    • Ersetzen Sie 111122223333 durch Ihre AWS-Konto ID.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Erstellen Sie ein Repository in Amazon ECR mithilfe des Befehls create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    Anmerkung

    Das Amazon ECR-Repository muss mit der AWS-Region Lambda-Funktion identisch sein.

    Wenn erfolgreich, sehen Sie eine Antwort wie diese:

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Kopieren Sie das repositoryUri aus der Ausgabe im vorherigen Schritt.

  4. Führen Sie den Befehl docker tag aus, um Ihr lokales Image als neueste Version in Ihrem Amazon-ECR-Repository zu markieren. In diesem Befehl gilt Folgendes:

    • docker-image:test ist der Name und das Tag Ihres Docker-Images. Dies sind der Imagename und das Tag, die Sie im docker build-Befehl angegeben haben.

    • Ersetzen Sie <ECRrepositoryUri> durch den repositoryUri, den Sie kopiert haben. Stellen Sie sicher, dass Sie :latest am Ende der URI angeben.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Beispiel:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Führen Sie den Befehl docker push aus, um Ihr lokales Image im Amazon-ECR-Repository bereitzustellen. Stellen Sie sicher, dass Sie :latest am Ende der Repository-URI angeben.

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Erstellen Sie eine Ausführungsrolle für die Funktion, wenn Sie noch keine haben. Sie benötigen den Amazon-Ressourcennamen (ARN) der Rolle im nächsten Schritt.

  7. So erstellen Sie die Lambda-Funktion: Geben Sie für ImageUri die Repository-URI von zuvor an. Stellen Sie sicher, dass Sie :latest am Ende der URI angeben.

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    Anmerkung

    Sie können eine Funktion mithilfe eines Images in einem anderen AWS Konto erstellen, sofern sich das Bild in derselben Region wie die Lambda-Funktion befindet. Weitere Informationen finden Sie unter Kontoübergreifende Berechtigungen von Amazon ECR.

  8. Die Funktion aufrufen.

    aws lambda invoke --function-name hello-world response.json

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Um die Ausgabe der Funktion zu sehen, überprüfen Sie die response.json-Datei.

Um den Funktionscode zu aktualisieren, müssen Sie das Image erneut erstellen, das neue Image in das Amazon-ECR-Repository hochladen und dann den Befehl update-function-code verwenden, um das Image für die Lambda-Funktion bereitzustellen.

Lambda löst das Image-Tag in einen bestimmten Image-Digest auf. Das heißt, wenn Sie das Image-Tag, das zur Bereitstellung der Funktion verwendet wurde, auf ein neues Image in Amazon ECR verweisen, aktualisiert Lambda die Funktion nicht automatisch, um das neue Image zu verwenden.

Um das neue Image für dieselbe Lambda-Funktion bereitzustellen, müssen Sie den Befehl update-function-code verwenden, auch wenn das Image-Tag in Amazon ECR gleich bleibt. Im folgenden Beispiel erstellt die --publish-Option eine neue Version der Funktion unter Verwendung des aktualisierten Container-Images.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish