Serverless-Funktionen in C#: AWS Lambda Fortgeschrittenenstufe

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Serverless-Funktionen in C#: AWS Lambda — von den Grundlagen zur Fortgeschrittenenstufe

\n\n

Die Serverless-Architektur hat die moderne Entwicklung fest im Griff. Wenn Sie bereits die grundlegende Syntax zum Erstellen von AWS Lambda-Funktionen in C# beherrschen, ist es an der Zeit, zur nächsten Stufe überzugehen. In diesem Artikel behandeln wir fortgeschrittene Techniken: Abhängigkeitsinjektion (DI), Erstellung von Middleware, Arbeit mit Geheimnissen und asynchrone Muster. Dieses Wissen hilft Ihnen, flexibleren, testbareren und leistungsfähigeren Code für Cloud-Lösungen zu schreiben.

\n\n

1. Abhängigkeitsinjektion (DI) in AWS Lambda mit C#

\n\n

Die Standardvorlage einer Lambda-Funktion erstellt oft bei jedem Aufruf eine neue Instanz der Handler-Klasse. Dies führt zur wiederholten Erstellung "schwerer" Objekte (z. B. Datenbank-Clients oder HTTP-Clients). Die Verwendung eines Containers für die Abhängigkeitsinjektion (DI) löst dieses Problem, indem sie die Wiederverwendung von Instanzen und die Verwaltung ihrer Lebensdauer ermöglicht.

\n\n

Zur Implementierung von DI in .NET 8+ für Lambda wird das Paket Amazon.Lambda.AspNetCoreServer.Hosting verwendet. Betrachten wir ein Beispiel für die Konfiguration von DI mit IServiceCollection.

\n\n

Beispiel: DI-Konfiguration in Lambda

\n\n
using Amazon.Lambda.Core;\nusing Amazon.Lambda.RuntimeSupport;\nusing Amazon.Lambda.Serialization.SystemTextJson;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\n// Schnittstelle und Implementierung des Dienstes\npublic interface IWeatherService\n{\n    string GetForecast(string city);\n}\n\npublic class WeatherService : IWeatherService\n{\n    public string GetForecast(string city) => $"Wetter in {city}: +25°C, sonnig";\n}\n\n// Lambda-Handler\npublic class Function\n{\n    private readonly IWeatherService _weatherService;\n\n    public Function() : this(Startup.CreateHostBuilder().Build()) { }\n\n    public Function(IHost host)\n    {\n        _weatherService = host.Services.GetRequiredService<IWeatherService>();\n    }\n\n    public async Task<string> FunctionHandler(string input, ILambdaContext context)\n    {\n        return _weatherService.GetForecast(input);\n    }\n}\n\n// Konfigurationsklasse\npublic static class Startup\n{\n    public static IHostBuilder CreateHostBuilder() =>\n        Host.CreateDefaultBuilder()\n            .ConfigureServices((context, services) =>\n            {\n                services.AddSingleton<IWeatherService, WeatherService>();\n                // Fügen Sie hier weitere Dienste hinzu\n            });\n}
\n\n

Wichtig: Verwenden Sie AddSingleton für AWS SDK-Clients (S3, DynamoDB) und AddTransient für leichtgewichtige Dienste. Dies reduziert die Zeit des "Cold Starts" und spart Ressourcen.

\n\n

2. Middleware in AWS Lambda: Verarbeitungskette für Anfragen

\n\n

Das aus ASP.NET Core bekannte Konzept der Middleware lässt sich hervorragend auch auf Lambda-Funktionen anwenden. Middleware ermöglicht das Hinzufügen von übergreifender Logik: Protokollierung, Fehlerbehandlung, Authentifizierung, Antwortkomprimierung – ohne Änderung des eigentlichen Handler-Codes.

\n\n

Zur Implementierung von Middleware wird das Paket Amazon.Lambda.AspNetCoreServer und das Interface ILambdaMiddleware (oder eine benutzerdefinierte Implementierung) verwendet. Nachfolgend finden Sie ein Beispiel für die Erstellung einer einfachen Middleware zur Protokollierung der Ausführungszeit.

\n\n

Beispiel: Middleware für die Protokollierung

\n\n
using Amazon.Lambda.Core;\nusing System.Diagnostics;\n\npublic class LoggingMiddleware : ILambdaMiddleware\n{\n    public async Task<TResponse> InvokeAsync<TRequest, TResponse>(TRequest request, \n        Func<TRequest, Task<TResponse>> next, ILambdaContext context)\n    {\n        var sw = Stopwatch.StartNew();\n        context.Logger.LogInformation($"Anfrage empfangen: {request}");\n\n        try\n        {\n            var response = await next(request);\n            sw.Stop();\n            context.Logger.LogInformation($"Antwort gesendet in {sw.ElapsedMillis                

Blogs

Buchempfehlungen