azure-resource-manager-postgresql-dotnet

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

Azure.ResourceManager.PostgreSql (.NET)

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

Installation

dotnet add package Azure.ResourceManager.PostgreSql
dotnet add package Azure.Identity

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

Note : Cette skill se concentre sur PostgreSQL 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_POSTGRESQL_SERVER_NAME=<your-postgresql-server>

Authentification

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.PostgreSql;
using Azure.ResourceManager.PostgreSql.FlexibleServers;

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

Hiérarchie des ressources

Subscription
└── ResourceGroup
    └── PostgreSqlFlexibleServer              # Instance PostgreSQL Flexible Server
        ├── PostgreSqlFlexibleServerDatabase  # Base de données sur le serveur
        ├── PostgreSqlFlexibleServerFirewallRule # Règles de pare-feu IP
        ├── PostgreSqlFlexibleServerConfiguration # Paramètres du serveur
        ├── PostgreSqlFlexibleServerBackup    # Informations de sauvegarde
        ├── PostgreSqlFlexibleServerActiveDirectoryAdministrator # Admin Entra ID
        └── PostgreSqlFlexibleServerVirtualEndpoint # Points de terminaison de replica en lecture

Workflows principaux

1. Créer PostgreSQL Flexible Server

using Azure.ResourceManager.PostgreSql.FlexibleServers;
using Azure.ResourceManager.PostgreSql.FlexibleServers.Models;

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

PostgreSqlFlexibleServerCollection servers = resourceGroup.GetPostgreSqlFlexibleServers();

PostgreSqlFlexibleServerData data = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)
{
    Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),
    AdministratorLogin = "pgadmin",
    AdministratorLoginPassword = "YourSecurePassword123!",
    Version = PostgreSqlFlexibleServerVersion.Ver16,
    Storage = new PostgreSqlFlexibleServerStorage
    {
        StorageSizeInGB = 128,
        AutoGrow = StorageAutoGrow.Enabled,
        Tier = PostgreSqlStorageTierName.P30
    },
    Backup = new PostgreSqlFlexibleServerBackupProperties
    {
        BackupRetentionDays = 7,
        GeoRedundantBackup = PostgreSqlFlexibleServerGeoRedundantBackupEnum.Disabled
    },
    HighAvailability = new PostgreSqlFlexibleServerHighAvailability
    {
        Mode = PostgreSqlFlexibleServerHighAvailabilityMode.ZoneRedundant,
        StandbyAvailabilityZone = "2"
    },
    AvailabilityZone = "1",
    AuthConfig = new PostgreSqlFlexibleServerAuthConfig
    {
        ActiveDirectoryAuth = PostgreSqlFlexibleServerActiveDirectoryAuthEnum.Enabled,
        PasswordAuth = PostgreSqlFlexibleServerPasswordAuthEnum.Enabled
    }
};

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

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

2. Créer une base de données

PostgreSqlFlexibleServerResource server = await resourceGroup
    .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");

PostgreSqlFlexibleServerDatabaseCollection databases = server.GetPostgreSqlFlexibleServerDatabases();

PostgreSqlFlexibleServerDatabaseData dbData = new PostgreSqlFlexibleServerDatabaseData
{
    Charset = "UTF8",
    Collation = "en_US.utf8"
};

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

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

3. Configurer les règles de pare-feu

PostgreSqlFlexibleServerFirewallRuleCollection firewallRules = server.GetPostgreSqlFlexibleServerFirewallRules();

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

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

// Autoriser les services Azure
PostgreSqlFlexibleServerFirewallRuleData azureServicesRule = new PostgreSqlFlexibleServerFirewallRuleData
{
    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

PostgreSqlFlexibleServerConfigurationCollection configurations = server.GetPostgreSqlFlexibleServerConfigurations();

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

// Mettre à jour la configuration
PostgreSqlFlexibleServerConfigurationData configData = new PostgreSqlFlexibleServerConfigurationData
{
    Value = "500",
    Source = "user-override"
};

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

// Paramètres PostgreSQL courants à affiner
string[] commonParams = { 
    "max_connections", 
    "shared_buffers", 
    "work_mem", 
    "maintenance_work_mem",
    "effective_cache_size",
    "log_min_duration_statement"
};

5. Configurer l'administrateur Entra ID

PostgreSqlFlexibleServerActiveDirectoryAdministratorCollection admins = 
    server.GetPostgreSqlFlexibleServerActiveDirectoryAdministrators();

PostgreSqlFlexibleServerActiveDirectoryAdministratorData adminData = 
    new PostgreSqlFlexibleServerActiveDirectoryAdministratorData
{
    PrincipalType = PostgreSqlFlexibleServerPrincipalType.User,
    PrincipalName = "aad-admin@contoso.com",
    TenantId = Guid.Parse("<tenant-id>")
};

ArmOperation<PostgreSqlFlexibleServerActiveDirectoryAdministratorResource> operation = await admins
    .CreateOrUpdateAsync(WaitUntil.Completed, "<entra-object-id>", adminData);

6. Lister et gérer les serveurs

// Lister les serveurs du groupe de ressources
await foreach (PostgreSqlFlexibleServerResource server in resourceGroup.GetPostgreSqlFlexibleServers())
{
    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})");
    Console.WriteLine($"  HA: {server.Data.HighAvailability?.Mode}");
}

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

7. Sauvegarde et restauration jusqu'à un point dans le temps

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

// Restauration jusqu'à un point dans le temps
PostgreSqlFlexibleServerData restoreData = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)
{
    CreateMode = PostgreSqlFlexibleServerCreateMode.PointInTimeRestore,
    SourceServerResourceId = server.Id,
    PointInTimeUtc = DateTimeOffset.UtcNow.AddHours(-2)
};

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

8. Créer un replica en lecture

PostgreSqlFlexibleServerData replicaData = new PostgreSqlFlexibleServerData(AzureLocation.WestUS)
{
    CreateMode = PostgreSqlFlexibleServerCreateMode.Replica,
    SourceServerResourceId = server.Id,
    Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose)
};

ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers
    .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-replica", replicaData);

9. Arrêter et démarrer le serveur

PostgreSqlFlexibleServerResource server = await resourceGroup
    .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");

// Arrêter le serveur (réduit 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 PostgreSqlFlexibleServerRestartParameter
{
    RestartWithFailover = true,
    FailoverMode = PostgreSqlFlexibleServerFailoverMode.PlannedFailover
});

10. Mettre à jour le serveur (redimensionner)

PostgreSqlFlexibleServerResource server = await resourceGroup
    .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");

PostgreSqlFlexibleServerPatch patch = new PostgreSqlFlexibleServerPatch
{
    Sku = new PostgreSqlFlexibleServerSku("Standard_D4ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),
    Storage = new PostgreSqlFlexibleServerStorage
    {
        StorageSizeInGB = 256,
        Tier = PostgreSqlStorageTierName.P40
    }
};

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

11. Supprimer le serveur

PostgreSqlFlexibleServerResource server = await resourceGroup
    .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");

await server.DeleteAsync(WaitUntil.Completed);

Référence des types clés

Type Objectif
PostgreSqlFlexibleServerResource Instance Flexible Server
PostgreSqlFlexibleServerData Données de configuration du serveur
PostgreSqlFlexibleServerCollection Collection de serveurs
PostgreSqlFlexibleServerDatabaseResource Base de données sur le serveur
PostgreSqlFlexibleServerFirewallRuleResource Règle de pare-feu IP
PostgreSqlFlexibleServerConfigurationResource Paramètre du serveur
PostgreSqlFlexibleServerBackupResource Métadonnées de sauvegarde
PostgreSqlFlexibleServerActiveDirectoryAdministratorResource Admin Entra ID
PostgreSqlFlexibleServerSku SKU (tier de calcul + taille)
PostgreSqlFlexibleServerStorage Configuration du stockage
PostgreSqlFlexibleServerHighAvailability Configuration HA
PostgreSqlFlexibleServerBackupProperties Paramètres de sauvegarde
PostgreSqlFlexibleServerAuthConfig Paramètres d'authentification

Tiers SKU

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

Versions PostgreSQL

Version Valeur enum
PostgreSQL 11 Ver11
PostgreSQL 12 Ver12
PostgreSQL 13 Ver13
PostgreSQL 14 Ver14
PostgreSQL 15 Ver15
PostgreSQL 16 Ver16

Modes de haute disponibilité

Mode Description
Disabled Pas de HA (serveur unique)
SameZone HA dans la même zone de disponibilité
ZoneRedundant HA sur plusieurs 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 travail en production
  3. Utiliser DefaultAzureCredential — Préférer aux chaînes de connexion
  4. Configurer l'authentification Entra ID — Plus sécurisée que l'authentification SQL seule
  5. Activer les deux méthodes d'authentification — Entra ID + mot de passe pour la flexibilité
  6. Définir une rétention de sauvegarde appropriée — 7 à 35 jours selon la conformité
  7. Utiliser des points de terminaison privés — Pour un accès réseau sécurisé
  8. Affiner les paramètres du serveur — Selon les caractéristiques de la charge de travail
  9. Utiliser les replicas en lecture — Pour les charges de travail intensives en lecture
  10. Arrêter les serveurs dev/test — Réduire les coûts quand non utilisés

Gestion des erreurs

using Azure;

try
{
    ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers
        .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql", 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 création du serveur, connectez-vous avec :

// Chaîne de connexion Npgsql
string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" +
    "Database=myappdb;" +
    "Username=pgadmin;" +
    "Password=YourSecurePassword123!;" +
    "SSL Mode=Require;Trust Server Certificate=true;";

// Avec 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 = $"Host={server.Data.FullyQualifiedDomainName};" +
    "Database=myappdb;" +
    $"Username=aad-admin@contoso.com;" +
    $"Password={token.Token};" +
    "SSL Mode=Require;";

SDK connexes

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

Liens de référence

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

Skills similaires