azure-resource-manager-mysql-dotnet

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

Azure.ResourceManager.MySql (.NET)

SDK Azure Resource Manager pour gérer les déploiements MySQL Flexible Server.

Installation

dotnet add package Azure.ResourceManager.MySql
dotnet add package Azure.Identity

Version actuelle : v1.2.0 (GA)
Version API : 2023-12-30

Note : Ce skill se concentre sur MySQL Flexible Server. Single Server est déprécié et programmé pour être retiré.

Variables d'environnement

AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_RESOURCE_GROUP=<your-resource-group>
AZURE_MYSQL_SERVER_NAME=<your-mysql-server>

Authentification

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.MySql;
using Azure.ResourceManager.MySql.FlexibleServers;

ArmClient client = new ArmClient(new DefaultAzureCredential());

Hiérarchie des ressources

Subscription
└── ResourceGroup
    └── MySqlFlexibleServer                 # Instance MySQL Flexible Server
        ├── MySqlFlexibleServerDatabase     # Base de données au sein du serveur
        ├── MySqlFlexibleServerFirewallRule # Règles de pare-feu IP
        ├── MySqlFlexibleServerConfiguration # Paramètres du serveur
        ├── MySqlFlexibleServerBackup       # Informations de sauvegarde
        ├── MySqlFlexibleServerMaintenanceWindow # Fenêtre de maintenance
        └── MySqlFlexibleServerAadAdministrator # Admin Entra ID

Workflows principaux

1. Créer MySQL Flexible Server

using Azure.ResourceManager.MySql.FlexibleServers;
using Azure.ResourceManager.MySql.FlexibleServers.Models;

ResourceGroupResource resourceGroup = await client
    .GetDefaultSubscriptionAsync()
    .Result
    .GetResourceGroupAsync("my-resource-group");

MySqlFlexibleServerCollection servers = resourceGroup.GetMySqlFlexibleServers();

MySqlFlexibleServerData data = new MySqlFlexibleServerData(AzureLocation.EastUS)
{
    Sku = new MySqlFlexibleServerSku("Standard_D2ds_v4", MySqlFlexibleServerSkuTier.GeneralPurpose),
    AdministratorLogin = "mysqladmin",
    AdministratorLoginPassword = "YourSecurePassword123!",
    Version = MySqlFlexibleServerVersion.Ver8_0_21,
    Storage = new MySqlFlexibleServerStorage
    {
        StorageSizeInGB = 128,
        AutoGrow = MySqlFlexibleServerEnableStatusEnum.Enabled,
        Iops = 3000
    },
    Backup = new MySqlFlexibleServerBackupProperties
    {
        BackupRetentionDays = 7,
        GeoRedundantBackup = MySqlFlexibleServerEnableStatusEnum.Disabled
    },
    HighAvailability = new MySqlFlexibleServerHighAvailability
    {
        Mode = MySqlFlexibleServerHighAvailabilityMode.ZoneRedundant,
        StandbyAvailabilityZone = "2"
    },
    AvailabilityZone = "1"
};

ArmOperation<MySqlFlexibleServerResource> operation = await servers
    .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql-server", data);

MySqlFlexibleServerResource server = operation.Value;
Console.WriteLine($"Server created: {server.Data.FullyQualifiedDomainName}");

2. Créer une base de données

MySqlFlexibleServerResource server = await resourceGroup
    .GetMySqlFlexibleServerAsync("my-mysql-server");

MySqlFlexibleServerDatabaseCollection databases = server.GetMySqlFlexibleServerDatabases();

MySqlFlexibleServerDatabaseData dbData = new MySqlFlexibleServerDatabaseData
{
    Charset = "utf8mb4",
    Collation = "utf8mb4_unicode_ci"
};

ArmOperation<MySqlFlexibleServerDatabaseResource> operation = await databases
    .CreateOrUpdateAsync(WaitUntil.Completed, "myappdb", dbData);

MySqlFlexibleServerDatabaseResource database = operation.Value;
Console.WriteLine($"Database created: {database.Data.Name}");

3. Configurer les règles de pare-feu

MySqlFlexibleServerFirewallRuleCollection firewallRules = server.GetMySqlFlexibleServerFirewallRules();

// Autoriser une plage d'adresses IP spécifique
MySqlFlexibleServerFirewallRuleData ruleData = new MySqlFlexibleServerFirewallRuleData
{
    StartIPAddress = System.Net.IPAddress.Parse("10.0.0.1"),
    EndIPAddress = System.Net.IPAddress.Parse("10.0.0.255")
};

ArmOperation<MySqlFlexibleServerFirewallRuleResource> operation = await firewallRules
    .CreateOrUpdateAsync(WaitUntil.Completed, "allow-internal", ruleData);

// Autoriser les services Azure
MySqlFlexibleServerFirewallRuleData azureServicesRule = new MySqlFlexibleServerFirewallRuleData
{
    StartIPAddress = System.Net.IPAddress.Parse("0.0.0.0"),
    EndIPAddress = System.Net.IPAddress.Parse("0.0.0.0")
};

await firewallRules.CreateOrUpdateAsync(WaitUntil.Completed, "AllowAllAzureServicesAndResourcesWithinAzureIps", azureServicesRule);

4. Mettre à jour la configuration du serveur

MySqlFlexibleServerConfigurationCollection configurations = server.GetMySqlFlexibleServerConfigurations();

// Obtenir la configuration actuelle
MySqlFlexibleServerConfigurationResource config = await configurations
    .GetAsync("max_connections");

// Mettre à jour la configuration
MySqlFlexibleServerConfigurationData configData = new MySqlFlexibleServerConfigurationData
{
    Value = "500",
    Source = MySqlFlexibleServerConfigurationSource.UserOverride
};

ArmOperation<MySqlFlexibleServerConfigurationResource> operation = await configurations
    .CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", configData);

// Paramètres courants à ajuster
string[] commonParams = { "max_connections", "innodb_buffer_pool_size", "slow_query_log", "long_query_time" };

5. Configurer l'administrateur Entra ID

MySqlFlexibleServerAadAdministratorCollection admins = server.GetMySqlFlexibleServerAadAdministrators();

MySqlFlexibleServerAadAdministratorData adminData = new MySqlFlexibleServerAadAdministratorData
{
    AdministratorType = MySqlFlexibleServerAdministratorType.ActiveDirectory,
    Login = "aad-admin@contoso.com",
    Sid = Guid.Parse("<entra-object-id>"),
    TenantId = Guid.Parse("<tenant-id>"),
    IdentityResourceId = new ResourceIdentifier("/subscriptions/.../userAssignedIdentities/mysql-identity")
};

ArmOperation<MySqlFlexibleServerAadAdministratorResource> operation = await admins
    .CreateOrUpdateAsync(WaitUntil.Completed, "ActiveDirectory", adminData);

6. Lister et gérer les serveurs

// Lister les serveurs du groupe de ressources
await foreach (MySqlFlexibleServerResource server in resourceGroup.GetMySqlFlexibleServers())
{
    Console.WriteLine($"Server: {server.Data.Name}");
    Console.WriteLine($"  FQDN: {server.Data.FullyQualifiedDomainName}");
    Console.WriteLine($"  Version: {server.Data.Version}");
    Console.WriteLine($"  State: {server.Data.State}");
    Console.WriteLine($"  SKU: {server.Data.Sku.Name} ({server.Data.Sku.Tier})");
}

// Lister les bases de données du serveur
await foreach (MySqlFlexibleServerDatabaseResource db in server.GetMySqlFlexibleServerDatabases())
{
    Console.WriteLine($"Database: {db.Data.Name}");
}

7. Sauvegarde et restauration

// Lister les sauvegardes disponibles
await foreach (MySqlFlexibleServerBackupResource backup in server.GetMySqlFlexibleServerBackups())
{
    Console.WriteLine($"Backup: {backup.Data.Name}");
    Console.WriteLine($"  Type: {backup.Data.BackupType}");
    Console.WriteLine($"  Completed: {backup.Data.CompletedOn}");
}

// Restauration à un point dans le temps
MySqlFlexibleServerData restoreData = new MySqlFlexibleServerData(AzureLocation.EastUS)
{
    CreateMode = MySqlFlexibleServerCreateMode.PointInTimeRestore,
    SourceServerResourceId = server.Id,
    RestorePointInTime = DateTimeOffset.UtcNow.AddHours(-2)
};

ArmOperation<MySqlFlexibleServerResource> operation = await servers
    .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql-restored", restoreData);

8. Arrêter et démarrer le serveur

MySqlFlexibleServerResource server = await resourceGroup
    .GetMySqlFlexibleServerAsync("my-mysql-server");

// Arrêter le serveur (économise les coûts quand non utilisé)
await server.StopAsync(WaitUntil.Completed);

// Démarrer le serveur
await server.StartAsync(WaitUntil.Completed);

// Redémarrer le serveur
await server.RestartAsync(WaitUntil.Completed, new MySqlFlexibleServerRestartParameter
{
    RestartWithFailover = MySqlFlexibleServerEnableStatusEnum.Enabled,
    MaxFailoverSeconds = 60
});

9. Mettre à jour le serveur (Dimensionner)

MySqlFlexibleServerResource server = await resourceGroup
    .GetMySqlFlexibleServerAsync("my-mysql-server");

MySqlFlexibleServerPatch patch = new MySqlFlexibleServerPatch
{
    Sku = new MySqlFlexibleServerSku("Standard_D4ds_v4", MySqlFlexibleServerSkuTier.GeneralPurpose),
    Storage = new MySqlFlexibleServerStorage
    {
        StorageSizeInGB = 256,
        Iops = 6000
    }
};

ArmOperation<MySqlFlexibleServerResource> operation = await server
    .UpdateAsync(WaitUntil.Completed, patch);

10. Supprimer le serveur

MySqlFlexibleServerResource server = await resourceGroup
    .GetMySqlFlexibleServerAsync("my-mysql-server");

await server.DeleteAsync(WaitUntil.Completed);

Référence des types principaux

Type Objectif
MySqlFlexibleServerResource Instance Flexible Server
MySqlFlexibleServerData Données de configuration du serveur
MySqlFlexibleServerCollection Collection de serveurs
MySqlFlexibleServerDatabaseResource Base de données au sein du serveur
MySqlFlexibleServerFirewallRuleResource Règle de pare-feu IP
MySqlFlexibleServerConfigurationResource Paramètre du serveur
MySqlFlexibleServerBackupResource Métadonnées de sauvegarde
MySqlFlexibleServerAadAdministratorResource Admin Entra ID
MySqlFlexibleServerSku SKU (niveau de calcul + taille)
MySqlFlexibleServerStorage Configuration du stockage
MySqlFlexibleServerHighAvailability Configuration HA
MySqlFlexibleServerBackupProperties Paramètres de sauvegarde

Niveaux SKU

Niveau Cas d'usage Exemples SKU
Burstable Dev/test, charges légères Standard_B1ms, Standard_B2s
GeneralPurpose Charges de production Standard_D2ds_v4, Standard_D4ds_v4
MemoryOptimized Besoins mémoire élevés Standard_E2ds_v4, Standard_E4ds_v4

Modes de haute disponibilité

Mode Description
Disabled Pas de HA (serveur unique)
SameZone HA dans la même zone de disponibilité
ZoneRedundant HA entre zones de disponibilité

Bonnes pratiques

  1. Utiliser Flexible Server — Single Server est déprécié
  2. Activer la HA zone-redondante — Pour les charges de production
  3. Utiliser DefaultAzureCredential — Préférer aux chaînes de connexion
  4. Configurer l'authentification Entra ID — Plus sûre que l'authentification SQL
  5. Activer la croissance automatique du stockage — Évite les problèmes d'espace
  6. Définir la rétention de sauvegarde appropriée — 7-35 jours selon conformité
  7. Utiliser des points de terminaison privés — Pour un accès réseau sécurisé
  8. Ajuster les paramètres du serveur — Selon les caractéristiques de la charge
  9. Surveiller avec Azure Monitor — Activer les métriques et journaux
  10. Arrêter les serveurs dev/test — Économiser les coûts quand non utilisés

Gestion des erreurs

using Azure;

try
{
    ArmOperation<MySqlFlexibleServerResource> operation = await servers
        .CreateOrUpdateAsync(WaitUntil.Completed, "my-mysql", data);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
    Console.WriteLine("Server already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
    Console.WriteLine($"Invalid configuration: {ex.Message}");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}");
}

Chaîne de connexion

Après la création du serveur, connectez-vous avec :

// Chaîne de connexion ADO.NET
string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" +
    "Database=myappdb;" +
    "User Id=mysqladmin;" +
    "Password=YourSecurePassword123!;" +
    "SslMode=Required;";

// Avec un token Entra ID (recommandé)
var credential = new DefaultAzureCredential();
var token = await credential.GetTokenAsync(
    new TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" }));

string connectionString = $"Server={server.Data.FullyQualifiedDomainName};" +
    "Database=myappdb;" +
    $"User Id=aad-admin@contoso.com;" +
    $"Password={token.Token};" +
    "SslMode=Required;";

SDKs associés

SDK Objectif Installation
Azure.ResourceManager.MySql Gestion MySQL (ce SDK) dotnet add package Azure.ResourceManager.MySql
Azure.ResourceManager.PostgreSql Gestion PostgreSQL dotnet add package Azure.ResourceManager.PostgreSql
MySqlConnector Accès aux données MySQL dotnet add package MySqlConnector

Liens de référence

Ressource URL
Package NuGet https://www.nuget.org/packages/Azure.ResourceManager.MySql
Référence API https://learn.microsoft.com/dotnet/api/azure.resourcemanager.mysql
Documentation produit https://learn.microsoft.com/azure/mysql/flexible-server/
Source GitHub https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/mysql/Azure.ResourceManager.MySql

Skills similaires