azure-resource-manager-postgresql-dotnet
microsoft/skills
Gérez les déploiements de serveurs PostgreSQL flexibles Azure à l'aide du SDK .NET. Créez des serveurs, des bases de données, des règles de pare-feu, des configurations, des sauvegardes et la haute disponibilité.
...Développer toutAzure.ResourceManager.PostgreSql (.NET)
SDK Azure Resource Manager pour gérer les déploiements de serveurs PostgreSQL Flexibles.
Installation
dotnet add package Azure.ResourceManager.PostgreSql
dotnet add package Azure.Identity
Version actuelle : v1.2.0 (GA)
Version de l'API : 2023-12-01-preview
Remarque : Cette compétence se concentre sur PostgreSQL Flexible Server. Single Server est déprécié et prévu pour être retiré.
Variables d'environnement
AZURE_SUBSCRIPTION_ID=<votre-id-abonnement> # Obligatoire : ID d'abonnement Azure
AZURE_RESOURCE_GROUP=<votre-groupe-de-ressources> # Obligatoire : nom du groupe de ressources
AZURE_POSTGRESQL_SERVER_NAME=<votre-serveur-postgresql> # Obligatoire : nom du serveur PostgreSQL Flexible
AZURE_TOKEN_CREDENTIALS=prod # Obligatoire uniquement si DefaultAzureCredential est utilisé en production
</votre-serveur-postgresql></votre-groupe-de-ressources></votre-id-abonnement>Authentification
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.PostgreSql;
using Azure.ResourceManager.PostgreSql.FlexibleServers;
// Développement local : DefaultAzureCredential. Production : définir AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<identifiant_credential_spécifique>
var credential = new DefaultAzureCredential(
DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Ou utiliser un identifiant spécifique directement en production :
// Voir https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
ArmClient client = new ArmClient(credential);
</identifiant_credential_spécifique>Hiérarchie des ressources
Abonnement
└── GroupeDeRessources
└── PostgreSqlFlexibleServer # Instance de serveur PostgreSQL Flexible
├── PostgreSqlFlexibleServerDatabase # Base de données dans le serveur
├── PostgreSqlFlexibleServerFirewallRule # Règles de pare-feu IP
├── PostgreSqlFlexibleServerConfiguration # Paramètres du serveur
├── PostgreSqlFlexibleServerBackup # Informations de sauvegarde
├── PostgreSqlFlexibleServerActiveDirectoryAdministrator # Administrateur Entra ID
└── PostgreSqlFlexibleServerVirtualEndpoint # Points de terminaison de réplique en lecture
Flux de travail principaux
1. Créer un serveur PostgreSQL Flexible
using Azure.ResourceManager.PostgreSql.FlexibleServers;
using Azure.ResourceManager.PostgreSql.FlexibleServers.Models;
GroupeDeRessourcesResource groupeDeRessources = await client
.GetDefaultSubscriptionAsync()
.Result
.GetGroupeDeRessourcesAsync("mon-groupe-de-ressources");
Collection<PostgreSqlFlexibleServerResource> serveurs = groupeDeRessources.GetPostgreSqlFlexibleServers();
PostgreSqlFlexibleServerData donneesServeur = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)
{
Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),
AdministratorLogin = "pgadmin",
AdministratorLoginPassword = "MotDePasseSecurise123!",
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 serveurs
.CreateOrUpdateAsync(WaitUntil.Completed, "mon-serveur-postgresql", donneesServeur);
PostgreSqlFlexibleServerResource serveur = operation.Value;
Console.WriteLine($"Serveur créé : {serveur.Data.FullyQualifiedDomainName}");
</postgresqlflexibleserverresource>2. Créer une base de données
PostgreSqlFlexibleServerResource serveur = await groupeDeRessources
.GetPostgreSqlFlexibleServerAsync("mon-serveur-postgresql");
Collection<PostgreSqlFlexibleServerDatabaseResource> basesDeDonnees = serveur.GetPostgreSqlFlexibleServerDatabases();
PostgreSqlFlexibleServerDatabaseData donneesDb = new PostgreSqlFlexibleServerDatabaseData
{
Charset = "UTF8",
Collation = "en_US.utf8"
};
ArmOperation<postgresqlflexibleserverdatabaseresource> operation = await basesDeDonnees
.CreateOrUpdateAsync(WaitUntil.Completed, "maappdb", donneesDb);
PostgreSqlFlexibleServerDatabaseResource baseDeDonnees = operation.Value;
Console.WriteLine($"Base de données créée : {baseDeDonnees.Data.Name}");
</postgresqlflexibleserverdatabaseresource>3. Configurer les règles de pare-feu
Collection<PostgreSqlFlexibleServerFirewallRuleResource> reglesPareFeu = serveur.GetPostgreSqlFlexibleServerFirewallRules();
// Autoriser une plage d'adresses IP spécifique
PostgreSqlFlexibleServerFirewallRuleData donneesRegle = new PostgreSqlFlexibleServerFirewallRuleData
{
StartIPAddress = System.Net.IPAddress.Parse("10.0.0.1"),
EndIPAddress = System.Net.IPAddress.Parse("10.0.0.255")
};
ArmOperation<postgresqlflexibleserverfirewallruleresource> operation = await reglesPareFeu
.CreateOrUpdateAsync(WaitUntil.Completed, "autoriser-interne", donneesRegle);
// Autoriser les services Azure
PostgreSqlFlexibleServerFirewallRuleData regleServicesAzure = new PostgreSqlFlexibleServerFirewallRuleData
{
StartIPAddress = System.Net.IPAddress.Parse("0.0.0.0"),
EndIPAddress = System.Net.IPAddress.Parse("0.0.0.0")
};
await reglesPareFeu.CreateOrUpdateAsync(WaitUntil.Completed, "AutoriserTousLesServicesEtRessourcesAzureDansLesAdressesIPAzure", regleServicesAzure);
</postgresqlflexibleserverfirewallruleresource>4. Mettre à jour la configuration du serveur
Collection<PostgreSqlFlexibleServerConfigurationResource> configurations = serveur.GetPostgreSqlFlexibleServerConfigurations();
// Obtenir la configuration actuelle
PostgreSqlFlexibleServerConfigurationResource config = await configurations
.GetAsync("max_connections");
// Mettre à jour la configuration
PostgreSqlFlexibleServerConfigurationData donneesConfig = new PostgreSqlFlexibleServerConfigurationData
{
Value = "500",
Source = "user-override"
};
ArmOperation<postgresqlflexibleserverconfigurationresource> operation = await configurations
.CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", donneesConfig);
// Paramètres PostgreSQL courants à ajuster
string[] parametresCourants = {
"max_connections",
"shared_buffers",
"work_mem",
"maintenance_work_mem",
"effective_cache_size",
"log_min_duration_statement"
};
</postgresqlflexibleserverconfigurationresource>5. Configurer l'administrateur Entra ID
Collection<PostgreSqlFlexibleServerActiveDirectoryAdministratorResource> administrateurs =
serveur.GetPostgreSqlFlexibleServerActiveDirectoryAdministrators();
PostgreSqlFlexibleServerActiveDirectoryAdministratorData donneesAdmin =
new PostgreSqlFlexibleServerActiveDirectoryAdministratorData
{
PrincipalType = PostgreSqlFlexibleServerPrincipalType.User,
PrincipalName = "[email protected]",
TenantId = Guid.Parse("<id-locataire>")
};
ArmOperation<postgresqlflexibleserveractivedirectoryadministratorresource> operation = await administrateurs
.CreateOrUpdateAsync(WaitUntil.Completed, "<id-objet-entra>", donneesAdmin);
</id-objet-entra></postgresqlflexibleserveractivedirectoryadministratorresource></id-locataire>6. Lister et gérer les serveurs
// Lister les serveurs dans le groupe de ressources
await foreach (PostgreSqlFlexibleServerResource serveur in groupeDeRessources.GetPostgreSqlFlexibleServers())
{
Console.WriteLine($"Serveur : {serveur.Data.Name}");
Console.WriteLine($" FQDN : {serveur.Data.FullyQualifiedDomainName}");
Console.WriteLine($" Version : {serveur.Data.Version}");
Console.WriteLine($" État : {serveur.Data.State}");
Console.WriteLine($" SKU : {serveur.Data.Sku.Name} ({serveur.Data.Sku.Tier})");
Console.WriteLine($" HA : {serveur.Data.HighAvailability?.Mode}");
}
// Lister les bases de données dans le serveur
await foreach (PostgreSqlFlexibleServerDatabaseResource db in serveur.GetPostgreSqlFlexibleServerDatabases())
{
Console.WriteLine($"Base de données : {db.Data.Name}");
}
7. Sauvegarde et restauration à un instant donné
// Lister les sauvegardes disponibles
await foreach (PostgreSqlFlexibleServerBackupResource backup in serveur.GetPostgreSqlFlexibleServerBackups())
{
Console.WriteLine($"Sauvegarde : {backup.Data.Name}");
Console.WriteLine($" Type : {backup.Data.BackupType}");
Console.WriteLine($" Terminé : {backup.Data.CompletedOn}");
}
// Restauration à un instant donné
PostgreSqlFlexibleServerData donneesRestauration = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)
{
CreateMode = PostgreSqlFlexibleServerCreateMode.PointInTimeRestore,
SourceServerResourceId = serveur.Id,
PointInTimeUtc = DateTimeOffset.UtcNow.AddHours(-2)
};
ArmOperation<postgresqlflexibleserverresource> operation = await serveurs
.CreateOrUpdateAsync(WaitUntil.Completed, "mon-postgresql-restauré", donneesRestauration);
</postgresqlflexibleserverresource>8. Créer une réplique en lecture
PostgreSqlFlexibleServerData donneesRéplique = new PostgreSqlFlexibleServerData(AzureLocation.WestUS)
{
CreateMode = PostgreSqlFlexibleServerCreateMode.Replica,
SourceServerResourceId = serveur.Id,
Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose)
};
ArmOperation<postgresqlflexibleserverresource> operation = await serveurs
.CreateOrUpdateAsync(WaitUntil.Completed, "mon-postgresql-réplique", donneesRéplique);
</postgresqlflexibleserverresource>9. Arrêter et démarrer le serveur
PostgreSqlFlexibleServerResource serveur = await groupeDeRessources
.GetPostgreSqlFlexibleServerAsync("mon-serveur-postgresql");
// Arrêter le serveur (économise les coûts lorsqu'il n'est pas utilisé)
await serveur.StopAsync(WaitUntil.Completed);
// Démarrer le serveur
await serveur.StartAsync(WaitUntil.Completed);
// Redémarrer le serveur
await serveur.RestartAsync(WaitUntil.Completed, new PostgreSqlFlexibleServerRestartParameter
{
RestartWithFailover = true,
FailoverMode = PostgreSqlFlexibleServerFailoverMode.PlannedFailover
});
10. Mettre à jour le serveur (Mise à l'échelle)
PostgreSqlFlexibleServerResource serveur = await groupeDeRessources
.GetPostgreSqlFlexibleServerAsync("mon-serveur-postgresql");
PostgreSqlFlexibleServerPatch correctif = new PostgreSqlFlexibleServerPatch
{
Sku = new PostgreSqlFlexibleServerSku("Standard_D4ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),
Storage = new PostgreSqlFlexibleServerStorage
{
StorageSizeInGB = 256,
Tier = PostgreSqlStorageTierName.P40
}
};
ArmOperation<postgresqlflexibleserverresource> operation = await serveur
.UpdateAsync(WaitUntil.Completed, correctif);
</postgresqlflexibleserverresource>11. Supprimer le serveur
PostgreSqlFlexibleServerResource serveur = await groupeDeRessources
.GetPostgreSqlFlexibleServerAsync("mon-serveur-postgresql");
await serveur.DeleteAsync(WaitUntil.Completed);
Référence des types clés
| Type | Objectif |
|---|---|
| `PostgreSqlFlexibleServerResource` | Instance de serveur flexible |
| `PostgreSqlFlexibleServerData` | Données de configuration du serveur |
| `PostgreSqlFlexibleServerCollection` | Collection de serveurs |
| `PostgreSqlFlexibleServerDatabaseResource` | Base de données dans le serveur |
| `PostgreSqlFlexibleServerFirewallRuleResource` | Règle de pare-feu IP |
| `PostgreSqlFlexibleServerConfigurationResource` | Paramètre du serveur |
| `PostgreSqlFlexibleServerBackupResource` | Métadonnées de sauvegarde |
| `PostgreSqlFlexibleServerActiveDirectoryAdministratorResource` | Administrateur Entra ID |
| `PostgreSqlFlexibleServerSku` | SKU (niveau de calcul + taille) |
| `PostgreSqlFlexibleServerStorage` | Configuration du stockage |
| `PostgreSqlFlexibleServerHighAvailability` | Configuration HA |
| `PostgreSqlFlexibleServerBackupProperties` | Paramètres de sauvegarde |
| `PostgreSqlFlexibleServerAuthConfig` | Paramètres d'authentification |
Niveaux de SKU
| Niveau | Cas d'utilisation | Exemples de SKU |
|---|---|---|
| `Burstable` | Développement/test, charges de travail légères | Standard\_B1ms, Standard\_B2s |
| `GeneralPurpose` | Charges de travail de production | Standard\_D2ds\_v4, Standard\_D4ds\_v4 |
| `MemoryOptimized` | Exigences mémoire élevées | Standard\_E2ds\_v4, Standard\_E4ds\_v4 |
Versions de PostgreSQL
| Version | Valeur d'énumération |
|---|---|
| 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 entre zones de disponibilité |
Meilleures pratiques
- Utiliser Flexible Server — Single Server est déprécié
- Activer la HA redondante par zone — Pour les charges de travail de production
- Utiliser DefaultAzureCredential — Privilégié par rapport aux chaînes de connexion
- Configurer l'authentification Entra ID — Plus sécurisé que l'authentification SQL seule
- Activer les deux méthodes d'authentification — Entra ID + mot de passe pour la flexibilité
- Définir une rétention de sauvegarde appropriée — 7 à 35 jours selon la conformité
- Utiliser des points de terminaison privés — Pour un accès réseau sécurisé
- Ajuster les paramètres du serveur — En fonction des caractéristiques de la charge de travail
- Utiliser des répliques en lecture — Pour les charges de travail fortement en lecture
- Arrêter les serveurs de développement/test — Économiser les coûts lorsqu'ils ne sont pas utilisés
Gestion des erreurs
using Azure;
try
{
ArmOperation<postgresqlflexibleserverresource> operation = await serveurs
.CreateOrUpdateAsync(WaitUntil.Completed, "mon-postgresql", donneesServeur);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
Console.WriteLine("Le serveur existe déjà");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
Console.WriteLine($"Configuration invalide : {ex.Message}");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Erreur Azure : {ex.Status} - {ex.Message}");
}
</postgresqlflexibleserverresource>Chaîne de connexion
Après avoir créé le serveur, connectez-vous en utilisant :
// Chaîne de connexion Npgsql
string connectionString = $"Host={serveur.Data.FullyQualifiedDomainName};" +
"Database=maappdb;" +
"Username=pgadmin;" +
"Password=MotDePasseSecurise123!;" +
"SSL Mode=Require;Trust Server Certificate=true;";
// Avec jeton 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={serveur.Data.FullyQualifiedDomainName};" +
"Database=maappdb;" +
$"[email protected];" +
$"Password={token.Token};" +
"SSL Mode=Require;";
SDK connexes
| SDK | Objectif | Installation |
|---|---|---|
| `Azure.ResourceManager.PostgreSql` | Gestion de PostgreSQL (ce SDK) | `dotnet add package Azure.ResourceManager.PostgreSql` |
| `Azure.ResourceManager.MySql` | Gestion de 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 de l'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 |
---
name: azure-resource-manager-postgresql-dotnet
description: Manage Azure PostgreSQL Flexible Server deployments using the .NET SDK. Create servers, databases, firewall rules, configurations, backups, and high availability.
license: MIT
---
# Azure.ResourceManager.PostgreSql (.NET)
Azure Resource Manager SDK for managing PostgreSQL Flexible Server deployments.
## Installation
```bash
dotnet add package Azure.ResourceManager.PostgreSql
dotnet add package Azure.Identity
```
**Current Version**: v1.2.0 (GA)
**API Version**: 2023-12-01-preview
> **Note**: This skill focuses on PostgreSQL Flexible Server. Single Server is deprecated and scheduled for retirement.
## Environment Variables
```bash
AZURE_SUBSCRIPTION_ID=<your-subscription-id> # Required: Azure subscription ID
AZURE_RESOURCE_GROUP=<your-resource-group> # Required: resource group name
AZURE_POSTGRESQL_SERVER_NAME=<your-postgresql-server> # Required: PostgreSQL Flexible Server name
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication
```csharp
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.PostgreSql;
using Azure.ResourceManager.PostgreSql.FlexibleServers;
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
ArmClient client = new ArmClient(credential);
```
## Resource Hierarchy
```
Subscription
└── ResourceGroup
└── PostgreSqlFlexibleServer # PostgreSQL Flexible Server instance
├── PostgreSqlFlexibleServerDatabase # Database within the server
├── PostgreSqlFlexibleServerFirewallRule # IP firewall rules
├── PostgreSqlFlexibleServerConfiguration # Server parameters
├── PostgreSqlFlexibleServerBackup # Backup information
├── PostgreSqlFlexibleServerActiveDirectoryAdministrator # Entra ID admin
└── PostgreSqlFlexibleServerVirtualEndpoint # Read replica endpoints
```
## Core Workflows
### 1. Create PostgreSQL Flexible Server
```csharp
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. Create Database
```csharp
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. Configure Firewall Rules
```csharp
PostgreSqlFlexibleServerFirewallRuleCollection firewallRules = server.GetPostgreSqlFlexibleServerFirewallRules();
// Allow specific IP range
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);
// Allow Azure services
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. Update Server Configuration
```csharp
PostgreSqlFlexibleServerConfigurationCollection configurations = server.GetPostgreSqlFlexibleServerConfigurations();
// Get current configuration
PostgreSqlFlexibleServerConfigurationResource config = await configurations
.GetAsync("max_connections");
// Update configuration
PostgreSqlFlexibleServerConfigurationData configData = new PostgreSqlFlexibleServerConfigurationData
{
Value = "500",
Source = "user-override"
};
ArmOperation<PostgreSqlFlexibleServerConfigurationResource> operation = await configurations
.CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", configData);
// Common PostgreSQL configurations to tune
string[] commonParams = {
"max_connections",
"shared_buffers",
"work_mem",
"maintenance_work_mem",
"effective_cache_size",
"log_min_duration_statement"
};
```
### 5. Configure Entra ID Administrator
```csharp
PostgreSqlFlexibleServerActiveDirectoryAdministratorCollection admins =
server.GetPostgreSqlFlexibleServerActiveDirectoryAdministrators();
PostgreSqlFlexibleServerActiveDirectoryAdministratorData adminData =
new PostgreSqlFlexibleServerActiveDirectoryAdministratorData
{
PrincipalType = PostgreSqlFlexibleServerPrincipalType.User,
PrincipalName = "[email protected]",
TenantId = Guid.Parse("<tenant-id>")
};
ArmOperation<PostgreSqlFlexibleServerActiveDirectoryAdministratorResource> operation = await admins
.CreateOrUpdateAsync(WaitUntil.Completed, "<entra-object-id>", adminData);
```
### 6. List and Manage Servers
```csharp
// List servers in resource group
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}");
}
// List databases in server
await foreach (PostgreSqlFlexibleServerDatabaseResource db in server.GetPostgreSqlFlexibleServerDatabases())
{
Console.WriteLine($"Database: {db.Data.Name}");
}
```
### 7. Backup and Point-in-Time Restore
```csharp
// List available backups
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}");
}
// Point-in-time restore
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. Create Read Replica
```csharp
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. Stop and Start Server
```csharp
PostgreSqlFlexibleServerResource server = await resourceGroup
.GetPostgreSqlFlexibleServerAsync("my-postgresql-server");
// Stop server (saves costs when not in use)
await server.StopAsync(WaitUntil.Completed);
// Start server
await server.StartAsync(WaitUntil.Completed);
// Restart server
await server.RestartAsync(WaitUntil.Completed, new PostgreSqlFlexibleServerRestartParameter
{
RestartWithFailover = true,
FailoverMode = PostgreSqlFlexibleServerFailoverMode.PlannedFailover
});
```
### 10. Update Server (Scale)
```csharp
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. Delete Server
```csharp
PostgreSqlFlexibleServerResource server = await resourceGroup
.GetPostgreSqlFlexibleServerAsync("my-postgresql-server");
await server.DeleteAsync(WaitUntil.Completed);
```
## Key Types Reference
| Type | Purpose |
|------|---------|
| `PostgreSqlFlexibleServerResource` | Flexible Server instance |
| `PostgreSqlFlexibleServerData` | Server configuration data |
| `PostgreSqlFlexibleServerCollection` | Collection of servers |
| `PostgreSqlFlexibleServerDatabaseResource` | Database within server |
| `PostgreSqlFlexibleServerFirewallRuleResource` | IP firewall rule |
| `PostgreSqlFlexibleServerConfigurationResource` | Server parameter |
| `PostgreSqlFlexibleServerBackupResource` | Backup metadata |
| `PostgreSqlFlexibleServerActiveDirectoryAdministratorResource` | Entra ID admin |
| `PostgreSqlFlexibleServerSku` | SKU (compute tier + size) |
| `PostgreSqlFlexibleServerStorage` | Storage configuration |
| `PostgreSqlFlexibleServerHighAvailability` | HA configuration |
| `PostgreSqlFlexibleServerBackupProperties` | Backup settings |
| `PostgreSqlFlexibleServerAuthConfig` | Authentication settings |
## SKU Tiers
| Tier | Use Case | SKU Examples |
|------|----------|--------------|
| `Burstable` | Dev/test, light workloads | Standard_B1ms, Standard_B2s |
| `GeneralPurpose` | Production workloads | Standard_D2ds_v4, Standard_D4ds_v4 |
| `MemoryOptimized` | High memory requirements | Standard_E2ds_v4, Standard_E4ds_v4 |
## PostgreSQL Versions
| Version | Enum Value |
|---------|------------|
| PostgreSQL 11 | `Ver11` |
| PostgreSQL 12 | `Ver12` |
| PostgreSQL 13 | `Ver13` |
| PostgreSQL 14 | `Ver14` |
| PostgreSQL 15 | `Ver15` |
| PostgreSQL 16 | `Ver16` |
## High Availability Modes
| Mode | Description |
|------|-------------|
| `Disabled` | No HA (single server) |
| `SameZone` | HA within same availability zone |
| `ZoneRedundant` | HA across availability zones |
## Best Practices
1. **Use Flexible Server** — Single Server is deprecated
2. **Enable zone-redundant HA** — For production workloads
3. **Use DefaultAzureCredential** — Prefer over connection strings
4. **Configure Entra ID authentication** — More secure than SQL auth alone
5. **Enable both auth methods** — Entra ID + password for flexibility
6. **Set appropriate backup retention** — 7-35 days based on compliance
7. **Use private endpoints** — For secure network access
8. **Tune server parameters** — Based on workload characteristics
9. **Use read replicas** — For read-heavy workloads
10. **Stop dev/test servers** — Save costs when not in use
## Error Handling
```csharp
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}");
}
```
## Connection String
After creating the server, connect using:
```csharp
// Npgsql connection string
string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" +
"Database=myappdb;" +
"Username=pgadmin;" +
"Password=YourSecurePassword123!;" +
"SSL Mode=Require;Trust Server Certificate=true;";
// With Entra ID token (recommended)
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;" +
$"[email protected];" +
$"Password={token.Token};" +
"SSL Mode=Require;";
```
## Related SDKs
| SDK | Purpose | Install |
|-----|---------|---------|
| `Azure.ResourceManager.PostgreSql` | PostgreSQL management (this SDK) | `dotnet add package Azure.ResourceManager.PostgreSql` |
| `Azure.ResourceManager.MySql` | MySQL management | `dotnet add package Azure.ResourceManager.MySql` |
| `Npgsql` | PostgreSQL data access | `dotnet add package Npgsql` |
| `Npgsql.EntityFrameworkCore.PostgreSQL` | EF Core provider | `dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL` |
## Reference Links
| Resource | URL |
|----------|-----|
| NuGet Package | https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql |
| API Reference | https://learn.microsoft.com/dotnet/api/azure.resourcemanager.postgresql |
| Product Documentation | https://learn.microsoft.com/azure/postgresql/flexible-server/ |
| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/postgresql/Azure.ResourceManager.PostgreSql |
Tous les fichiers
0 fichiersInstaller azure-resource-manager-postgresql-dotnet
Téléchargez et extrayez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-dotnet/skills/azure-resource-manager-postgresql-dotnet # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
