Charges de travail .NET sur AWS Lambda

MODULE 6

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

Vous allez y créer un projet .NET sans serveur.

1. Création d'un projet .NET sans serveur

dotnet new serverless.AspNetCoreWebApp -n AspNetCoreWebApp
Cela créera le projet dans le répertoire AspNetCoreWebApp\src\AspNetCoreWebApp.
2. Ouvrir projet
Ouvrez ce projet dans votre IDE préféré.

Étape 2 : Apportez quelques modifications au code

Au cours de cette étape, vous allez modifier le code de projet généré.
1. Mettre à jour Index.cshtml.cs
Une fois le projet ouvert dans votre IDE, ouvrez Pages/index.cshtml.cs dans l'éditeur de 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

Ouvrez le fichier Pages/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>
Laissez l'élément <svg> en place.

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

Au cours de cette étape, vous allez définir l'architecture du processeur sur Arm64.
1. Changez l'architecture du processeur en Arm64
Encore un changement.

Ouvrez le fichier serverless.template.

Trouvez la touche « Handler » et ajoutez à la ligne suivante :
"Architectures": ["arm64"],
Votre bloc de code devrait maintenant ressembler à ce qui suit :
"AspNetCoreFunction": {
  "Type": "AWS::Serverless::Function",
  "Properties": {
    "Handler": "AspNetCoreWebApp::AspNetCoreWebApp.LambdaEntryPoint::FunctionHandlerAsync",
    "Architectures": ["arm64"],
2. Enregistrez et créez
Enregistrez toutes vos modifications et créez l'application pour éviter toute erreur de compilation.

Étape 4 : Déploiement de la fonction

Au cours de cette étape, vous allez déployer et tester votre fonction Lambda.
1. Déployer la fonction sur AWS
À partir de la ligne de commande, exécutez :
dotnet lambda deploy-serverless --stack-name AspNetCoreWebApp --s3-bucket your-unique-bucket-name1234
Installez-vous confortablement et attendez qu'AWS déploie votre fonction Lambda.

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/
2. Création d'un projet WebAPI .NET
À la fin de la sortie, il y aura une ApiURL, ouvrez-la dans votre navigateur.

Étape 5 : nettoyer

Au cours de cette étape, vous allez supprimer le projet sans serveur dans AWS.
1. Supprimer le projet sans serveur
Pour supprimer toutes les ressources créées pendant l'exécution, procédez comme suit :
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
Cela créera le projet dans le répertoire AspNetCoreWebApp\src\AspNetCoreWebApp.

É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.

Cette page vous a-t-elle été utile ?

Évaluation des compétences