Bereitstellen. NETLambda-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. NETLambda-Funktionen mit Container-Images

Es gibt drei Möglichkeiten, ein Container-Image für a zu erstellen. NETLambda-Funktion:

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 Basisbilder für. NET

AWS bietet die folgenden Basis-Images für. NET:

Tags Laufzeit Betriebssystem Dockerfile Ablehnung

8

. NET8 Amazon Linux 2023 Dockerfile für. NET8 auf GitHub

Nicht geplant

6

. NET6 Amazon Linux 2 Dockerfile für. NET6 auf GitHub

20. Dezember 2024

ECRAmazon-Repository: gallery.ecr.aws/lambda/dotnet

Verwenden AWS eines Basis-Images für. NET

Voraussetzungen

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

  • . NETSDK— Die folgenden Schritte verwenden die. NET8 Basisbild. Stellen Sie sicher, dass Ihr. NETVersion entspricht der Version des Basis-Images, das Sie in Ihrem Dockerfile angeben.

  • Docker

Erstellen und Bereitstellen eines Images mithilfe eines Basis-Images

In den folgenden Schritten verwenden Sie Amazon.Lambda.Templates und Amazon.Lambda.Tools, um eine zu erstellen. NETProjekt. Anschließend erstellen Sie ein Docker-Image, laden das Image auf Amazon ECR hoch und stellen es für eine Lambda-Funktion bereit.

  1. Installieren Sie das NuGet Amazon.Lambda.Templates-Paket.

    dotnet new install Amazon.Lambda.Templates
  2. Erstellen Sie ein. NETProjekt mit der lambda.image.EmptyFunction Vorlage.

    dotnet new lambda.image.EmptyFunction --name MyFunction --region us-east-1
  3. Navigieren Sie zum MyFunction/src/MyFunction Verzeichnis . Hier werden die Projektdateien gespeichert. Prüfen Sie die folgenden Dateien:

    • aws-lambda-tools-defaults.json — In dieser Datei geben Sie die Befehlszeilenoptionen an, wenn Sie Ihre Lambda-Funktion bereitstellen.

    • Function.cs – Der Funktionscode Ihres Lambda-Handlers. Dies ist eine C#-Vorlage mit der Amazon.Lambda.Core-Standardbibliothek und einem LambdaSerializer-Standardattribut. Weitere Informationen über Serialisierungsanforderungen und -optionen finden Sie unter Serialisieren von Lambda-Funktionen. Sie können den bereitgestellten Code zum Testen verwenden oder ihn durch Ihren eigenen ersetzen.

    • MyFunction.csproj — A. NETProjektdatei, in der die Dateien und Assemblys aufgeführt sind, aus denen Ihre Anwendung besteht.

    • Readme.md – Diese Datei enthält weitere Informationen zur Lambda-Beispielfunktion.

  4. Untersuchen Sie die Docker-Datei im src/MyFunction-Verzeichnis. Sie können die bereitgestellte Docker-Datei zum Testen verwenden oder sie durch Ihre eigene ersetzen. Wenn Sie Ihre eigenen verwenden, stellen Sie sicher, dass Sie:

    • Stellen Sie die FROM Eigenschaft auf die URIdes Basisimages ein. Ihr. NETVersion muss mit der Version des Basis-Images übereinstimmen.

    • Legen Sie das CMD-Argument auf den Lambda-Funktionshandler fest. Das sollte mit dem image-command in aws-lambda-tools-defaults.json übereinstimmen.

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

    Beispiel Dockerfile
    # You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM public.ecr.aws/lambda/dotnet:8 # Copy function code to Lambda-defined environment variable COPY publish/* ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "MyFunction::MyFunction.Function::FunctionHandler" ]
  5. Installieren Sie die Amazon.Lambda.Tools. NETGlobales Tool.

    dotnet tool install -g Amazon.Lambda.Tools

    Wenn Amazon.Lambda.Tools bereits installiert ist, vergewissern Sie sich, dass Sie über die neueste Version verfügen.

    dotnet tool update -g Amazon.Lambda.Tools
  6. Ändern Sie das Verzeichnis zu MyFunction/src/MyFunction, sofern Sie dies noch nicht getan haben.

    cd src/MyFunction
  7. Verwenden Sie Amazon.Lambda.Tools, um das Docker-Image zu erstellen, es in ein neues ECR Amazon-Repository zu übertragen und die Lambda-Funktion bereitzustellen.

    Geben Sie für --function-role den Rollennamen — nicht den Amazon-Ressourcennamen (ARN) — der Ausführungsrolle für die Funktion an. Beispiel, lambda-role.

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Weitere Informationen zu den Amazon.Lambda.Tools. NETGlobales Tool finden Sie in den Erweiterungen für.AWS NETCLIRepository aktiviert GitHub.

  8. Die Funktion aufrufen.

    dotnet lambda invoke-function MyFunction --payload "Testing the function"

    Wenn alles erfolgreich ist, sehen Sie Folgendes:

    Payload: "TESTING THE FUNCTION" Log Tail: START RequestId: id Version: $LATEST END RequestId: id REPORT RequestId: id Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB
  9. Löschen Sie die Lambda-Funktion.

    dotnet lambda delete-function MyFunction

Verwenden eines alternativen Basis-Images mit dem Laufzeitschnittstellen-Client

Wenn Sie ein OS-Basis-Image oder ein alternatives Basis-Image verwenden, müssen Sie den Laufzeitschnittstellen-Client in das Image einbinden. Der Laufzeitschnittstellen-Client erweitert die Verwendung der Lambda-Laufzeit API für benutzerdefinierte Laufzeiten, die die Interaktion zwischen Lambda und Ihrem Funktionscode verwaltet.

Das folgende Beispiel zeigt, wie Sie ein Container-Image für erstellen. NETVerwendung eines AWS Nicht-Base-Images und Hinzufügen von Amazon.Lambda. RuntimeSupport Paket, für das der Lambda-Runtime-Interface-Client ist. NET. Das Beispiel Dockerfile verwendet Microsoft. NET8-Basisbild.

Voraussetzungen

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

  • . NETSDK— Die folgenden Schritte verwenden a. NET8 Basisbild. Stellen Sie sicher, dass Ihr. NETVersion entspricht der Version des Basis-Images, das Sie in Ihrem Dockerfile angeben.

  • Docker

Erstellen und Bereitstellen eines Images mithilfe eines alternativen Basis-Images

  1. Installieren Sie das NuGet Amazon.Lambda.Templates-Paket.

    dotnet new install Amazon.Lambda.Templates
  2. Erstellen Sie ein. NETProjekt mit der lambda.CustomRuntimeFunction Vorlage. Diese Vorlage enthält Amazon.Lambda. RuntimeSupportPaket.

    dotnet new lambda.CustomRuntimeFunction --name MyFunction --region us-east-1
  3. Navigieren Sie zum MyFunction/src/MyFunction Verzeichnis . Hier werden die Projektdateien gespeichert. Prüfen Sie die folgenden Dateien:

    • aws-lambda-tools-defaults.json — In dieser Datei geben Sie die Befehlszeilenoptionen an, wenn Sie Ihre Lambda-Funktion bereitstellen.

    • Function.cs – Der Code enthält eine Klasse mit einer Main-Methode, die die Bibliothek Amazon.Lambda.RuntimeSupport als Bootstrap initialisiert. Die Main-Methode ist der Einstiegspunkt für den Prozess der Funktion. Die Main-Methode verpackt den Funktionshandler in einen Wrapper, mit dem der Bootstrap arbeiten kann. Weitere Informationen finden Sie unter Amazon.Lambda verwenden. RuntimeSupport als Klassenbibliothek im Repository. GitHub

    • MyFunction.csproj — A. NETProjektdatei, in der die Dateien und Assemblys aufgeführt sind, aus denen Ihre Anwendung besteht.

    • Readme.md – Diese Datei enthält weitere Informationen zur Lambda-Beispielfunktion.

  4. Öffnen Sie die Datei aws-lambda-tools-defaults.json und fügen Sie die folgenden Zeilen hinzu:

    "package-type": "image", "docker-host-build-output-dir": "./bin/Release/lambda-publish"
    • package-type: Definiert das Bereitstellungspaket als Container-Image.

    • docker-host-build-output-dir: Legt das Ausgabeverzeichnis für den Build-Prozess fest.

    Beispiel aws-lambda-tools-defaults.json
    { "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "profile": "", "region": "us-east-1", "configuration": "Release", "function-runtime": "provided.al2023", "function-memory-size": 256, "function-timeout": 30, "function-handler": "bootstrap", "msbuild-parameters": "--self-contained true", "package-type": "image", "docker-host-build-output-dir": "./bin/Release/lambda-publish" }
  5. Erstellen Sie ein Dockerfile in Verzeichnis MyFunction/src/MyFunction. Das folgende Beispiel für Dockerfile verwendet ein Microsoft. NETBasis-Image anstelle eines AWS Basis-Images.

    • Legen Sie FROM-Eigenschaft auf die Kennung des Basis-Images fest. Ihr. NETVersion muss mit der Version des Basis-Images übereinstimmen.

    • Verwenden Sie den COPY-Befehl, um die Funktion in das Verzeichnis /var/task zu kopieren.

    • Legen Sie ENTRYPOINT auf das Modul fest, das der Docker-Container beim Start ausführen soll. In diesem Fall ist das Modul der Bootstrap, der die Bibliothek Amazon.Lambda.RuntimeSupport initialisiert.

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

    Beispiel Dockerfile
    # You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM mcr.microsoft.com/dotnet/runtime:8.0 # Set the image's internal work directory WORKDIR /var/task # Copy function code to Lambda-defined environment variable COPY "bin/Release/net8.0/linux-x64" . # Set the entrypoint to the bootstrap ENTRYPOINT ["/usr/bin/dotnet", "exec", "/var/task/bootstrap.dll"]
  6. Installieren Sie die Amazon.Lambda.Tools. NETErweiterung Global Tools.

    dotnet tool install -g Amazon.Lambda.Tools

    Wenn Amazon.Lambda.Tools bereits installiert ist, vergewissern Sie sich, dass Sie über die neueste Version verfügen.

    dotnet tool update -g Amazon.Lambda.Tools
  7. Verwenden Sie Amazon.Lambda.Tools, um das Docker-Image zu erstellen, es in ein neues ECR Amazon-Repository zu übertragen und die Lambda-Funktion bereitzustellen.

    Geben Sie für --function-role den Rollennamen — nicht den Amazon-Ressourcennamen (ARN) — der Ausführungsrolle für die Funktion an. Beispiel, lambda-role.

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Weitere Informationen zu den Amazon.Lambda.Tools. NETCLIErweiterung finden Sie unter Erweiterungen für.AWS NETCLIRepository aktiviert GitHub.

  8. Die Funktion aufrufen.

    dotnet lambda invoke-function MyFunction --payload "Testing the function"

    Wenn alles erfolgreich ist, sehen Sie Folgendes:

    Payload: "TESTING THE FUNCTION" Log Tail: START RequestId: id Version: $LATEST END RequestId: id REPORT RequestId: id Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB
  9. Löschen Sie die Lambda-Funktion.

    dotnet lambda delete-function MyFunction