Partager via


Démarrage rapide : Créer une application Durable Functions qui utilise le fournisseur de stockage MSSQL

Utilisez Durable Functions, une fonctionnalité d’Azure Functions, pour écrire des fonctions avec état dans un environnement serverless. Durable Functions gère l’état, les points de contrôle et les redémarrages dans votre application.

Durable Functions prend en charge plusieurs fournisseurs de stockage, également appelés back-ends, pour stocker l’orchestration et l’état d’exécution d’entité. Dans ce guide de démarrage rapide, vous allez créer une application Durable Functions pour utiliser le fournisseur de stockage Microsoft SQL Server (MSSQL) à l’aide de Visual Studio Code.

Ce guide de démarrage rapide crée une application .NET (modèle isolé) à des fins de démonstration. Le contenu fourni dans cet article s’applique à d’autres langues de manière similaire.

Remarque

  • Le backend MSSQL a été conçu pour optimiser la portabilité des applications et le contrôle des données. Il utilise Microsoft SQL Server pour conserver toutes les données du hub de tâches afin d’offrir aux utilisateurs les avantages d’une infrastructure de système de gestion de base de données (SGBD) moderne de niveau entreprise. Pour plus d’informations sur les cas d’usage du fournisseur de stockage MSSQL, consultez la vue d’ensemble des fournisseurs de stockage.

  • La migration des données du hub de tâches entre les fournisseurs de stockage n’est actuellement pas prise en charge. Les applications de fonction comportant déjà des données d’exécution partent d’un nouveau hub de tâches vide après avoir basculé vers le back-end MSSQL. De même, le contenu du hub de tâches créé avec MSSQL ne peut pas être conservé si vous basculez vers un autre fournisseur de stockage.

Prérequis

Pour effectuer ce démarrage rapide, les éléments suivants sont requis :

Créer un projet Azure Functions

Dans Visual Studio Code, créez un projet Azure Functions local.

  1. Dans le menu Affichage, sélectionnez Palette de commandes (ou appuyez sur Ctrl+Maj+P).

  2. À l’invite (>), entrez puis sélectionnez Azure Functions : Créer un projet.

    Capture d’écran montrant la commande pour créer un projet Functions.

  3. Cliquez sur Parcourir. Dans la boîte de dialogue Sélectionner un dossier, accédez à un dossier à utiliser pour votre projet, puis choisissez Sélectionner.

  4. Aux invites, sélectionnez ou entrez les valeurs suivantes :

    Invite Action Descriptif
    Sélectionner un langage pour votre projet d’application de fonction Sélectionner .NET Crée un projet C# Functions local
    Sélectionner un runtime .NET Sélectionnez .NET 8.0 isolé. Crée un projet Functions qui prend en charge .NET 8 s’exécutant dans un processus Worker isolé et le runtime d’Azure Functions 4.0.
    Sélectionner un modèle pour la première fonction de votre projet Sélectionnez Orchestration de Durable Functions. Créez une orchestration Durable Functions.
    Choisir un type de stockage durable Sélectionnez MSSQL. Sélectionne le fournisseur de stockage MSSQL.
    Fournir un nom de fonction Entrez HelloOrchestration. Un nom pour la fonction d’orchestration.
    Spécifiez un espace de noms Entrez Company.Function. Un espace de noms pour la classe générée.
    Sélectionnez la façon dont vous souhaitez ouvrir votre projet Sélectionnez Ouvrir dans la fenêtre actuelle. Ouvre Visual Studio Code dans le dossier que vous avez sélectionné.

Visual Studio Code installe Azure Functions Core Tools s’il est nécessaire pour créer le projet. 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 autre fichier, HelloOrchestration.cs, contient les composants de construction de base d’une application Durable Functions :

Méthode Descriptif
HelloOrchestration Définit l’orchestration de l’application Durable Functions. Dans le cas présent, l’orchestration démarre, crée une liste et ajoute le résultat des trois appels de fonction à la liste. À la fin des trois appels de fonction, elle retourne la liste.
SayHello Une application de fonction simple qui retourne hello. Cette fonction contient la logique métier qui est orchestrée.
HelloOrchestration_HttpStart Une fonction déclenchée par HTTP qui démarre une instance de l’orchestration et retourne une réponse Vérifier l’état.

Pour plus d’informations sur ces fonctions, consultez Types et fonctionnalités de Durable Functions.

Configurer la base de données

Remarque

Si vous disposez déjà d’une base de données compatible MSSQL, vous pouvez ignorer cette section et la sous-section sur la configuration d’une base de données locale basée sur Docker.

Étant donné que le back-end MSSQL est conçu pour la portabilité, vous avez plusieurs options pour configurer votre base de données de sauvegarde. Par exemple, vous pouvez configurer une instance de SQL Server locale, utiliser une instance complètement managée d’Azure SQL Database, ou choisir toute autre option d’hébergement compatible SQL Server.

Vous avez également la possibilité d’effectuer un développement local hors connexion à l’aide de SQL Server Express sur votre ordinateur Windows local, ou de vous servir d’une image Docker SQL Server s’exécutant dans un conteneur Docker.

Ce guide de démarrage rapide est axé sur l’utilisation d’une image Docker SQL Server.

Configurer l’instance de serveur SQL Server locale basée sur Docker

Utilisez les commandes PowerShell suivantes pour configurer une base de données SQL Server locale sur Docker. Vous pouvez installer PowerShell sur Windows, macOS ou Linux.

# primary parameters
$pw        = "yourStrong(!)Password"
$edition   = "Developer"
$port      = 1433
$tag       = "2019-latest"
$dbname    = "DurableDB"
$collation = "Latin1_General_100_BIN2_UTF8"

# pull the image from the Microsoft container registry
docker pull mcr.microsoft.com/mssql/server:$tag

# run the image and provide some basic setup parameters
docker run --name mssql-server -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=$pw" -e "MSSQL_PID=$edition" -p ${port}:1433 -d mcr.microsoft.com/mssql/server:$tag

# wait a few seconds for the container to start...

# create the database with strict binary collation
docker exec -it mssql-server /opt/mssql-tools/bin/sqlcmd -S . -U sa -P "$pw" -Q "CREATE DATABASE [$dbname] COLLATE $collation"

# if sqlcmd is in the mssql-tools18 folder
# docker exec -it mssql-server /opt/mssql-tools18/bin/sqlcmd -C -S . -U sa -P "$pw" -Q "CREATE DATABASE [$dbname] COLLATE $collation"

Vous devriez maintenant avoir un serveur SQL Server en local exécuté sur Docker et à l'écoute sur le port 1443. Si le port 1443 est en conflit avec un autre service, réexécutez ces commandes après avoir modifié la variable $port en une autre valeur.

Pour valider l’installation de votre base de données, interrogez votre nouvelle base de données SQL :

docker exec -it mssql-server /opt/mssql-tools/bin/sqlcmd -S . -U sa -P "$pw" -Q "SELECT name FROM sys.databases"

Si la configuration de la base de données a fonctionné, son nom (par exemple, DurableDB) apparaît en sortie de la ligne de commande :

name

--------------------------------------------------------------
master

tempdb

model

msdb

DurableDB

Remarque

Pour arrêter et supprimer un conteneur en cours d’exécution, vous pouvez exécuter respectivement docker stop <containerName> et docker rm <containerName>. Vous pouvez utiliser ces commandes pour recréer votre conteneur et pour arrêter le conteneur lorsque vous avez terminé ce guide de démarrage rapide. Pour obtenir de l’aide, exécutez docker --help.

Résolution des problèmes

Si vous rencontrez « Réponse d’erreur à partir du démon : échec de l’exécution du runtime OCI » lors de l’exécution docker exec pour créer la base de données, il est probable que le dossier /opt/mssql-tools/bin/sqlcmd n’existe pas. Ouvrez Docker Desktop, sélectionnez votre conteneur Docker SQL Server, sélectionnez Fichiers, puis recherchez le dossier mssql-tools. Vérifiez si ce dossier a un nom différent, tel que /opt/mssql-tools18/bin/sqlcmd. Mettez à jour la commande en conséquence.

Dans ODBC Driver 18 pour SQL Server, l’option Chiffrer la connexion a la valeur true par défaut. Si vous rencontrez « error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate » lors de l’exécution de docker exec pour effectuer des opérations de base de données, ajoutez -C, ce qui équivaut à l’option ADO.net TRUSTSERVERCERTIFICATE = true.

Ajouter une chaîne de connexion SQL à local.settings.json

Le serveur principal MSSQL a besoin d’une chaîne de connexion pour accéder à votre base de données. La procédure à suivre pour obtenir cette chaîne de connexion dépend principalement du fournisseur de serveur MSSQL.

Si vous utilisez les commandes Docker précédentes sans modifier aucun paramètre, votre chaîne de connexion est :

Server=localhost,1433;Database=DurableDB;User Id=sa;Password=yourStrong(!)Password;

Dans local.settings.json, affectez la chaîne de connexion de l’instance de serveur SQL basée sur Docker à SQLDB_Connection. Cette variable a été ajoutée par Visual Studio Code lorsque vous avez choisi MSSQL comme back-end pour votre application Durable Functions :

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true", 
    "SQLDB_Connection": "Server=localhost,1433;Database=DurableDB;User Id=sa;Password=yourStrong(!)Password;",
    "FUNCTIONS_WORKER_RUNTIME": "<dependent on your programming language>"
  }
}

Tester les topologies localement

Ouvrez une fenêtre de terminal dans le dossier racine de votre application et exécutez azurite start. Azurite est l’émulateur stockage Azure, qui est nécessaire pour exécuter n’importe quelle application de fonction.

Ouvrez une autre fenêtre de terminal dans le dossier racine de votre application et démarrez l’application de fonction en exécutant func host start.

  1. Dans la fenêtre de terminal, copiez le point de terminaison d’URL de votre fonction déclenchée par HTTP.

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

  2. Utilisez un outil de test HTTP pour envoyer une requête POST HTTP au point de terminaison d’URL.

    La réponse est le résultat initial de la fonction HTTP. Vous pouvez ainsi savoir que l’orchestration de Durable Functions a démarré correctement. Elle n’affiche pas encore le résultat final de l’orchestration. La réponse contient plusieurs URL utiles.

  3. Copiez la valeur de l’URL pour statusQueryGetUri, collez-la dans la barre d’adresse de votre navigateur, puis exécutez la requête. Vous pouvez également continuer à utiliser l’outil de test HTTP pour émettre la requête GET.

    La requête interroge l’instance d’orchestration pour obtenir l’état. Vous devez voir que l’instance s’est terminée, et qu’elle inclut les sorties ou les résultats de l’application Durable Functions comme dans cet exemple :

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

Exécuter l’application dans Azure

Pour exécuter votre application dans Azure, vous devez créer différentes ressources. Pour simplifier le nettoyage ultérieur, créez toutes les ressources dans le même groupe de ressources.

Création d’une base de données Azure SQL

Remarque

Si vous disposez déjà d’une base de données Azure SQL ou d’une autre instance de SQL Server accessible publiquement que vous souhaitez utiliser, vous pouvez passer à la section suivante.

Évitez d’autoriser les services et ressources Azure à accéder à ce paramètre de serveur [SQL] pour les scénarios de production. Les applications réelles doivent implémenter des approches plus sécurisées, telles que des restrictions de pare-feu ou des configurations de réseau virtuel plus strictes.

Dans le portail Azure, vous pouvez créer une base de données Azure SQL. Lors de la création :

  • Activer les services et ressources Azure pour accéder à ce serveur (sous Mise en réseau)
  • Définissez la valeur du classement de base de données (sous Paramètres supplémentaires) sur Latin1_General_100_BIN2_UTF8.

Créer une application Azure Functions et des ressources de prise en charge

  1. Ouvrez une fenêtre de terminal et connectez-vous à Azure :

    az login
    
  2. Créez les ressources suivantes dans le même groupe de ressources et la même région que votre base de données SQL :

    • Un compte de stockage à usage général, utilisé pour stocker des données d’application importantes, telles que le code de l’application lui-même. Les noms de compte de stockage doivent contenir trois à 24 caractères et des lettres minuscules uniquement.
    • Un plan d’application de fonction Premium
    • Une application de fonction
    # Variables
    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    planName=<PREMIUM_PLAN_NAME>
    functionApp=<APP_NAME>
    skuStorage="Standard_LRS"
    skuPlan="EP1"
    functionsVersion="4"
    
    # Create an Azure storage account
    echo "Creating $storage"
    az storage account create --name $storage --location "$location" --resource-group $resourceGroup --sku $skuStorage --allow-blob-public-access false
    
    # Create a premium plan
    echo "Creating $premiumPlan"
    az functionapp plan create --name $planName --resource-group $resourceGroup --location "$location" --sku $skuPlan
    
    # Create a function app hosted in the premium plan
    echo "Creating $functionApp"
    az functionapp create --name $functionApp --storage-account $storage --plan $planName --resource-group $resourceGroup --functions-version $functionsVersion
    

Créer une identité managée Azure

Les identités managées sécurisent votre application en éliminant les secrets de votre application, tels que les informations d’identification dans les chaînes de connexion. Vous pouvez choisir entre l’identité managée affectée par le système et l’identité managée affectée par l’utilisateur. Ce guide de démarrage rapide illustre la configuration de l’identité managée affectée par l’utilisateur, qui est l’option recommandée, car elle n’est pas liée au cycle de vie de l’application.

Les commandes suivantes créent la ressource d’identité et l’attribuent à l’application :

# Variables
subscription=<SUBSCRIPTION_ID>
identity=<IDENTITY_NAME>

# Create a managed identity resource
echo "Creating $identity"
az identity create -g $resourceGroup -n $identity --location "$location"

# Construct the identity resource ID 
resourceId="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identity"

# Assign the identity to the Azure Functions app
echo "Assigning $identity to app"
az functionapp identity assign -g $resourceGroup -n $functionApp --identities "$resourceId"

# Get the identity's ClientId and PrincipalId (also called ObjectId) for a later step. 
clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)

principalId=$(az identity show --name $identity --resource-group $resourceGroup --query 'principalId' --output tsv)

Accorder l’accès au stockage Azure et à Azure SQL Database

Stockage Azure

Attribuez le rôle Propriétaire des données blob du stockage d’identité pour l’accès au compte de stockage.

# Set the scope of the access
scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"

# Assign the role
echo "Assign Storage Blob Data Owner role to identity"
az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"

Azure SQL Database

Remarque

L’authentification auprès d’Azure SQL Database à l’aide d’une identité managée n’est pas prise en charge lors de l’hébergement d’une application Durable Functions dans le plan Flex Consumption. Si votre application est hébergée dans le plan Flex Consumption, passez à la section définir les paramètres de l’application .

  1. Commencez par définir l’identité de votre développeur en tant qu’administrateur de la base de données.

    Le destinataire étant votre identité, passez à votre adresse e-mail :

    assignee=$(az ad user show --id "someone@example.com" --query "id" --output tsv)
    

    Définissez l'assigné comme administrateur de la base de données Azure SQL :

    az sql server ad-admin create --resource-group $resourceGroup --server-name <SQL_SERVER_NAME> --display-name ADMIN --object-id "$assignee"
    
  2. Connectez-vous à la base de données SQL créée précédemment à l’aide d’outils tels qu’Azure Data Studio ou SQL Management Server Studio. Vous pouvez également exécuter la commande SQLCMD suivante pour vous connecter :

    sqlcmd -S <SQL_SERVER_NAME>.database.windows.net -d <DATABASE_NAME> -U <someone@example.com> -P "ACCOUNT_PASSWORD" -G -l 30
    

    Accordez à votre identité db_owner l’accès en exécutant la requête suivante sur la base de données. IDENTITY_OBJECT_ID est le PrincipalId de l’étape de création d’identité.

    CREATE USER "<IDENTITY_NAME>" FROM EXTERNAL PROVIDER With OBJECT_ID='<IDENTITY_OBJECT_ID>'
    ALTER ROLE db_owner ADD MEMBER "<IDENTITY_NAME>";
    GO
    
  3. Connectez-vous à la base de données master et accordez à votre identité l’accès à dbmanager :

    CREATE USER "<IDENTITY_NAME>" FROM EXTERNAL PROVIDER With OBJECT_ID='<IDENTITY_OBJECT_ID>'
    ALTER ROLE dbmanager ADD MEMBER "<IDENTITY_NAME>";
    GO
    

Définir les paramètres de l’application obligatoires

Vous devez ajouter les paramètres d’application suivants à votre application :

  • AzureWebJobsStorage__accountName: Nom du compte stockage Azure
  • AzureWebJobsStorage__clientId: ClientId de l’identité managée
  • AzureWebJobsStorage__credential : type d’informations d’identification, à savoir managedidentity
  • SQLDB_Connection: chaîne de connexion de base de données SQL

Si vous utilisez l’identité managée affectée par l’utilisateur pour vous authentifier auprès de la base de données SQL, la chaîne de connexion doit ressembler à ce qui suit :

dbserver=<SQL_SERVER_NAME>
sqlDB=<SQL_DB_NAME>
clientId=<IDENTITY_CLIENT_ID>

sqlconnstr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$clientId;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication='Active Directory Managed Identity';"

Pour les applications Flex Consumption, utilisez une chaîne de connexion pour s’authentifier pour l’instant. Vous pouvez le trouver en accédant à la ressource de base de données SQL sur le portail Azure, en accédant à l’onglet Paramètres , puis en cliquant sur Chaînes de connexion :

Capture d’écran montrant la chaîne de connexion de base de données.

La chaîne de connexion doit avoir ce format :

dbserver=<SQL_SERVER_NAME>
sqlDB=<SQL_DB_NAME>
username=<DB_USER_LOGIN>
password=<DB_USER_PASSWORD>

sqlconnstr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"

Exécutez la commande suivante pour définir les paramètres :

az functionapp config appsettings set --name $functionApp --resource-group $resourceGroup --settings AzureWebJobsStorage__accountName="$storage" AzureWebJobsStorage__clientId="$clientId" AzureWebJobsStorage__credential="managedidentity" SQLDB_Connection=$sqlconnstr

Supprimez le paramètre existant AzureWebJobsStorage :

az functionapp config appsettings delete --name $functionApp --resource-group $resourceGroup --setting-names "AzureWebJobsStorage"

Déployer le projet local sur Azure et tester

Enfin, dans votre dossier de projet racine, déployez votre application sur Azure en exécutant :

func azure functionapp publish $functionApp

Une fois le déploiement terminé, exécutez ce qui suit pour obtenir l’URL du déclencheur HTTP :

az functionapp function list --resource-group $resourceGroup --name $functionApp  --query '[].{Function:name, URL:invokeUrlTemplate}' --output json

Testez comme vous l’avez fait lors du développement local avec un outil de test HTTP.

Vous pouvez également vérifier que le serveur principal MSSQL est correctement configuré en interrogeant la base de données pour les données du hub de tâches.

Par exemple, vous pouvez interroger vos instances d’orchestration dans le volet de vue d’ensemble de votre base de données SQL. Sélectionnez l’Éditeur de requête, authentifiez-vous, puis exécutez la requête suivante :

SELECT TOP 5 InstanceID, RuntimeStatus, CreatedTime, CompletedTime FROM dt.Instances

Après avoir exécuté un orchestrateur simple, vous devriez voir au moins un résultat, comme illustré dans cet exemple :

Capture d’écran montrant les résultats de l’Éditeur de requête Azure SQL pour la requête SQL.

Étapes suivantes