Créer votre première fonction durable en Python

Durable Functions est une extension d’Azure Functions qui vous permet d’écrire des fonctions avec état dans un environnement serverless. L’extension gère l’état, les points de contrôle et les redémarrages à votre place.

Dans cet article, vous allez découvrir comment utiliser l’extension Azure Functions pour Visual Studio Code afin de créer et tester localement une fonction durable appelée « Hello World ». Cette fonction permet d’orchestrer et de chaîner des appels à d’autres fonctions. Vous pouvez ensuite publier le code de la fonction dans Azure.

Capture d’écran de l’exécution d’une fonction durable dans Azure.

Prérequis

Pour suivre ce tutoriel :

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Créer votre projet local

Dans cette section, vous utilisez Visual Studio Code pour créer un projet Azure Functions local.

  1. Dans Visual Studio Code, appuyez sur F1 (ou Ctrl/Cmd+Maj+P) pour ouvrir la palette de commandes. Dans la palette de commandes, recherchez et sélectionnez Azure Functions: Create New Project....

    Capture d’écran de la fenêtre Créer une fonction.

  2. Désignez un emplacement de dossier vide pour votre projet et choisissez Sélectionner.

  1. Suivez les invites et fournissez les informations suivantes :

    Prompt Valeur Description
    Sélectionnez un langage pour votre projet d’application de fonction Python Créez un projet Functions Python local.
    Sélectionner une version Azure Functions v4 Vous voyez cette option uniquement quand les outils Core Tools ne sont pas déjà installés. Dans le cas présent, les outils Core Tools sont installés la première fois que vous exécutez l’application.
    Version Python Python 3.7, 3.8, 3.9 ou 3.10 Visual Studio Code crée un environnement virtuel avec la version que vous sélectionnez.
    Sélectionner un modèle pour la première fonction de votre projet Ignorer pour le moment
    Sélectionner la façon dont vous souhaitez ouvrir votre projet Ouvrir dans la fenêtre active Ouvre à nouveau Visual Studio Code dans le dossier que vous avez sélectionné.
  1. Suivez les invites et fournissez les informations suivantes :

    Prompt Valeur Description
    Sélectionner une langue Python (Modèle de programmation V2) Créez un projet Python Functions local à l’aide du modèle de programmation V2.
    Sélectionner une version Azure Functions v4 Vous voyez cette option uniquement quand les outils Core Tools ne sont pas déjà installés. Dans le cas présent, les outils Core Tools sont installés la première fois que vous exécutez l’application.
    Version Python Python 3.7, 3.8, 3.9 ou 3.10 Visual Studio Code crée un environnement virtuel avec la version que vous sélectionnez.
    Sélectionner la façon dont vous souhaitez ouvrir votre projet Ouvrir dans la fenêtre active Ouvre à nouveau Visual Studio Code dans le dossier que vous avez sélectionné.

Visual Studio Code installe la solution Azure Functions Core Tools, si nécessaire. Il crée également un projet d’application de fonction dans un dossier. Ce projet contient les fichiers config host.json et local.settings.json.

Un fichier requirements.txt est également créé dans le dossier racine. Il spécifie les packages Python requis pour exécuter votre application de fonction.

Installer azure-functions-durable à partir de PyPI

Quand vous avez créé le projet, l’extension Azure Functions de Visual Studio Code crée automatiquement un environnement virtuel en utilisant la version de Python que vous avez sélectionnée. Vous devez alors activer l’environnement virtuel dans un terminal et installer certaines dépendances requises par Azure Functions et Durable Functions.

  1. Ouvrez le fichier requirements.txt dans l’éditeur et remplacez son contenu par le code suivant :

    azure-functions
    azure-functions-durable
    
  2. Ouvrez le terminal intégré de l’éditeur dans le dossier actif (Ctrl+Maj+`).

  3. Dans le terminal intégré, activez l’environnement virtuel dans le dossier actif selon votre système d’exploitation :

    source .venv/bin/activate
    
  4. Dans le terminal intégré où l’environnement virtuel est activé, utilisez pip pour installer les packages que vous avez définis.

    python -m pip install -r requirements.txt
    

Créer vos fonctions

Une application Durable Functions de base contient trois fonctions :

  • La fonction d’orchestrateur : décrit un workflow qui orchestre d’autres fonctions.
  • La fonction d’activité : appelée par la fonction d’orchestrateur, elle effectue un travail et retourne éventuellement une valeur.
  • La fonction de client : fonction Azure normale qui démarre une fonction d’orchestrateur. Cet exemple utilise une fonction déclenchée via HTTP.

Fonction d’orchestrateur

Vous utilisez un modèle pour créer le code de fonction durable dans votre projet.

  1. Dans la palette de commandes, recherchez et sélectionnez Azure Functions: Create Function....

  2. Suivez les invites et fournissez les informations suivantes :

    Prompt Valeur Description
    Sélectionner un modèle pour votre fonction Orchestrateur Durable Functions Créer une orchestration Durable Functions
    Fournir un nom de fonction HelloOrchestrator Nom de votre fonction durable

Vous avez ajouté un orchestrateur pour coordonner les fonctions d’activité. Ouvrez HelloOrchestrator/__init__.py pour voir la fonction d’orchestrateur. Chaque appel à context.call_activity appelle une fonction d’activité nommée Hello.

Ajoutez maintenant la fonction d’activité Hello référencée.

Fonction d’activité

  1. Dans la palette de commandes, recherchez et sélectionnez Azure Functions: Create Function....

  2. Suivez les invites et fournissez les informations suivantes :

    Prompt Valeur Description
    Sélectionner un modèle pour votre fonction Activité Durable Functions Créer une fonction d’activité
    Fournir un nom de fonction Hello Nom de votre fonction d’activité

Vous avez ajouté la fonction d’activité Hello qui est appelée par l’orchestrateur. Ouvrez Hello/__init__.py pour voir qu’elle accepte un nom comme entrée et retourne un message d’accueil. Une fonction d’activité vous permet d’effectuer des actions, telles que le lancement d’un appel de base de données ou l’exécution d’un calcul.

Pour terminer, vous ajouterez une fonction déclenchée par HTTP qui démarrera l’orchestration.

Fonction de client (démarrage HTTP)

  1. Dans la palette de commandes, recherchez et sélectionnez Azure Functions: Create Function....

  2. Suivez les invites et fournissez les informations suivantes :

    Prompt Valeur Description
    Sélectionner un modèle pour votre fonction Démarrage HTTP Durable Functions Créer une fonction de démarrage HTTP
    Fournir un nom de fonction DurableFunctionsHttpStart Nom de votre fonction cliente
    Niveau d’autorisation Anonyme À des fins de démonstration, autorisez l’appel sans authentification à la fonction

Vous avez ajouté une fonction déclenchée par HTTP qui démarre une orchestration. Ouvrez DurableFunctionsHttpStart/__init__.py pour voir qu’elle se sert de client.start_new pour démarrer une nouvelle orchestration. Elle utilise ensuite client.create_check_status_response pour retourner une réponse HTTP contenant des URL qui peuvent être utilisées pour superviser et gérer la nouvelle orchestration.

Vous disposez maintenant d’une application Durable Functions qui peut être exécutée localement, et déployée sur Azure.

Spécifications

La version 2 du modèle de programmation Python nécessite les versions minimales suivantes :

Activer le modèle de programmation v2

Le paramètre d’application suivant est requis pour exécuter le modèle de programmation v2 :

  • Nom : AzureWebJobsFeatureFlags
  • Valeur: EnableWorkerIndexing

Si vous exécutez localement à l’aide de Azure Functions Core Tools, vous devez ajouter ce paramètre à votre fichier local.settings.json. Si vous exécutez dans Azure, procédez comme suit avec l’outil de votre choix :

Remplacez <FUNCTION_APP_NAME> et <RESOURCE_GROUP_NAME> par le nom de votre application de fonction et du groupe de ressources, respectivement.

az functionapp config appsettings set --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --settings AzureWebJobsFeatureFlags=EnableWorkerIndexing

Pour créer une application Durable Functions de base à l’aide de ces 3 types de fonctions, remplacez le contenu de function_app.py par le code Python suivant.

import azure.functions as func
import azure.durable_functions as df

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

# An HTTP-Triggered Function with a Durable Functions Client binding
@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
    function_name = req.route_params.get('functionName')
    instance_id = await client.start_new(function_name)
    response = client.create_check_status_response(req, instance_id)
    return response

# Orchestrator
@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
    result1 = yield context.call_activity("hello", "Seattle")
    result2 = yield context.call_activity("hello", "Tokyo")
    result3 = yield context.call_activity("hello", "London")

    return [result1, result2, result3]

# Activity
@myApp.activity_trigger(input_name="city")
def hello(city: str):
    return f"Hello {city}"

Consultez le tableau ci-dessous pour obtenir une explication de chaque fonction et de son objectif dans l’exemple.

Méthode Description
hello_orchestrator Fonction d’orchestrateur, qui décrit le flux de travail. Dans ce cas, l’orchestration démarre, appelle trois fonctions dans une séquence et retourne les résultats triés des 3 fonctions d’une liste.
hello Fonction d’activité, qui effectue le travail orchestré. La fonction retourne un message d’accueil simple à la ville passée en tant qu’argument.
http_start Fonction déclenchée par HTTP qui démarre une instance de l’orchestration et retourne une réponse d’état de vérification.

Notes

Durable Functions prend également en charge les blueprints de Python V2. Pour les utiliser, vous devez inscrire vos fonctions blueprint à l’aide de la classe azure-functions-durableBlueprint, comme illustré ici. Le blueprint obtenu peut ensuite être inscrit normalement. Consultez cette page pour obtenir un exemple.

Tester la fonction en local

Azure Functions Core Tools vous permet d’exécuter un projet Azure Functions sur votre ordinateur de développement local. Si cela n’a pas déjà été fait, vous êtes invité à installer ces outils la première fois que vous démarrez une fonction dans Visual Studio Code.

  1. Pour tester votre fonction, définissez un point d’arrêt dans le code de la fonction d’activité Hello (Hello/__init__.py). Appuyez sur F5 ou sélectionnez Debug: Start Debugging dans la palette de commandes pour démarrer le projet d’application de fonction. La sortie de Core Tools est affichée dans le panneau Terminal.
  1. Pour tester votre fonction, définissez un point d’arrêt dans le hello code de la fonction d’activité. Appuyez sur F5 ou sélectionnez Debug: Start Debugging dans la palette de commandes pour démarrer le projet d’application de fonction. La sortie de Core Tools est affichée dans le panneau Terminal.

Notes

Pour plus d’informations sur le débogage, consultez Diagnostics Durable Functions.

  1. Durable Functions nécessite l’exécution d’un compte de stockage Azure. Lorsque Visual Studio Code vous invite à sélectionner un compte de stockage, choisissez Sélectionner un compte de stockage.

    Capture d’écran montrant comment créer un compte de stockage.

  2. Suivez les invites et fournissez les informations suivantes pour créer un compte de stockage dans Azure :

    Prompt Valeur Description
    Sélectionner un abonnement nom de votre abonnement Sélectionner votre abonnement Azure
    Sélectionner un compte de stockage Création d’un nouveau compte de stockage
    Entrer le nom du nouveau compte de stockage nom unique Nom du compte de stockage à créer
    Sélectionner un groupe de ressources nom unique Nom du groupe de ressources à créer
    Sélectionner un emplacement region Sélectionner une région proche de vous
  3. Dans le panneau Terminal, copiez le point de terminaison de l’URL de votre fonction déclenchée via HTTP.

    Capture d’écran de la sortie locale Azure.

  1. Utilisez votre navigateur ou un outil comme Postman ou cURL, envoyez une requête HTTP au point de terminaison de l’URL. Remplacez le dernier segment par le nom de la fonction d’orchestrateur (HelloOrchestrator). L’URL doit être similaire à http://localhost:7071/api/orchestrators/HelloOrchestrator.

    La réponse est le résultat initial provenant de la fonction HTTP, qui vous indique que l’orchestration durable a bien été démarrée. Il ne s’agit pas encore du résultat final de l’orchestration. La réponse contient plusieurs URL utiles. Pour le moment, demandons l’état de l’orchestration.

  1. Utilisez votre navigateur ou un outil comme Postman ou cURL, envoyez une requête HTTP au point de terminaison de l’URL. Remplacez le dernier segment par le nom de la fonction d’orchestrateur (hello_orchestrator). L’URL doit être similaire à http://localhost:7071/api/orchestrators/hello_orchestrator.

    La réponse est le résultat initial provenant de la fonction HTTP, qui vous indique que l’orchestration durable a bien été démarrée. Il ne s’agit pas encore du résultat final de l’orchestration. La réponse contient plusieurs URL utiles. Pour le moment, demandons l’état de l’orchestration.

  1. Copiez la valeur de l’URL pour statusQueryGetUri, collez-la dans la barre d’adresse du navigateur, puis exécutez la requête. Vous pouvez également continuer à utiliser Postman pour envoyer la requête GET.

    La requête interroge l’instance d’orchestration pour obtenir l’état. Une fois l’exécution de l’instance terminée, vous devez recevoir une réponse contenant les sorties ou résultats de la fonction durable. Voici comment il se présente :

{
    "name": "HelloOrchestrator",
    "instanceId": "9a528a9e926f4b46b7d3deaa134b7e8a",
    "runtimeStatus": "Completed",
    "input": null,
    "customStatus": null,
    "output": [
        "Hello Tokyo!",
        "Hello Seattle!",
        "Hello London!"
    ],
    "createdTime": "2020-03-18T21:54:49Z",
    "lastUpdatedTime": "2020-03-18T21:54:54Z"
}
{
    "name": "hello_orchestrator",
    "instanceId": "9a528a9e926f4b46b7d3deaa134b7e8a",
    "runtimeStatus": "Completed",
    "input": null,
    "customStatus": null,
    "output": [
        "Hello Tokyo!",
        "Hello Seattle!",
        "Hello London!"
    ],
    "createdTime": "2020-03-18T21:54:49Z",
    "lastUpdatedTime": "2020-03-18T21:54:54Z"
}
  1. Pour arrêter le débogage, appuyez sur Maj+F5 dans Visual Studio Code.

Après avoir vérifié que la fonction s’exécute correctement sur votre ordinateur local, il est temps de publier le projet sur Azure.

Connexion à Azure

Avant de pouvoir créer des ressources Azure ou de publier votre application, vous devez vous connecter à Azure.

  1. Si vous n’êtes pas déjà connecté, choisissez l’icône Azure dans la barre d’activité. Puis, dans la zone Ressources, choisissez Se connecter à Azure....

    Capture d’écran de la connexion à la fenêtre Azure dans VS Code.

    Si vous êtes déjà connecté et que vous pouvez voir vos abonnements existants, accédez à la section suivante. Si vous n’avez pas encore de compte Azure, choisissez Créer un compte Azure.... Les étudiants peuvent choisir Créer un compte Microsoft Azure for Students....

  2. Quand vous y êtes invité dans le navigateur, choisissez votre compte Azure, puis connectez-vous à l’aide de vos informations d’identification de compte Azure. Si vous créez un compte, vous pouvez vous connecter une fois votre compte créé.

  3. Une fois la connexion réussie, vous pouvez fermer la nouvelle fenêtre de navigateur. Les abonnements qui font partie de votre compte Azure sont affichés dans la barre latérale.

Créer l’application de fonction dans Azure

Dans cette section, vous créez une application de fonction et les ressources associées dans votre abonnement Azure.

  1. Sélectionnez l’icône Azure dans la barre Activité. Ensuite, dans la zone Ressources, sélectionnez l’icône + et choisissez l’option Créer une application de fonction dans Azure.

    Créer une ressource dans votre abonnement Azure

  2. Quand vous y êtes invité, indiquez les informations suivantes :

    Prompt Sélection
    Sélectionner un abonnement choisissez l’abonnement à utiliser. Vous ne verrez pas cette invite si vous n’avez qu’un abonnement visible sous Ressources.
    Entrer un nom global unique pour l’application de fonction Tapez un nom valide dans un chemin d’URL. Le système vérifie que le nom que vous tapez est unique dans Azure Functions.
    Sélectionner une pile d’exécution Choisissez la version du langage que vous avez exécutée localement.
    Sélectionnez un emplacement pour les nouvelles ressources Pour de meilleures performances, choisissez une région proche de vous.

    L’extension montre l'état des ressources individuelles au fur et à mesure qu’elles sont créées dans Azure, dans le panneau Azure : journal d’activité.

    Journal de création de ressource Azure

  3. Quand la création est terminée, les ressources Azure suivantes sont créées dans votre abonnement. Les ressources sont nommées en fonction du nom de votre application de fonction :

    • Un groupe de ressources, qui est un conteneur logique pour les ressources associées.
    • Un compte Stockage Azure standard, qui conserve l’état et d’autres informations spécifiques à vos projets.
    • Une application de fonction, qui fournit l’environnement d’exécution de votre code de fonction. Une application de fonction vous permet de regrouper des fonctions en une unité logique pour faciliter la gestion, le déploiement et le partage des ressources au sein du même plan d’hébergement.
    • Un plan App Service, qui définit l’hôte sous-jacent pour votre application de fonction.
    • Une instance Application Insights connectée à l’application de fonction, qui suit l’utilisation de vos fonctions dans l’application.

    Une notification s’affiche après que votre application de fonction a été créée et que le package de déploiement a été appliqué.

    Conseil

    Par défaut, les ressources Azure nécessaires à votre application de fonction sont créées d’après le nom d’application de fonction que vous indiquez. Par défaut, elles sont également créées dans le même nouveau groupe de ressources avec l’application de fonction. Si vous souhaitez personnaliser les noms de ces ressources ou réutiliser des ressources existantes, vous devez plutôt publier le projet à l’aide des options de création avancées.

Déployer le projet dans Azure

Important

Le déploiement vers une application de fonction existante remplace toujours le contenu de cette application dans Azure.

  1. Dans la zone Ressources de l’activité Azure, recherchez la ressource d’application de fonction que vous venez de créer, cliquez avec le bouton droit sur la ressource, puis sélectionnez Déployer sur l’application de fonction....

  2. Quand vous êtes invité à remplacer les déploiements précédents, sélectionnez Déployer pour déployer le code de votre fonction sur la nouvelle ressource de l’application de fonction.

  3. Une fois le déploiement terminé, sélectionnez Afficher la sortie pour afficher les résultats de la création et du déploiement, y compris les ressources Azure que vous avez créées. Si vous manquez la notification, sélectionnez l’icône de cloche dans le coin inférieur droit pour la voir de nouveau.

    Capture d’écran de la fenêtre Afficher la sortie.

Tester votre fonction dans Azure

  1. Copiez l’URL du déclencheur HTTP à partir du panneau Sortie. L’URL qui appelle la fonction déclenchée via HTTP doit se présenter sous ce format : https://<functionappname>.azurewebsites.net/api/orchestrators/HelloOrchestrator
  1. Copiez l’URL du déclencheur HTTP à partir du panneau Sortie. L’URL qui appelle la fonction déclenchée via HTTP doit se présenter sous ce format : https://<functionappname>.azurewebsites.net/api/orchestrators/hello_orchestrator
  1. Collez cette nouvelle URL de requête HTTP dans la barre d’adresse de votre navigateur. Vous devez obtenir la même réponse d’état que lorsque vous avez utilisé l’application publiée.

Étapes suivantes

Vous avez utilisé Visual Studio Code pour créer et publier une application de fonction durable Python.