Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
Extension Visual Studio Code Azure Functions installée.
La version la plus récente d’Azure Functions Core Tools installée.
Docker installé.
Un abonnement Azure.
Un outil de test HTTP qui garde vos données en sécurité. Pour découvrir plus d’informations, consultez Outils de test HTTP.
Créer un projet Azure Functions
Dans Visual Studio Code, créez un projet Azure Functions local.
Dans le menu Affichage, sélectionnez Palette de commandes (ou appuyez sur Ctrl+Maj+P).
À l’invite (
>), entrez puis sélectionnez Azure Functions : Créer un projet.
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.
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.
Dans la fenêtre de terminal, copiez le point de terminaison d’URL de votre fonction déclenchée par HTTP.
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.
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
Ouvrez une fenêtre de terminal et connectez-vous à Azure :
az loginCré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 .
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"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 30Accordez à votre identité db_owner l’accès en exécutant la requête suivante sur la base de données.
IDENTITY_OBJECT_IDest 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>"; GOConnectez-vous à la base de données
masteret 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 :
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 :
Étapes suivantes
- Héberger une application Durable Functions à l’aide du serveur principal MSSQL dans Azure Container Apps.
- Pour plus d’informations sur l’architecture, la configuration et le comportement de la charge de travail de ce serveur principal, consultez la documentation du fournisseur de stockage MSSQL .