azure-resource-manager-durabletask-dotnet

npx skills add https://github.com/microsoft/skills --skill azure-resource-manager-durabletask-dotnet

Azure.ResourceManager.DurableTask (.NET)

SDK du plan de gestion pour provisionner et gérer les ressources Azure Durable Task Scheduler via Azure Resource Manager.

⚠️ Plan de gestion vs plan de données

  • Ce SDK (Azure.ResourceManager.DurableTask) : Créer des planificateurs, des task hubs, configurer les politiques de rétention
  • SDK plan de données (Microsoft.DurableTask.Client.AzureManaged) : Démarrer des orchestrations, interroger les instances, envoyer des événements

Installation

dotnet add package Azure.ResourceManager.DurableTask
dotnet add package Azure.Identity

Versions actuelles : Stable v1.0.0 (2025-11-03), Preview v1.0.0-beta.1 (2025-04-24) Version API : 2025-11-01

Variables d'environnement

AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_RESOURCE_GROUP=<your-resource-group>
# Pour l'authentification par service principal (optionnel)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>

Authentification

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.DurableTask;

// Utiliser toujours DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);

// Récupérer l'abonnement
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
    new ResourceIdentifier($"/subscriptions/{subscriptionId}"));

Hiérarchie des ressources

ArmClient
└── SubscriptionResource
    └── ResourceGroupResource
        └── DurableTaskSchedulerResource
            ├── DurableTaskHubResource
            └── DurableTaskRetentionPolicyResource

Flux de travail principal

1. Créer un Durable Task Scheduler

using Azure.ResourceManager.DurableTask;
using Azure.ResourceManager.DurableTask.Models;

// Récupérer le groupe de ressources
var resourceGroup = await subscription
    .GetResourceGroupAsync("my-resource-group");

// Définir le planificateur avec une SKU Dedicated
var schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
    Properties = new DurableTaskSchedulerProperties
    {
        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
        {
            Capacity = 1  // Nombre d'instances
        },
        // Optionnel : liste d'IP autorisées pour la sécurité réseau
        IPAllowlist = { "10.0.0.0/24", "192.168.1.0/24" }
    }
};

// Créer le planificateur (opération longue)
var schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();
var operation = await schedulerCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-scheduler",
    schedulerData);

DurableTaskSchedulerResource scheduler = operation.Value;
Console.WriteLine($"Scheduler créé : {scheduler.Data.Name}");
Console.WriteLine($"Endpoint : {scheduler.Data.Properties.Endpoint}");

2. Créer un planificateur avec une SKU Consumption

// SKU Consumption (serverless)
var consumptionSchedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
    Properties = new DurableTaskSchedulerProperties
    {
        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Consumption)
        // Aucune capacité nécessaire pour consumption
    }
};

var operation = await schedulerCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-serverless-scheduler",
    consumptionSchedulerData);

3. Créer un Task Hub

// Les task hubs sont créés sous un planificateur
var taskHubData = new DurableTaskHubData
{
    // Les propriétés sont optionnelles pour un task hub simple
};

var taskHubCollection = scheduler.GetDurableTaskHubs();
var hubOperation = await taskHubCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-taskhub",
    taskHubData);

DurableTaskHubResource taskHub = hubOperation.Value;
Console.WriteLine($"Task Hub créé : {taskHub.Data.Name}");

4. Lister les planificateurs

// Lister tous les planificateurs de l'abonnement
await foreach (var sched in subscription.GetDurableTaskSchedulersAsync())
{
    Console.WriteLine($"Planificateur : {sched.Data.Name}");
    Console.WriteLine($"  Localisation : {sched.Data.Location}");
    Console.WriteLine($"  SKU : {sched.Data.Properties.Sku?.Name}");
    Console.WriteLine($"  Endpoint : {sched.Data.Properties.Endpoint}");
}

// Lister les planificateurs dans le groupe de ressources
var schedulers = resourceGroup.Value.GetDurableTaskSchedulers();
await foreach (var sched in schedulers.GetAllAsync())
{
    Console.WriteLine($"Planificateur : {sched.Data.Name}");
}

5. Récupérer un planificateur par nom

// Récupérer un planificateur existant
var existingScheduler = await schedulerCollection.GetAsync("my-scheduler");
Console.WriteLine($"Trouvé : {existingScheduler.Value.Data.Name}");

// Ou utiliser la méthode d'extension
var schedulerResource = armClient.GetDurableTaskSchedulerResource(
    DurableTaskSchedulerResource.CreateResourceIdentifier(
        subscriptionId,
        "my-resource-group",
        "my-scheduler"));
var scheduler = await schedulerResource.GetAsync();

6. Mettre à jour un planificateur

// Récupérer le planificateur actuel
var scheduler = await schedulerCollection.GetAsync("my-scheduler");

// Mettre à jour avec une nouvelle configuration
var updateData = new DurableTaskSchedulerData(scheduler.Value.Data.Location)
{
    Properties = new DurableTaskSchedulerProperties
    {
        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
        {
            Capacity = 2  // Augmenter l'échelle
        },
        IPAllowlist = { "10.0.0.0/16" }  // Mettre à jour la liste d'IP autorisées
    }
};

var updateOperation = await schedulerCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-scheduler",
    updateData);

7. Supprimer des ressources

// Supprimer d'abord le task hub
var taskHub = await scheduler.GetDurableTaskHubs().GetAsync("my-taskhub");
await taskHub.Value.DeleteAsync(WaitUntil.Completed);

// Puis supprimer le planificateur
await scheduler.DeleteAsync(WaitUntil.Completed);

8. Gérer les politiques de rétention

// Récupérer la collection de politiques de rétention
var retentionPolicies = scheduler.GetDurableTaskRetentionPolicies();

// Créer ou mettre à jour une politique de rétention
var retentionData = new DurableTaskRetentionPolicyData
{
    Properties = new DurableTaskRetentionPolicyProperties
    {
        // Configurer les paramètres de rétention
    }
};

var retentionOperation = await retentionPolicies.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "default",  // Nom de la politique
    retentionData);

Référence des types clés

Type Objectif
ArmClient Point d'entrée pour toutes les opérations ARM
DurableTaskSchedulerResource Représente un Durable Task Scheduler
DurableTaskSchedulerCollection Collection pour les opérations CRUD sur les planificateurs
DurableTaskSchedulerData Payload de création/mise à jour du planificateur
DurableTaskSchedulerProperties Configuration du planificateur (SKU, IPAllowlist)
DurableTaskSchedulerSku Configuration SKU (Name, Capacity, RedundancyState)
DurableTaskSchedulerSkuName Options SKU : Dedicated, Consumption
DurableTaskHubResource Représente un Task Hub
DurableTaskHubCollection Collection pour les opérations CRUD sur les task hubs
DurableTaskHubData Payload de création du task hub
DurableTaskRetentionPolicyResource Gestion des politiques de rétention
DurableTaskRetentionPolicyData Configuration des politiques de rétention
DurableTaskExtensions Méthodes d'extension pour le client ARM

Options SKU

SKU Description Cas d'usage
Dedicated Capacité fixe avec instances configurables Charges de travail en production, performances prévisibles
Consumption Serverless, mise à l'échelle automatique Développement, charges de travail variables

Méthodes d'extension

Le SDK fournit des méthodes d'extension sur SubscriptionResource et ResourceGroupResource :

// Sur SubscriptionResource
subscription.GetDurableTaskSchedulers();           // Lister tous dans l'abonnement
subscription.GetDurableTaskSchedulersAsync();      // Énumération asynchrone

// Sur ResourceGroupResource  
resourceGroup.GetDurableTaskSchedulers();          // Récupérer la collection
resourceGroup.GetDurableTaskSchedulerAsync(name);  // Récupérer par nom

// Sur ArmClient
armClient.GetDurableTaskSchedulerResource(id);     // Récupérer par ID de ressource
armClient.GetDurableTaskHubResource(id);           // Récupérer le task hub par ID

Bonnes pratiques

  1. Utiliser WaitUntil.Completed pour les opérations qui doivent se terminer avant de continuer
  2. Utiliser WaitUntil.Started quand on veut interroger manuellement ou exécuter les opérations en parallèle
  3. Toujours utiliser DefaultAzureCredential — ne jamais encoder les clés en dur
  4. Gérer RequestFailedException pour les erreurs de l'API ARM
  5. Utiliser CreateOrUpdateAsync pour les opérations idempotentes
  6. Supprimer les task hubs avant les planificateurs — les planificateurs avec task hubs ne peuvent pas être supprimés
  7. Utiliser les listes d'IP autorisées pour la sécurité réseau en production

Gestion des erreurs

using Azure;

try
{
    var operation = await schedulerCollection.CreateOrUpdateAsync(
        WaitUntil.Completed, schedulerName, schedulerData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
    Console.WriteLine("Le planificateur existe déjà");
}
catch (RequestFailedException ex) when (ex.Status == 404)
{
    Console.WriteLine("Groupe de ressources introuvable");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Erreur ARM : {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}

Exemple complet

using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.DurableTask;
using Azure.ResourceManager.DurableTask.Models;
using Azure.ResourceManager.Resources;

// Configuration
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);

var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID")!;
var resourceGroupName = Environment.GetEnvironmentVariable("AZURE_RESOURCE_GROUP")!;

var subscription = armClient.GetSubscriptionResource(
    new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
var resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);

// Créer le planificateur
var schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
    Properties = new DurableTaskSchedulerProperties
    {
        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
        {
            Capacity = 1
        }
    }
};

var schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();
var schedulerOp = await schedulerCollection.CreateOrUpdateAsync(
    WaitUntil.Completed, "my-scheduler", schedulerData);
var scheduler = schedulerOp.Value;

Console.WriteLine($"Endpoint du planificateur : {scheduler.Data.Properties.Endpoint}");

// Créer le task hub
var taskHubData = new DurableTaskHubData();
var taskHubOp = await scheduler.GetDurableTaskHubs().CreateOrUpdateAsync(
    WaitUntil.Completed, "my-taskhub", taskHubData);
var taskHub = taskHubOp.Value;

Console.WriteLine($"Task Hub : {taskHub.Data.Name}");

// Nettoyage
await taskHub.DeleteAsync(WaitUntil.Completed);
await scheduler.DeleteAsync(WaitUntil.Completed);

SDK associés

SDK Objectif Installation
Azure.ResourceManager.DurableTask Plan de gestion (ce SDK) dotnet add package Azure.ResourceManager.DurableTask
Microsoft.DurableTask.Client.AzureManaged Plan de données (orchestrations, activités) dotnet add package Microsoft.DurableTask.Client.AzureManaged
Microsoft.DurableTask.Worker.AzureManaged Worker pour exécuter les orchestrations dotnet add package Microsoft.DurableTask.Worker.AzureManaged
Azure.Identity Authentification dotnet add package Azure.Identity
Azure.ResourceManager SDK ARM de base dotnet add package Azure.ResourceManager

Référence source

Skills similaires