Premiers pas avec .NET avec les fonctions AWS Lambda

Les fonctions AWS Lambda sont un modèle informatique sans serveur qui vous permet d’exécuter du code sans serveurs. Ceux-ci sont généralement écrits avec des langages tels que JavaScript et Python, mais AWS prend désormais en charge de nombreux environnements d’exécution différents, notamment .NET pour C#.

Pourquoi utiliser .NET pour Lambda ?

Il existe maintenant de nombreuses langues différentes pour Lambda, vous avez donc beaucoup d’options. Généralement, JavaScript et Python sont utilisés pour une fonction d’automatisation simple qui se soucie des temps de démarrage rapides. Mais, ils ne sont pas les plus performants pour les traitements lourds, et le fait d’être des langages de script à typage dynamique est un inconvénient majeur pour les applications complexes.

Si C# est votre langage de prédilection, il n’y a pas beaucoup d’inconvénients à l’utiliser pour Lambda, surtout si le passage à Python ou JavaScript est trop compliqué. Les outils fournis par AWS sont également agréables et vous avez accès à l’intégralité du kit SDK AWS, ce qui signifie que vous pouvez facilement effectuer des recherches sur des services tels que Lambda et DynamoDB.

En outre, AWS prend en charge l’intégralité de l’environnement d’exécution .NET, ce qui signifie que vous pouvez utiliser d’autres langages que C# qui se compilent également en fichiers binaires .NET. C# est largement le plus populaire, mais vous pouvez également écrire des fonctions Lambda en F# ou VB.NET.

Comment fonctionne-t-il ?

Des langages comme Java et C# sont généralement beaucoup plus agréables, mais il y a un inconvénient à les utiliser. Ils sont tous deux compilés en bytecode qui doit être compilé au démarrage, ils ont donc des temps de démarrage plus longs, en particulier lors d’un démarrage à froid. Les « démarrages à froid » se produisent lorsqu’AWS n’a pas exécuté la fonction au cours des dernières minutes, il ne l’aura donc pas mise en cache et devra effectuer à nouveau la compilation juste-à-temps pour la rendre opérationnelle. Ce processus peut faire en sorte que vos fonctions mettent une seconde ou plus à répondre, ce qui n’est pas bon pour les applications Web.

Cependant, ce problème est largement atténué si vous utilisez Lambda très souvent. Vous pouvez également réduire entièrement les temps de démarrage à froid avec la simultanéité provisionnée. Les temps de réponse réguliers pour .NET sont très élevés et les performances sont comparables à celles des langages entièrement compilés tels que Go et Rust.

Si vous utilisez actuellement Java pour les fonctions Lambda, C# peut être un remplacement viable, car le runtime .NET 6 moderne utilise moins de mémoire et démarre plus rapidement que la JVM dans la plupart des cas.

Configuration des fonctions Lambda C#

Tout d’abord, vous aurez besoin d’installer .NET. AWS prend en charge .NET Core 3.1 et .NET 6, donc l’un ou l’autre de ces deux runtimes fonctionnera, mais surtout, vous aurez besoin du dotnet CLI installé afin que vous puissiez installer les modèles Lambda. Vous pouvez obtenir .NET à partir du portail de documentation de Microsoft.

Vous devrez installer les modèles Lambda et les outils Lambda globaux.

dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.Tools

Il y a beaucoup d’options que cela installe; vous pouvez tous les lister avec :

dotnet new --list

Cet outil est assez agréable, car il est livré avec de nombreux modèles préconfigurés préconfigurés pour différents cas d’utilisation. Vous souhaiterez généralement une fonction par projet pour limiter les tailles de construction, mais vous pouvez avoir plusieurs fonctions dans une DLL si vous utilisez les modèles sans serveur d’AWS, qui se déploient à l’aide des modèles CloudFormation. Celles-ci sont beaucoup plus compliquées à gérer, alors ne les utilisez que si vous en bénéficiez.

Cependant, avec les fichiers de solution .NET, vous pouvez avoir plusieurs projets côte à côte référençant des assemblages communs, ce n’est donc pas vraiment un problème.

Pour l’instant, nous allons utiliser le simple modèle Empty Function, qui génère un projet à l’aide de .NET 6. Vous pouvez le créer à partir de la ligne de commande ou à partir du nouvel écran de projet de votre éditeur.

dotnet new lambda.EmptyFunction --name SimpleLambdaFunction --profile default --region us-east-1

Cela génère une fonction très simple – elle prend une chaîne en entrée et reçoit également une ILambdaContext. C’est le Main() fonction de point d’entrée pour votre Lambda et sera appelée par le runtime chaque fois que la fonction Lambda est appelée. Cette fonction particulière renvoie un stringmais vous pouvez aussi le faire async et retourner un Task<string?>.

En haut, vous verrez un attribut d’assemblage configurant un sérialiseur JSON. En interne, Lambda gérera la désérialisation du contenu d’entrée pour vous, puis appellera votre fonction. Ensuite, s’il renvoie quelque chose, il sera écrit dans le flux de réponse. Les bibliothèques Lambda gèrent ce passe-partout pour vous, et le code qui encapsule votre fonction est dans HandlerWrapper.

Essentiellement, il gérera toutes sortes de signatures de méthode, et si votre fonction prend une entrée, elle désérialisera cette entrée pour vous. Si votre fonction renvoie une sortie, elle sérialisera cette sortie pour vous. En fait, vous n’avez rien à faire de tout cela, car vous pouvez écrire des fonctions qui fonctionnent sur raw Stream classes, mais c’est une belle classe wrapper pour faciliter les choses.

Cela signifie que vous êtes libre de définir vos propres modèles pour les entrées et les sorties transmises vers et depuis la fonction, l’un des avantages intéressants de la gestion de JSON avec C#.

Dans cette fonction, il désérialise le InputModel classe, attend de manière asynchrone pendant une seconde, puis renvoie un OutputModel classer. Cette classe est sérialisée dans le flux de sortie afin que Lambda puisse la gérer.

Exécution des fonctions Lambda

L’exécution de la fonction une fois que vous l’avez créée est assez simple, car la CLI Lambda .NET fournit une méthode pour la déployer. Exécutez simplement deploy-function avec

dotnet lambda deploy-function SimpleNETFunction

Vous devrez sélectionner un rôle IAM ou en créer un nouveau, et vous devrez peut-être ajouter des autorisations à ce nouveau rôle. Vous devriez maintenant voir la fonction dans votre console :

Lambda fournit un testeur intégré auquel vous pouvez transmettre JSON.

Cela s’exécutera et vous montrera tous les détails de l’exécution. Dans ce cas, avec une très petite fonction minimale, le temps de démarrage à froid était inférieur à 500 ms, ce qui est assez correct pour .NET et pour Lambda en général. Une fois tiède, la durée facturée descend à quelques millisecondes seulement.

Dans ce cas, cette fonction n’a pas du tout utilisé beaucoup de mémoire et la réduction de la fonction à 128 Mo n’a causé aucun problème.

Source-135