Module 6 : Atelier pratique : création et déploiement de fonctions Lambda
ATELIER PRATIQUE
Objectifs de l'atelier
Dans ces ateliers, vous mettrez en pratique ce que vous avez appris dans ce cours
Vous allez créer diverses fonctions Lambda .NET 6/7, les déployer et les invoquer.
Ce module comprend 3 ateliers :
Atelier 1 : Application Web .NET 6 exécutée sur Arm64
Atelier 2 : Invocation d'une fonction Lambda à partir d'un programme C# sur votre ordinateur
Atelier 3 : Invocation d'une fonction Lambda à partir d'une autre
Conditions préalables
Vous disposez d'un compte AWS.
Vous avez un utilisateur AWS auquel est jointe la politique AdministratorAccess. Consultez la section « Remarque sur les autorisations » du module 3 pour plus de détails. /p>
Vous avez installé le .NET 6 SDK.
Vous avez installé les extensions AWS pour .NET CLI (dotnet lambda...).
Vous avez installé les modèles AWS Lambda pour .NET Core.
Vous avez installé PowerShell. Si vous devez l'installer pour Window/Mac/Linux, consultez https://github.com/PowerShell/PowerShell.
Vous trouverez plus d'informations sur les outils ci-dessus dans le module 2.
Vous disposez d'un compartiment S3 pour les CloudFormation stacks. Si ce n'est pas le cas, suivez les instructions ci-dessous.
Durée
45 minutes
Atelier 1 : Une application Web .NET 6 exécutée sur Arm64
Étape 1 : créer le projet
1. Création d'un projet .NET sans serveur
dotnet new serverless.AspNetCoreWebApp -n AspNetCoreWebApp
Étape 2 : Apportez quelques modifications au code
Vous pouvez laisser l'instruction using et l'espace de noms tels quels, mais remplacer la classe IndexModel par la suivante :
public class IndexModel : PageModel
{
public string? Architecture { get; set; }
public string? DotnetVersion { get; set; }
public void OnGet()
{
Architecture = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture.ToString();
DotnetVersion = Environment.Version.ToString();
}
}
2. Mettre à jour Index.cshtml
Remplacez le contenu du fichier jusqu'au </h2> par :
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome to .NET Lambda functions on AWS!</h1>
<h2>Your application is using .NET <code>@Model.DotnetVersion</code>, <code>@Model.Architecture</code>.</h2>
</div>
Ces modifications vous permettront de voir quelle version de .NET vous utilisez et quel type de processeur vous utilisez.
Étape 3 : Configuration de l'architecture du processeur
Ouvrez le fichier serverless.template.
Trouvez la touche « Handler » et ajoutez à la ligne suivante :
"Architectures": ["arm64"],
"AspNetCoreFunction": {
"Type": "AWS::Serverless::Function",
"Properties": {
"Handler": "AspNetCoreWebApp::AspNetCoreWebApp.LambdaEntryPoint::FunctionHandlerAsync",
"Architectures": ["arm64"],
Étape 4 : Déploiement de la fonction
dotnet lambda deploy-serverless --stack-name AspNetCoreWebApp --s3-bucket your-unique-bucket-name1234
Vous verrez le résultat de chaque étape du déploiement au fur et à mesure de son élaboration et de son achèvement.
8/9/2022 1:45 PM AspNetCoreFunctionProxyResourcePermissionProd CREATE_COMPLETE
8/9/2022 1:45 PM AspNetCoreWebApp CREATE_COMPLETE
Stack finished updating with status: CREATE_COMPLETE
Output Name Value
------------------------------ --------------------------------------------------
ApiURL https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/
Étape 5 : nettoyer
dotnet lambda delete-serverless --stack-name AspNetCoreWebApp
Atelier 2 : Invocation d'une fonction Lambda à partir d'un programme C# sur votre ordinateur
Étape 1 : Créer la fonction Lambda
Au cours de cette étape, vous allez créer un projet Lambda vide.
1. Créez le projet
Si vous vous trouvez toujours dans le répertoire que vous avez créé pour l'atelier précédent, déplacez-le vers un répertoire vide. Créez une nouvelle fonction Lambda à partir de la ligne de commande :
dotnet new lambda.EmptyFunction -n GetS3Buckets
Étape 2 : Changements de code
Au cours de cette étape, vous allez modifier le code de projet généré.
1. Ajouter un package
Accédez au dossier GetS3Buckets\src\ GetS3Buckets et ajoutez le package AWS SDK S3 au projet :
cd GetS3Buckets\src\ GetS3Buckets
dotnet add package AWSSDK.S3
2. Mettre à jour Function.cs
Ouvrez Function.cs dans votre IDE et remplacez le code par :
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace GetS3Buckets;
public class Function
{
public async Task<IEnumerable<string>> FunctionHandler(ILambdaContext context)
{
var s3Client = new AmazonS3Client();
ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
ListBucketsResponse listBucketsResponse = await s3Client.ListBucketsAsync(listBucketsRequest);
var bucketNames = listBucketsResponse.Buckets.Select(b => b.BucketName);
return bucketNames;
}
}
Étape 3 : Déploiement de la fonction
Au cours de cette étape, vous allez déployer et tester votre fonction Lambda.
1. Déployez la fonction sur AWS
Déployez la fonction sur AWS à l'aide de :
dotnet lambda deploy-function GetS3Buckets
Lorsque vous êtes invité à sélectionner un rôle, choisissez l'option permettant d'en créer un nouveau. Utilisez le nom GetS3BucketsRole, pour le nom du rôle.
Lorsque vous êtes invité à joindre une politique, choisissez l'option pour AWSLambdaBasicExecutionRole, elle est numéro 6 sur ma liste.
Étape 4 : Ajouter une autorisation pour ListAllMyBuckets
Au cours de cette étape, vous allez ajouter des autorisations pour répertorier vos compartiments S3.
1. Création d'une politique IAM
La politique que vous avez attachée au rôle ne dispose pas de l'autorisation requise pour répertorier vos compartiments S3.
Créez un nouveau fichier appelé S3ListAllMyBucketsPolicy.json.
Ensuite, copiez et collez ce qui suit dans le fichier :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
2. Ajouter une politique au rôle
Ajoutez la politique au GetS3BucketsRole :.
aws iam put-role-policy --role-name GetS3BucketsRole --policy-name ListAllMyBuckets --policy-document file://S3ListAllMyBucketsPolicy.json
Patientez quelques instants pour que les autorisations soient appliquées.
Étape 5 : Invoquer la fonction Lambda depuis la ligne de commande
Au cours de cette étape, vous allez déployer et tester votre fonction Lambda.
1. Invoquer la fonction depuis la ligne de commande
Avant de créer un programme C# pour invoquer la fonction, essayez de l'invoquer à partir de la ligne de commande :
dotnet lambda invoke-function --function-name GetS3Buckets
Vous devriez voir une sortie répertoriant tous vos compartiments.
Cela permet de vérifier que la fonction Lambda fonctionne comme prévu.
Étape 6 : Invoquer la fonction Lambda depuis la ligne de commande
Au cours de cette étape, vous allez créer un programme C# qui invoque votre fonction Lambda.
1. Création d'une application console
Créez une application de console .NET à l'aide de :
dotnet new console -n GetS3BucketsCallFromLocal
2. Ajouter le package AWSSDK.Lambda
Accédez au dossier GetS3BucketsCallFromLocal.
cd GetS3BucketsCallFromLocal
Ajoutez le package AWS SDK Lambda, qui vous permet d'invoquer les fonctions Lambda :
dotnet add package AWSSDK.Lambda
3. Mettre à jour Program.cs
Ouvrez le fichier Program.cs et remplacez-le par :
using System.Text.Json;
using Amazon.Lambda;
using Amazon.Lambda.Model;
AmazonLambdaClient client = new AmazonLambdaClient();
var request = new InvokeRequest
{
FunctionName = "GetS3Buckets"
};
var result = await client.InvokeAsync(request);
var buckets = JsonSerializer.Deserialize<IEnumerable<string>>(result.Payload);
foreach (var bucket in buckets)
{
Console.WriteLine(bucket);
}
Étape 7 : Essayez-le
Au cours de cette étape, vous allez tester le programme de console et invoquer votre fonction Lambda.
1. Exécutez l'application console
À partir de la ligne de commande du répertoire GetS3BucketsCallFromLocal, exécutez :
dotnet run
La liste des noms des compartiments devrait s'afficher.
Étape 8 : nettoyage
Vous allez utiliser cette fonction dans le prochain atelier, donc pas de nettoyage pour le moment.
Atelier 3 : Invocation d'une fonction Lambda à partir d'une autre
Étape 1 : Création de la fonction GetS3Buckets
Terminez l'atelier précédent.
Étape 2 : Créer une fonction Lambda
Au cours de cette étape, vous allez créer une fonction Lambda pour appeler les fonctions GetS3Buckets.
1. Création d'un projet Lambda vide
À partir de la ligne de commande, exécutez :
dotnet new lambda.EmptyFunction -n GetS3BucketsCallFromLambdaFunction
2. Changer de dossier
Accédez au répertoire GetS3BucketsCallFromLambdaFunction\src\GetS3BucketsCallFromLambdaFunction.
Étape 3 : Mettre à jour le code
Au cours de cette étape, vous allez mettre à jour le code du projet.
1. Ajouter le package AWSSDK.Lambda
Ajoutez le package AWS SDK Lambda au projet :
dotnet add package AWSSDK.Lambda
2. Mettre à jour Function.cs
Ouvrez le fichier Function.cs et remplacez le code par :
using Amazon.Lambda;
using Amazon.Lambda.Core;
using Amazon.Lambda.Model;
using System.Text.Json;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace GetS3BucketsCallFromLambdaFunction;
public class Function
{
public async Task<IEnumerable<string>> FunctionHandler(ILambdaContext context)
{
AmazonLambdaClient client = new AmazonLambdaClient();
var request = new InvokeRequest
{
FunctionName = "GetS3Buckets",
};
var result = await client.InvokeAsync(request);
var bucketNames = JsonSerializer.Deserialize<IEnumerable<string>>(result.Payload);
return bucketNames;
}
}
Dans cet exemple, la fonction Lambda GetS3BucketsCallFromLambdaFunction appelle la fonction GetS3Buckets et renvoie la réponse sans la modifier.
Étape 4 : Déployer GetS3BucketsCallFromLambdaFunction
Au cours de cette étape, vous allez déployer GetS3BucketsCallFromLambdaFunction sur AWS.
1. Déployez la fonction
À partir de la ligne de commande, exécutez :
dotnet lambda deploy-function GetS3BucketsCallFromLambdaFunction
2. Créer un rôle
Créez un nouveau rôle pour la fonction nommée
GetS3BucketsCallFromLambdaFunctionRole.
3. Associer une politique au rôle
Associez la politique AWSLambdaBasicExecutionRole au rôle.
Étape 5 : Essayez d'invoquer GetS3BucketsCallFromLambdaFunction
Au cours de cette étape, vous allez essayer d'invoquer la fonction.
1. Déployez la fonction
Essayez d'invoquer GetS3BucketsCallFromLambdaFunctionRole :
dotnet lambda invoke-function --function-name GetS3BucketsCallFromLambdaFunction
Vous obtiendrez une erreur comme celle ci-dessous :
Payload:
{
"errorType": "AmazonLambdaException",
"errorMessage": "User: arn:aws:sts::000000000000:assumed-role/GetS3BucketsCallFromLambdaFunctionRole/GetS3BucketsCallFromLambdaFunction
is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:000000000000:function:GetS3Buckets because no
identity-based policy allows the lambda:InvokeFunction action",
Cela est dû au fait que GetS3BucketsCallFromLambdaFunction nécessite des autorisations pour invoquer GetS3Buckets.
À l'étape suivante, vous ajouterez une politique en ligne accordant à GetS3BucketsCallFromLambdaFunction l'autorisation dont il a besoin.
Étape 6 : Donnez à GetS3BucketsCallFromLambdaFunction l'autorisation d'invoquer GetS3Buckets
Au cours de cette étape, vous allez autoriser GetS3BucketsCallFromLambdaFunction à invoquer GetS3Buckets.
1. Obtenir l'ARN de GetS3Buckets
Avant de pouvoir accorder des droits d'invocation à GetS3BucketsCallFromLambdaFunction, vous devez obtenir l'Amazon Resource Name (ARN) de GetS3Buckets.
Vous pouvez le faire de plusieurs manières. Tout d'abord depuis la console AWS. Accédez au service Lambda et sélectionnez la fonction GetS3Buckets
Vous pouvez cliquer sur Copier l'ARN dans les deux zones surlignées.
Pour obtenir l'ARN de GetS3Buckets à partir de la ligne de commande, exécutez :
dotnet lambda get-function-config GetS3Buckets
Vous verrez une sortie qui ressemble à –
Project Home : https://github.com/aws/aws-extensions-for-dotnet-cli,
https://github.com/aws/aws-lambda-dotnet
Name: GetS3Buckets
Arn: arn:aws:lambda:us-east-1:000000000000:function:GetS3Buckets
Package Type: Zip
Runtime: dotnet6
Function Handler: GetS3Buckets::GetS3Buckets.Function::FunctionHandler
Last Modified: 2022-08-10T13:58:29.211+0000
Memory Size: 256
Ephemeral Storage Size: 512
Role: arn:aws:iam::000000000000:role/GetS3Buckets
Timeout: 30
Version: $LATEST
State: Active
Last Update Status: Successful
KMS Key ARN: (default) aws/lambda
Beaucoup d'informations utiles, mais ce que vous voulez se trouve sur la deuxième ligne du tableau, l'Arn.
Créez un fichier nommé InvokeGetS3Buckets.json, ajoutez-y ce qui suit :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action":[
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:us-east-1:000000000000:function:GetS3Buckets"
}
]
}
Repl
Remplacez la « Ressource » par l'ARN de votre fonction Lambda que vous avez obtenu à partir de la ligne de commande ou de l'interface utilisateur de la console.
2. Mettre à jour les autorisations
Exécutez la requête suivante :
aws iam put-role-policy --role-name GetS3BucketsCallFromLambdaFunctionRole
--policy-name InvokeGetS3BucketsFunction
--policy-document file://InvokeGetS3Buckets.json
La mise à jour des autorisations sur AWS peut prendre quelques minutes.
Étape 7 : invoquez à nouveau GetS3BucketsCallFromLambdaFunction
Au cours de cette étape, vous allez de nouveau invoquer la fonction.
1. Invoquez la fonction avec dotnet lambda invoke-function
Cette fois, vous pourrez invoquer la fonction :
dotnet lambda invoke-function --function-name GetS3BucketsCallFromLambdaFunction
Conclusion
Dans ces ateliers, vous mettez en pratique ce que vous avez appris. Vous avez d'abord créé une application Web accessible de n'importe où dans le monde. Vous avez ensuite déployé une fonction Lambda que vous avez invoquée directement depuis un programme C# sur votre ordinateur. Vous vous êtes ensuite appuyé sur le second atelier en déployant une autre fonction Lambda et en invoquant une fonction Lambda depuis une autre. Vous deviez également résoudre les problèmes d'autorisation au fur et à mesure qu'ils se présentaient.
À partir de là, vous pouvez essayer d'utiliser d'autres services AWS avec des fonctions Lambda et créer des applications Lambda plus complexes.