AWS Germany – Amazon Web Services in Deutschland

Baue, Paketiere und Veröffentliche .NET Lambda Funktionen mit dem AWS CDK

von Ulili Nhaga, übersetzt von Ralph Waldenmaier

Das AWS Cloud Development Kit (CDK) ist ein Open-Source Entwicklungs Framework für die Definition von Cloud-Infrastruktur als Code und deren Bereitstellung über AWS CloudFormation. Es bietet eine hochgradige Abstraktion zur Definition von AWS-Ressourcen mit modernen Programmiersprachen wie C#. Zu seinen Komponenten gehört das High-Level Konstrukt aws-s3-assets, welches die Erstellung von AWS Lambda-Funktionen abstrahiert. Das Standardverhalten dieses Konstrukts besteht darin, den gesamten Inhalt in einen Ordner zu packen und ihn in einen Amazon Simple Storage Service (Amazon S3)-Bucket hochzuladen. Das funktioniert gut für Lambda-Laufzeiten wie Python oder Node.js welche keine Codekompilierung erfordern. Für .NET, Java oder Go, die eine Codekompilierung erfordern, sind zusätzliche Schritte erforderlich, sei es um externe Abhängigkeiten wiederherzustellen, den Code zu kompilieren oder die erstellte Binärdatei zu veröffentlichen. In diesem Beitrag erfahren Sie, wie Sie das Erstellen, Verpacken und Veröffentlichen von .NET-Lambda-Funktionen mit dem AWS CDK beschleunigen können.

Überblick über die Architektur

In diesem Blogbeitrag zeigen wir Ihnen, wie Sie eine einfache serverlose Architektur mit dem AWS CDK erstellen können. Hierfür wird eine REST-API mittels Amazon API Gateway, Lambda-Proxy-Integration und ASP.NET Web API auf Lambda erstellt. ASP.NET Web API ist ein Framework zum Erstellen von Web-APIs auf der Grundlage von .NET, welche Sie mit Lambda-Funktionen ausführen können. Bei dieser AWS CDK-Implementierung werden drei Lambda-Funktionen mit diesem Architekturansatz erstellt. Alle in Funktionen in .NET geschrieben und als separate ASP.NET Web API-Projekte verwaltet. Das API-Gateway leitet den Datenverkehr je nach aufgerufenem URL-Pfad an die jeweilige Lambda-Funktion zur Verarbeitung weiter.

Das AWS Architekturdiagramm zeigt wie Endgeräte durch ein Amazon API Gateway auf die verschiedenen AWS Lambda zugreifen können. Hier sind drei Lambda Funktionen welche über die Pfade /, /functiontwo und /funcitonthree erreicht werden können. Die Komponenten werden mittels des AWS CDK ausgespielt was durch eine gestrichelte Box angedeutet ist.

Bild 1: Architektur High-Level Übersicht

Implementierung

Voraussetzungen

Damit die AWS CDK-Anwendung .NET Lambda-Funktionen kompilieren und bereitstellen kann, müssen Sie zunächst ein Objekt der BundlingOptions-Klasse erstellen. Der Lambda-Konstruktor verwendet dieses zum Kompilieren und Generieren von Binärdateien aus dem Quellcode der .NET-Lambda-Funktionen. Die geschieht während der Synthetisierungszeit des AWS CDK-Projekts.

Das folgende Beispiel zeigt, wie Sie die BundlingOptions-Klasse für .NET Lambda-Funktionen anwenden können.
Diese relevanten Eigenschaften müssen Sie dazu festlegen:

  • Image – sollte ein AWS-Container-Image erhalten, das der Lambda-Laufzeit entspricht
  • User – wird auf „root“ gesetzt, damit die Runtime die Erlaubnis erhält, die binäre Ausgabedatei zu erstellen und zu generieren
  • OutputType – definiert, wie das CDK das Paket erstellen soll. Für diese Demo ist es auf ZIP-Archiv eingestellt
  • Command – erwartet die Bau- und Paketanweisungen. Im folgenden Codeschnipsel-Beispiel können Sie sehen, wie ich das Dienstprogramm Amazon.Lambda.Tools – zur Unterstützung von .NET-Befehlen für die Paketierung von Lambda-Funktionen – verwendet habe
var buildOption = new BundlingOptions()
{
    Image = Runtime.DOTNET_6.BundlingImage,
    User = "root",
    OutputType = BundlingOutput.ARCHIVED,
    Command = new string[]{
   "/bin/sh",
    "-c",
    " dotnet tool install -g Amazon.Lambda.Tools"+
    " && dotnet build"+
    " && dotnet lambda package --output-package /asset-output/function.zip"
    }
};

Mit dieser BundlingOption-Objektdefinition wird das AWS CDK den Prozess der Bereitstellung eines .NET Lambda-Funktionsprojekts handhaben. Der folgende Beispielcode zeigt, wie diese BundlingOption-Objektdefinition an das AWS CDK-Funktionskonstrukt übergeben wird:

var lambdaFunctionOne = new Function(this, "my-funcOne", new FunctionProps
{
    ...
    Code = Code.FromAsset("../apps/src/FunctionOne/", new Amazon.CDK.AWS.S3.Assets.AssetOptions
    {
        Bundling = buildOption
    }),
});

Bereitstellung und Demo

Das GitHub-Repository „aws-samples/aws-cdk-build-package-publish-dotnet-lambda-function“ enthält den vollständigen Demo code. Mit diesem können Sie das Projekt selbst erstellen und die Beispiel APIs testen. Im folgenden werden die nötigen Schritte dazu aufgelistet.

Bereitstellung

Führen Sie die folgenden Schritte aus, um die .NET-Lambda-Funktionen auszurollen und zu testen:

Öffnen sie ein Terminalfenster und navigieren Sie in den gewünschten Arbeitsordner
1. Klonen des GitHub-Repositorys

git clone https://github.com/aws-samples/aws-cdk-build-package-publish-dotnet-lambda-function.git

2. Navigieren Sie zum Ordner infra im Quellcode des Projekts

cd aws-cdk-build-package-publish-dotnet-lambda-function/infra

3. Geben Sie im Infra-Ordner CDK Deploy mit Ihrem AWS-Kontoprofil ein

cdk deploy --profile <Ihr AWS Kontoprofilname>

Demo

Sobald das Projekt ausgerollt ist, kopieren Sie den Endpunkt aus der Terminalausgabe. Das Format sollte ähnlich sein wie: https://xxxyyyzzz.execute-api.eu-central-1.amazonaws.com/prod/. Verwenden Sie diesen Endpunkt in Ihrem bevorzugten REST-API-Client, um eine Testanfrage zu stellen. In dieser Demo wird Thunder Client verwendet. Sie können die URL auch in die Adresszeile eines Browsers einfügen und die Nachrichten auf diese Weise empfangen. Das folgende Beispiel zeigt eine Anfrage und eine Antwort:

Ein Ausschnitt des Programms ThunderClient. Es zeigt auf der linken Seite den abgesetzen GET Request der auf die URL mit dem Pfad / geht. Auf der rechten Seite sieht man die Antwort der AWS Lambda Funktion mit dem Text "Welcome to running ASP.NET Core Minimal API on AWS Lambda - Function One!"

Bild 2: Endpoint Test

Oder Sie können CURL, bspw. in einem Windows Terminal, für die Anfrage verwenden, wie im folgenden Beispiel gezeigt:

Request: curl https://xxxyyyzzz.execute-api.eu-central-1.amazonaws.com/prod/
Response: Welcome to running ASP.NET Core Minimal API on AWS Lambda - Function One!

Um eine andere Lambda-Funktion zu testen, ändern Sie die URL, indem Sie /functiontwo oder /functionthree an das Ende der ursprünglichen URL anhängen. Verwenden Sie zum Beispiel https://xxxyyyzzz.execute-api.eu-central-1.amazonaws.com/prod/functiontwo. Das API-Gateway wird die Anfrage and die richtige Lamdba Funktion weiterleiten.

Ein Ausschnitt des Programms ThunderClient. Es zeigt auf der linken Seite den abgesetzen GET Request der auf die URL mit dem Pfad /functiontwo geht. Auf der rechten Seite sieht man die Antwort der AWS Lambda Funktion mit dem Text "Welcome to running ASP.NET Core Minimal API on AWS Lambda - Function Two!"

Bild 3: Endpoint Test 2

Oder Sie können CURL für die Anfrage verwenden, wie im folgenden Beispiel gezeigt:

Request: curl https://xxxyyyzzz.execute-api.eu-central-1.amazonaws.com/prod/functiontwo
Response: Welcome to running ASP.NET Core Minimal API on AWS Lambda - Function Two!

Aufräumarbeiten

Wählen Sie eine der beiden Möglichkeiten, um die AWS Umgebung zu bereinigen:

1. Gehen Sie zur AWS Management Console und navigieren Sie zum Abschnitt CloudFormation Stacks und löschen Sie den Stack: InfraStack

2. Geben Sie in der Befehlszeile CDK destroy aus demselben Verzeichnis ein, aus dem Sie die Bereitstellung vorgenommen haben.

cd aws-cdk-build-package-publish-dotnet-lambda-function/infra
cdk destroy --profile <Ihr AWS Kontoprofilname>

Fazit

In diesem Blogbeitrag haben Sie erfahren, wie Sie die Erstellung, Verpackung und Veröffentlichung von .NET-Lambda-Funktionen mit AWS CDK optimieren können. Sie können ähnliche Schritte auch auf andere Lambda-Laufzeitumgebungen anwenden, die eine Kompilierung des Codes erfordern, wie Java oder Go. Dieser Ansatz vereinfacht den Prozess, indem er die Kompilierung des Codes der .NET-Lambda-Funktion und die Bereitstellung der Infrastruktur übernimmt. So können Sie die Lambda-Funktion ohne zusätzliche Schritte für die Kompilierung außerhalb des AWS CDK-Bereitstellungsprozesses erstellen und dann bereitstellen.

AWS kann Ihnen dabei helfen, zu beurteilen, wie Ihr Unternehmen das Beste aus der Cloud herausholen kann. Schließen Sie sich den Millionen von AWS-Kunden an, die uns bei der Migration und Modernisierung ihrer wichtigsten Anwendungen in der Cloud vertrauen. Um mehr über die Modernisierung von Windows Server oder SQL Server zu erfahren, besuchen Sie Windows auf AWS. Kontaktieren Sie uns, um Ihre Modernisierungsreise noch heute zu beginnen.