azure-resource-manager-sql-dotnet

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

Azure.ResourceManager.Sql (.NET)

SDK du plan de gestion pour le provisionnement et la gestion des ressources Azure SQL via Azure Resource Manager.

⚠️ Plan de gestion vs Plan de données

  • Ce SDK (Azure.ResourceManager.Sql) : Créer des serveurs, des bases de données, des pools élastiques, configurer les règles de pare-feu, gérer les groupes de basculement
  • SDK Plan de données (Microsoft.Data.SqlClient) : Exécuter des requêtes, des procédures stockées, gérer les connexions

Installation

dotnet add package Azure.ResourceManager.Sql
dotnet add package Azure.Identity

Versions actuelles : Stable v1.3.0, Aperçu v1.4.0-beta.3

Variables d'environnement

AZURE_SUBSCRIPTION_ID=<your-subscription-id>
# Pour l'authentification par principal de service (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.Sql;

// Toujours utiliser DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);

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

Hiérarchie des ressources

ArmClient
└── SubscriptionResource
    └── ResourceGroupResource
        └── SqlServerResource
            ├── SqlDatabaseResource
            ├── ElasticPoolResource
            │   └── ElasticPoolDatabaseResource
            ├── SqlFirewallRuleResource
            ├── FailoverGroupResource
            ├── ServerBlobAuditingPolicyResource
            ├── EncryptionProtectorResource
            └── VirtualNetworkRuleResource

Flux de travail principal

1. Créer un serveur SQL

using Azure.ResourceManager.Sql;
using Azure.ResourceManager.Sql.Models;

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

// Définir le serveur
var serverData = new SqlServerData(AzureLocation.EastUS)
{
    AdministratorLogin = "sqladmin",
    AdministratorLoginPassword = "YourSecurePassword123!",
    Version = "12.0",
    MinimalTlsVersion = SqlMinimalTlsVersion.Tls1_2,
    PublicNetworkAccess = ServerNetworkAccessFlag.Enabled
};

// Créer le serveur (opération de longue durée)
var serverCollection = resourceGroup.Value.GetSqlServers();
var operation = await serverCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-sql-server",
    serverData);

SqlServerResource server = operation.Value;

2. Créer une base de données SQL

var databaseData = new SqlDatabaseData(AzureLocation.EastUS)
{
    Sku = new SqlSku("S0") { Tier = "Standard" },
    MaxSizeBytes = 2L * 1024 * 1024 * 1024, // 2 GB
    Collation = "SQL_Latin1_General_CP1_CI_AS",
    RequestedBackupStorageRedundancy = SqlBackupStorageRedundancy.Local
};

var databaseCollection = server.GetSqlDatabases();
var dbOperation = await databaseCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-database",
    databaseData);

SqlDatabaseResource database = dbOperation.Value;

3. Créer un pool élastique

var poolData = new ElasticPoolData(AzureLocation.EastUS)
{
    Sku = new SqlSku("StandardPool")
    {
        Tier = "Standard",
        Capacity = 100 // 100 eDTUs
    },
    PerDatabaseSettings = new ElasticPoolPerDatabaseSettings
    {
        MinCapacity = 0,
        MaxCapacity = 100
    }
};

var poolCollection = server.GetElasticPools();
var poolOperation = await poolCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-elastic-pool",
    poolData);

ElasticPoolResource pool = poolOperation.Value;

4. Ajouter une base de données à un pool élastique

var databaseData = new SqlDatabaseData(AzureLocation.EastUS)
{
    ElasticPoolId = pool.Id
};

await databaseCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "pooled-database",
    databaseData);

5. Configurer les règles de pare-feu

// Autoriser les services Azure
var azureServicesRule = new SqlFirewallRuleData
{
    StartIPAddress = "0.0.0.0",
    EndIPAddress = "0.0.0.0"
};

var firewallCollection = server.GetSqlFirewallRules();
await firewallCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "AllowAzureServices",
    azureServicesRule);

// Autoriser une plage d'adresses IP spécifique
var clientRule = new SqlFirewallRuleData
{
    StartIPAddress = "203.0.113.0",
    EndIPAddress = "203.0.113.255"
};

await firewallCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "AllowClientIPs",
    clientRule);

6. Lister les ressources

// Lister tous les serveurs dans l'abonnement
await foreach (var srv in subscription.GetSqlServersAsync())
{
    Console.WriteLine($"Server: {srv.Data.Name} in {srv.Data.Location}");
}

// Lister les bases de données dans un serveur
await foreach (var db in server.GetSqlDatabases())
{
    Console.WriteLine($"Database: {db.Data.Name}, SKU: {db.Data.Sku?.Name}");
}

// Lister les pools élastiques
await foreach (var ep in server.GetElasticPools())
{
    Console.WriteLine($"Pool: {ep.Data.Name}, DTU: {ep.Data.Sku?.Capacity}");
}

7. Obtenir la chaîne de connexion

// Construire la chaîne de connexion (le FQDN du serveur est prévisible)
var serverFqdn = $"{server.Data.Name}.database.windows.net";
var connectionString = $"Server=tcp:{serverFqdn},1433;" +
    $"Initial Catalog={database.Data.Name};" +
    "Persist Security Info=False;" +
    $"User ID={server.Data.AdministratorLogin};" +
    "Password=<your-password>;" +
    "MultipleActiveResultSets=False;" +
    "Encrypt=True;" +
    "TrustServerCertificate=False;" +
    "Connection Timeout=30;";

Référence des types clés

Type Objectif
ArmClient Point d'entrée pour toutes les opérations ARM
SqlServerResource Représente un serveur Azure SQL
SqlServerCollection Collection pour les opérations CRUD de serveur
SqlDatabaseResource Représente une base de données SQL
SqlDatabaseCollection Collection pour les opérations CRUD de base de données
ElasticPoolResource Représente un pool élastique
ElasticPoolCollection Collection pour les opérations CRUD de pool élastique
SqlFirewallRuleResource Représente une règle de pare-feu
SqlFirewallRuleCollection Collection pour les opérations CRUD de règle de pare-feu
SqlServerData Charge utile pour la création/mise à jour du serveur
SqlDatabaseData Charge utile pour la création/mise à jour de base de données
ElasticPoolData Charge utile pour la création/mise à jour de pool élastique
SqlFirewallRuleData Charge utile pour la création/mise à jour de règle de pare-feu
SqlSku Configuration de la SKU (tier, capacité)

SKUs courants

SKUs de base de données

Nom de SKU Tier Description
Basic Basic 5 DTUs, max 2 GB
S0-S12 Standard 10-3 000 DTUs
P1-P15 Premium 125-4 000 DTUs
GP_Gen5_2 GeneralPurpose Basé sur vCore, 2 vCores
BC_Gen5_2 BusinessCritical Basé sur vCore, 2 vCores
HS_Gen5_2 Hyperscale Basé sur vCore, 2 vCores

SKUs de pool élastique

Nom de SKU Tier Description
BasicPool Basic 50-1 600 eDTUs
StandardPool Standard 50-3 000 eDTUs
PremiumPool Premium 125-4 000 eDTUs
GP_Gen5_2 GeneralPurpose Basé sur vCore
BC_Gen5_2 BusinessCritical Basé sur vCore

Bonnes pratiques

  1. Utiliser WaitUntil.Completed pour les opérations qui doivent se terminer avant de continuer
  2. Utiliser WaitUntil.Started quand vous souhaitez interroger manuellement ou exécuter les opérations en parallèle
  3. Toujours utiliser DefaultAzureCredential — ne jamais coder en dur les mots de passe en production
  4. Gérer RequestFailedException pour les erreurs API ARM
  5. Utiliser CreateOrUpdateAsync pour les opérations idempotentes
  6. Naviguer dans la hiérarchie via les méthodes Get* (par ex. server.GetSqlDatabases())
  7. Utiliser les pools élastiques pour l'optimisation des coûts lors de la gestion de plusieurs bases de données
  8. Configurer les règles de pare-feu avant de tenter les connexions

Gestion des erreurs

using Azure;

try
{
    var operation = await serverCollection.CreateOrUpdateAsync(
        WaitUntil.Completed, serverName, serverData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
    Console.WriteLine("Server already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
    Console.WriteLine($"Invalid request: {ex.Message}");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}

Fichiers de référence

Fichier Quand lire
references/server-management.md CRUD serveur, identifiants admin, authentification Azure AD, mise en réseau
references/database-operations.md CRUD base de données, mise à l'échelle, sauvegarde, restauration, copie
references/elastic-pools.md Gestion de pools, ajout/suppression de bases de données, mise à l'échelle

SDKs associés

SDK Objectif Installation
Microsoft.Data.SqlClient Plan de données (exécuter des requêtes, des procédures stockées) dotnet add package Microsoft.Data.SqlClient
Azure.ResourceManager.Sql Plan de gestion (ce SDK) dotnet add package Azure.ResourceManager.Sql
Microsoft.EntityFrameworkCore.SqlServer ORM pour SQL Server dotnet add package Microsoft.EntityFrameworkCore.SqlServer

Skills similaires