Créer et tester une fonction Azure simple localement avec Visual Studio

Effectué

Les utilisateurs peuvent écrire, déboguer et déployer une fonction Azure à partir du portail Azure. Toutefois, l’écriture de fonctions directement dans un environnement de production, de préproduction ou de test peut ne pas convenir. Par exemple, l’écriture de tests unitaires automatisés pour Azure Functions ou l’utilisation du déploiement à la demande d’Azure Functions sur des applications de fonction dans Azure. En règle générale, les développeurs préfèrent utiliser un éditeur de code et des outils de développement plutôt que l’environnement fourni par le portail Azure. Visual Studio vous permet de développer et de gérer du code Azure Functions à l’aide d’autres codes et services dans un projet unique.

Dans le scénario des montres de luxe en ligne, les développeurs sont déjà familiarisés avec Visual Studio 2022. Vous décidez donc d’utiliser Visual Studio comme principal environnement de développement pour la création de fonctions Azure. Visual Studio fournit également un excellent environnement pour tester vos fonctions au niveau local avant de les déployer dans Azure.

Dans cette unité, vous découvrez comment utiliser les outils disponibles dans Visual Studio pour créer et tester une fonction Azure sur votre ordinateur local.

Important

Cet article prend en charge les fonctions de bibliothèque de classes .NET s’exécutant in-process avec le runtime. Vos fonctions C# peuvent également s’exécuter hors processus et isolées du runtime Functions. Le modèle de processus de travail isolé est le seul moyen d’exécuter des versions non LTS des applications .NET et .NET Framework dans les versions actuelles du runtime Functions. Pour plus d’informations, consultez Fonctions de processus Worker isolé .NET.

Modifier l’installation de Visual Studio

Tout d’abord, nous allons configurer Visual Studio avec les outils web et cloud dont vous avez besoin pour votre environnement de développement.

  1. Avec Visual Studio 2022 installé localement, ouvrez Visual Studio Installer et, dans Visual Studio Community 2022, sélectionnez Modifier.

    Capture d’écran de Visual Studio Installer avec l’option Modifier en surbrillance.

  2. La page Modification - Visual Studio s’affiche.

    Capture d’écran de l’onglet Modification des charges de travail Visual Studio Community 2022 avec le développement ASP.NET et web, et le développement Azure en surbrillance.

  3. Sous l’onglet Charges de travail, cochez les cases Développement ASP.NET et web et Développement Azure, puis sélectionnez Modifier.

  4. Dans la boîte de dialogue de vérification, sélectionnez Oui. La page Visual Studio Installer s’affiche et montre la progression des packages en cours d’installation.

Extension des outils Azure Functions pour Visual Studio

Les outils Azure Functions sont une extension Visual Studio qui vous permet de créer, tester et déployer Azure Functions dans votre environnement de développement local. Pour créer rapidement une application de fonction Azure, cette extension fournit un modèle qui vous permet de générer, puis déployer une fonction Azure directement sur Azure à partir de Visual Studio.

L’extension Azure Functions and Web Jobs Tools est incluse dans Visual Studio 2022.

Application Azure Function

Une application de fonction héberge une ou plusieurs fonctions. Elle fournit l’environnement et le runtime de votre code de fonction.

Une fonction est déclenchée par un événement au lieu d’être appelée directement à partir d’une application. Vous spécifiez le type d’événement qui déclenche chaque fonction dans votre application de fonction Azure. Les événements disponibles sont les suivants :

  • Déclencheur d’objet blob. Ce type de fonction s’exécute quand un fichier est chargé ou modifié dans le stockage d’objets blob Azure.
  • Déclencheur Event Hub. Un déclencheur Event Hubs exécute la fonction quand un hub d’événements reçoit un message.
  • Déclencheur Azure Cosmos DB. Ce déclencheur s’exécute quand un document est ajouté à une base de données Azure Cosmos DB, ou modifié dans celle-ci. Vous pouvez utiliser ce déclencheur pour intégrer Azure Cosmos DB à d’autres services. Par exemple, si un document représentant la commande d’un client est ajouté à une base de données, vous pouvez utiliser un déclencheur pour envoyer une copie de la commande à une file d’attente pour traitement.
  • Déclencheur HTTP. Ce déclencheur exécute la fonction quand une requête HTTP se produit dans une application web. Vous pouvez également utiliser ce déclencheur pour répondre à des webhooks. Un webhook est un rappel qui se produit quand un élément hébergé par un site web est modifié. Par exemple, vous pouvez créer une fonction qui est déclenchée par un webhook depuis un dépôt GitHub quand un élément du dépôt change.
  • Déclencheur de file d’attente. Ce déclencheur démarre la fonction quand un nouvel élément est ajouté à une file d’attente Stockage Azure.
  • Déclencheur de file d’attente Service Bus. Ce déclencheur exécute la fonction quand un nouvel élément est ajouté à une file d’attente Azure Service Bus.
  • Déclencheur de rubrique Service Bus. Ce déclencheur exécute la fonction en réponse à un nouveau message arrivant dans une rubrique Service Bus.
  • Déclencheur de minuteur. Cet événement exécute la fonction Azure à intervalles réguliers, selon la planification que vous définissez.

Capture d’écran montrant les déclencheurs de fonction Azure disponibles, avec le déclencheur HTTP mis en évidence.

Le tableau suivant indique le niveau le plus élevé de .NET Core et .NET Framework pouvant être utilisé avec une version spécifique de Functions.

Version du runtime Functions In-process Processus Worker isolé
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions 1.x .NET Framework 4.8 n/a

Une application de fonction Azure stocke des informations de gestion, du code et des journaux dans le stockage Azure. Pour stocker ces données, vous créez un compte de stockage. Le compte de stockage doit prendre en charge l’objet blob Azure, la File d’attente, les Fichiers et le Stockage Table. Utilisez un compte général Stockage Azure à cet effet. Spécifiez le compte de stockage à utiliser pour la fonction à l’aide de la boîte de dialogue illustrée ci-dessus.

Une fonction peut effectuer des opérations privilégiées ou sensibles. Une fonction déclenchée par une requête HTTP peut être exposée publiquement. Vous devrez peut-être limiter la possibilité d’exécuter cette fonction à certains groupes d’utilisateurs. Vous protégez une fonction en spécifiant les droits d’accès nécessaires pour déclencher la fonction. Une fonction déclenchée par une requête HTTP prend en charge trois niveaux de droits d’accès :

  • Anonyme. Aucune authentification n’est requise, et n’importe quel utilisateur peut déclencher la fonction.
  • Fonction. La requête HTTP doit fournir une clé qui permet au runtime de la fonction Azure d’autoriser la requête. Vous créez cette clé séparément, et vous pouvez la gérer à l’aide du portail Azure.
  • Administrateur. Similaire à Fonction. L’utilisateur doit spécifier une clé avec la requête HTTP qui déclenche la fonction. La différence réside dans le fait que la clé est une clé d’administration. Vous pouvez utiliser cette clé pour accéder à n’importe quelle fonction dans l’application de fonction. Comme toute clé de fonction, vous créez cette clé séparément.

Si vous créez une fonction déclenchée par des événements autres que des requêtes HTTP, vous devez fournir une chaîne de connexion et d’autres détails nécessaires pour que l’application de fonction accède à la ressource déclenchant l’événement. Par exemple, si vous écrivez une fonction déclenchée par un événement du service Stockage Blob, vous devez spécifier la chaîne de connexion du compte Stockage Blob correspondant.

Structure d’une fonction Azure

Une fonction Azure est implémentée en tant que classe statique. La classe fournit une méthode statique et asynchrone nommée Run qui agit comme point d’entrée pour la classe.

Les paramètres passés à la méthode Run fournissent le contexte du déclencheur. Si c’est un déclencheur HTTP, la fonction reçoit un objet HttpRequest. Cet objet contient l’en-tête et le corps de la demande. Vous pouvez accéder aux données dans la requête en utilisant les mêmes techniques que celles disponibles dans n’importe quelle application HTTP. Les attributs appliqués à cette fonction spécifient les exigences d’autorisation (Anonyme dans ce cas) et les opérations HTTP auxquelles la fonction répond (GET et POST).

L’exemple de code généré par Visual Studio examine la chaîne de requête fournie dans le cadre de l’URL de la requête, et recherche un paramètre appelé name. Le code utilise également un StreamReader pour désérialiser le corps de la requête, et tente de lire la valeur d’une propriété également appelée name à partir de la requête. Si name se trouve dans la chaîne de requête ou le corps de la requête, la valeur de name est retournée dans la réponse. Sinon, la fonction génère une réponse d’erreur avec le message : Please pass a name on the query string or in the request body (Passez un nom à la chaîne de requête ou dans le corps de la requête).

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

La fonction retourne une valeur contenant les données de sortie et les résultats, wrappés dans un objet IActionResult. La valeur est retournée dans le corps de la réponse HTTP pour la demande.

Les différents types de déclencheurs reçoivent des paramètres d’entrée et des types de retour différents. L’exemple suivant montre le code généré pour un déclencheur d’objet blob. Dans cet exemple, le contenu du blob est retourné par le biais d’un objet de Flux. Le nom du blob est également fourni. Le déclencheur ne retourne aucune donnée ; son objectif est de lire et de traiter les données contenues dans le blob nommé.

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

Dans tous les cas, une fonction reçoit un paramètre ILogger. La fonction peut utiliser ce paramètre pour écrire des messages de journal que l’application de fonction écrit dans le stockage pour une analyse ultérieure.

Une fonction contient également des métadonnées qui spécifient le type du déclencheur, les exigences de sécurité ainsi que d’autres exigences d’informations spécifiques. Vous pouvez modifier les métadonnées à l’aide des attributs HttpTrigger et BlobTrigger ou d’autres attributs de déclencheur, comme indiqué dans les exemples. L’attribut FunctionName qui précède une fonction est un identificateur de la fonction dont se sert l’application de fonction. Ce nom ne doit pas nécessairement être identique à celui de la fonction, mais il est conseillé de les synchroniser pour éviter toute confusion.

Tester une application de fonction Azure localement

Vous pouvez utiliser le débogueur visuel pour générer et tester une application de fonction Azure localement. Pour lancer le débogueur, appuyez sur F5 ou, dans le menu Déboguer, sélectionnezDémarrer le débogage. La version locale du runtime de fonction démarre. Vos fonctions sont disponibles pour le test. L’exemple montre le runtime hébergeant Function1, la fonction déclenchée par un événement HTTP. L’URL indique le point de terminaison auquel la fonction est actuellement attachée.

Capture d’écran montrant le runtime de la fonction Azure – exemple 1.

Si vous ouvrez un navigateur web et que vous accédez à cette URL, vous déclenchez la fonction. L’image suivante affiche la réponse générée par une requête HTTP GET qui n’inclut pas de corps. Vous pouvez voir le message généré par le code qui retourne l’objet BadRequestObjectResult à partir de la fonction.

Capture d’écran montrant le runtime Azure Functions.

Si vous fournissez une chaîne de requête qui inclut un paramètre name, la fonction lit et traite la valeur.

Capture d’écran montrant le runtime de la fonction Azure – exemple 2.

Pendant que le code s’exécute, vous voyez des messages de trace apparaître dans la fenêtre Runtime de fonction. Vous pouvez utiliser les fonctionnalités de débogage standard de Visual Studio si vous devez définir des points d’arrêt et examiner le flux de contrôle dans une fonction.