Lambda-Container-Images lokal testen - 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.

Lambda-Container-Images lokal testen

Sie können den Emulator der Lambda-Laufzeitschnittstelle verwenden, um die Funktion eines Container-Images lokal zu testen, bevor Sie es in Amazon Elastic Container Registry (Amazon ECR) hochladen und für Lambda bereitstellen. Der Emulator ist ein Proxy für die Lambda-Laufzeiten-API. Es handelt sich um einen leichtgewichtigen Webserver, der HTTP-Anforderungen in JSON-Ereignisse umwandelt, die an die Lambda-Funktion im Container-Image übergeben werden.

Die AWS-Basis-Images und die reinen OS-Basis-Images enthalten den Laufzeitschnittstellen-Emulator. Wenn Sie ein alternatives Basis-Image verwenden (beispielsweise ein Alpine Linux-Image oder ein Debian-Image), können Sie den Emulator in Ihr Image integrieren oder ihn auf Ihrem lokalen Computer installieren.

Der Laufzeitschnittstellen-Emulator ist im AWS GitHub Repository verfügbar. Es gibt separate Pakete für die x86-64-Architektur und arm64-Architektur.

Richtlinien für die Verwendung des Laufzeitschnittstellen-Emulators

Beachten Sie bei der Verwendung des Laufzeitschnittstellen-Emulators die folgenden Richtlinien:

  • Der Runtime Interface Emulator (Laufzeitschnittstellen-Emulator, RIE) emuliert weder die Sicherheits- und Authentifizierungskonfigurationen von Lambda noch die Lambda-Orchestrierung.

  • Lambda bietet einen Emulator für jede der Befehlssatz-Architekturen.

  • Der Emulator unterstützt kein AWS X-Ray-Tracing oder andere Lambda-Integrationen.

Umgebungsvariablen

Der Runtime Interface Emulator unterstützt eine Teilmenge von Umgebungsvariablen für die Lambda-Funktion im lokal ausgeführten Image.

Wenn Ihre Funktion Sicherheitsnachweise verwendet, können Sie die Anmeldeinformationen konfigurieren, indem Sie die folgenden Umgebungsvariablen festlegen:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_DEFAULT_REGION

Um das Funktions-Timeout einzustellen, konfigurieren Sie AWS_LAMBDA_FUNCTION_TIMEOUT. Geben Sie die maximale Anzahl von Sekunden ein, die die Funktion ausgeführt werden darf.

Der Emulator füllt die folgenden Lambda-Umgebungsvariablen nicht aus. Sie können sie jedoch so einstellen, dass sie mit den Werten übereinstimmen, die Sie erwarten, wenn die Funktion im Lambda-Service ausgeführt wird:

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

Testen von Images, die aus AWS-Basis-Images erstellt wurden

Die AWS-Basis-Images für Lambda enthalten den Laufzeitschnittstellen-Emulator. Nachdem Sie Ihr Docker-Image erstellt haben, gehen Sie wie folgt vor, um es lokal zu testen.

  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 PowerShellin 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

Testen von Images, die auf der Grundlage alternativer Basis-Images erstellt wurden

Wenn Sie ein alternatives Basis-Image verwenden (beispielsweise ein Alpine Linux-Image oder ein Debian-Image), können Sie den Emulator in Ihr Image integrieren oder ihn auf Ihrem lokalen Computer installieren.

Integrieren des Laufzeitschnittstellen-Emulators in ein Image

So integrieren Sie den Emulator in Ihr Image
  1. Erstellen Sie ein Skript und speichern Sie es in Ihrem Projektverzeichnis. Legen Sie Ausführungsberechtigungen für die Skriptdatei fest.

    Das Skript prüft das Vorhandensein der AWS_LAMBDA_RUNTIME_API Umgebungsvariablen, was auf das Vorhandensein der Laufzeit-API hinweist. Wenn die Laufzeit-API vorhanden ist, führt das Skript den Runtime Interface Client aus. Andernfalls führt das Skript den Runtime Interface Emulator aus.

    Wählen Sie Ihre Sprache, um ein Beispielskript zu sehen:

    Node.js

    Im folgenden Beispiel ist /usr/local/bin/npx aws-lambda-ric der npx-Befehl zum Starten des Laufzeitschnittstellen-Clients von Node.js.

    Beispiel entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/npx aws-lambda-ric $@ else exec /usr/local/bin/npx aws-lambda-ric $@ fi
    Anmerkung

    Wenn Sie Windows verwenden, achten Sie darauf, das Skript mit LF-Zeilenenden zu speichern. Wenn das Skript CRLF verwendet, erhalten Sie eine Fehlermeldung wie die folgende, wenn Sie versuchen, das Docker-Image auszuführen:

    exec /entry_script.sh: no such file or directory
    Python

    Im folgenden Beispiel ist /usr/local/bin/python -m awslambdaric der Python-Interpreter-Befehl, um den Laufzeitschnittstellen-Client von Python als Skript auszuführen.

    Beispiel entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $@ else exec /usr/local/bin/python -m awslambdaric $@ fi
    Anmerkung

    Wenn Sie Windows verwenden, achten Sie darauf, das Skript mit LF-Zeilenenden zu speichern. Wenn das Skript CRLF verwendet, erhalten Sie eine Fehlermeldung wie die folgende, wenn Sie versuchen, das Docker-Image auszuführen:

    exec /entry_script.sh: no such file or directory
    Java

    Im folgenden Beispiel legt /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda den Klassenpfad zum Laufzeitschnittstellen-Client von Java fest.

    Beispiel entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ else exec /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ fi
    Anmerkung

    Wenn Sie Windows verwenden, achten Sie darauf, das Skript mit LF-Zeilenenden zu speichern. Wenn das Skript CRLF verwendet, erhalten Sie eine Fehlermeldung wie die folgende, wenn Sie versuchen, das Docker-Image auszuführen:

    exec /entry_script.sh: no such file or directory
    Go

    Im folgenden Beispiel ist /main die Binärdatei, die während des Docker-Builds kompiliert wird.

    Beispiel entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /main $@ else exec /main $@ fi
    Anmerkung

    Wenn Sie Windows verwenden, achten Sie darauf, das Skript mit LF-Zeilenenden zu speichern. Wenn das Skript CRLF verwendet, erhalten Sie eine Fehlermeldung wie die folgende, wenn Sie versuchen, das Docker-Image auszuführen:

    exec /entry_script.sh: no such file or directory
    Ruby

    Im folgenden Beispiel ist aws_lambda_ric der Laufzeitschnittstellen-Client von Ruby.

    Beispiel entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie aws_lambda_ric $@ else exec aws_lambda_ric $@ fi
    Anmerkung

    Wenn Sie Windows verwenden, achten Sie darauf, das Skript mit LF-Zeilenenden zu speichern. Wenn das Skript CRLF verwendet, erhalten Sie eine Fehlermeldung wie die folgende, wenn Sie versuchen, das Docker-Image auszuführen:

    exec /entry_script.sh: no such file or directory
  2. Laden Sie den Laufzeitschnittstellen-Emulator für Ihre Zielarchitektur von GitHub in Ihr Projektverzeichnis herunter. Lambda bietet einen Emulator für jede der Befehlssatz-Architekturen.

    Linux/macOS
    curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x 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
    Invoke-WebRequest -Uri https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie -OutFile aws-lambda-rie

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

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  3. Fügen Sie die folgenden Zeilen in Ihr Dockerfile ein. Das ENTRYPOINT beinhaltet das in Schritt 1 erstellte Skript und Ihren Funktionshandler.

    Beispiel Zeilen zum Hinzufügen in Dockerfile

    Im folgenden Beispiel ersetzen Sie lambda_function.handler durch Ihren Funktionshandler.

    COPY ./entry_script.sh /entry_script.sh RUN chmod +x /entry_script.sh ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh","lambda_function.handler" ]
  4. 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.

    docker build --platform linux/amd64 -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.

  5. 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.

  6. 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 PowerShellin 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"
  7. Die Container-ID erhalten.

    docker ps
  8. 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

Lokales Installieren des Laufzeit-Schnittstellen-Emulators

Um den Laufzeitschnittstellen-Emulator auf Ihrem lokalen Computer zu installieren, laden Sie das Paket für Ihre bevorzugte Architektur von herunter GitHub. Verwenden Sie dann den docker run-Befehl, um das Container-Image zu starten, und legen Sie --entrypoint auf den Emulator fest. Für weitere Informationen wählen Sie die Anweisungen für Ihre bevorzugte Sprache aus: