|
Add this skill
npx mdskills install sickn33/azure-resource-manager-postgresql-dotnetComprehensive PostgreSQL Flexible Server management with 11 workflows, excellent code examples, and detailed SKU guidance
1---2name: azure-resource-manager-postgresql-dotnet3description: |4 Azure PostgreSQL Flexible Server SDK for .NET. Database management for PostgreSQL Flexible Server deployments. Use for creating servers, databases, firewall rules, configurations, backups, and high availability. Triggers: "PostgreSQL", "PostgreSqlFlexibleServer", "PostgreSQL Flexible Server", "Azure Database for PostgreSQL", "PostgreSQL database management", "PostgreSQL firewall", "PostgreSQL backup", "Postgres".5package: Azure.ResourceManager.PostgreSql6---78# Azure.ResourceManager.PostgreSql (.NET)910Azure Resource Manager SDK for managing PostgreSQL Flexible Server deployments.1112## Installation1314```bash15dotnet add package Azure.ResourceManager.PostgreSql16dotnet add package Azure.Identity17```1819**Current Version**: v1.2.0 (GA)20**API Version**: 2023-12-01-preview2122> **Note**: This skill focuses on PostgreSQL Flexible Server. Single Server is deprecated and scheduled for retirement.2324## Environment Variables2526```bash27AZURE_SUBSCRIPTION_ID=<your-subscription-id>28AZURE_RESOURCE_GROUP=<your-resource-group>29AZURE_POSTGRESQL_SERVER_NAME=<your-postgresql-server>30```3132## Authentication3334```csharp35using Azure.Identity;36using Azure.ResourceManager;37using Azure.ResourceManager.PostgreSql;38using Azure.ResourceManager.PostgreSql.FlexibleServers;3940ArmClient client = new ArmClient(new DefaultAzureCredential());41```4243## Resource Hierarchy4445```46Subscription47└── ResourceGroup48 └── PostgreSqlFlexibleServer # PostgreSQL Flexible Server instance49 ├── PostgreSqlFlexibleServerDatabase # Database within the server50 ├── PostgreSqlFlexibleServerFirewallRule # IP firewall rules51 ├── PostgreSqlFlexibleServerConfiguration # Server parameters52 ├── PostgreSqlFlexibleServerBackup # Backup information53 ├── PostgreSqlFlexibleServerActiveDirectoryAdministrator # Entra ID admin54 └── PostgreSqlFlexibleServerVirtualEndpoint # Read replica endpoints55```5657## Core Workflows5859### 1. Create PostgreSQL Flexible Server6061```csharp62using Azure.ResourceManager.PostgreSql.FlexibleServers;63using Azure.ResourceManager.PostgreSql.FlexibleServers.Models;6465ResourceGroupResource resourceGroup = await client66 .GetDefaultSubscriptionAsync()67 .Result68 .GetResourceGroupAsync("my-resource-group");6970PostgreSqlFlexibleServerCollection servers = resourceGroup.GetPostgreSqlFlexibleServers();7172PostgreSqlFlexibleServerData data = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)73{74 Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),75 AdministratorLogin = "pgadmin",76 AdministratorLoginPassword = "YourSecurePassword123!",77 Version = PostgreSqlFlexibleServerVersion.Ver16,78 Storage = new PostgreSqlFlexibleServerStorage79 {80 StorageSizeInGB = 128,81 AutoGrow = StorageAutoGrow.Enabled,82 Tier = PostgreSqlStorageTierName.P3083 },84 Backup = new PostgreSqlFlexibleServerBackupProperties85 {86 BackupRetentionDays = 7,87 GeoRedundantBackup = PostgreSqlFlexibleServerGeoRedundantBackupEnum.Disabled88 },89 HighAvailability = new PostgreSqlFlexibleServerHighAvailability90 {91 Mode = PostgreSqlFlexibleServerHighAvailabilityMode.ZoneRedundant,92 StandbyAvailabilityZone = "2"93 },94 AvailabilityZone = "1",95 AuthConfig = new PostgreSqlFlexibleServerAuthConfig96 {97 ActiveDirectoryAuth = PostgreSqlFlexibleServerActiveDirectoryAuthEnum.Enabled,98 PasswordAuth = PostgreSqlFlexibleServerPasswordAuthEnum.Enabled99 }100};101102ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers103 .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-server", data);104105PostgreSqlFlexibleServerResource server = operation.Value;106Console.WriteLine($"Server created: {server.Data.FullyQualifiedDomainName}");107```108109### 2. Create Database110111```csharp112PostgreSqlFlexibleServerResource server = await resourceGroup113 .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");114115PostgreSqlFlexibleServerDatabaseCollection databases = server.GetPostgreSqlFlexibleServerDatabases();116117PostgreSqlFlexibleServerDatabaseData dbData = new PostgreSqlFlexibleServerDatabaseData118{119 Charset = "UTF8",120 Collation = "en_US.utf8"121};122123ArmOperation<PostgreSqlFlexibleServerDatabaseResource> operation = await databases124 .CreateOrUpdateAsync(WaitUntil.Completed, "myappdb", dbData);125126PostgreSqlFlexibleServerDatabaseResource database = operation.Value;127Console.WriteLine($"Database created: {database.Data.Name}");128```129130### 3. Configure Firewall Rules131132```csharp133PostgreSqlFlexibleServerFirewallRuleCollection firewallRules = server.GetPostgreSqlFlexibleServerFirewallRules();134135// Allow specific IP range136PostgreSqlFlexibleServerFirewallRuleData ruleData = new PostgreSqlFlexibleServerFirewallRuleData137{138 StartIPAddress = System.Net.IPAddress.Parse("10.0.0.1"),139 EndIPAddress = System.Net.IPAddress.Parse("10.0.0.255")140};141142ArmOperation<PostgreSqlFlexibleServerFirewallRuleResource> operation = await firewallRules143 .CreateOrUpdateAsync(WaitUntil.Completed, "allow-internal", ruleData);144145// Allow Azure services146PostgreSqlFlexibleServerFirewallRuleData azureServicesRule = new PostgreSqlFlexibleServerFirewallRuleData147{148 StartIPAddress = System.Net.IPAddress.Parse("0.0.0.0"),149 EndIPAddress = System.Net.IPAddress.Parse("0.0.0.0")150};151152await firewallRules.CreateOrUpdateAsync(WaitUntil.Completed, "AllowAllAzureServicesAndResourcesWithinAzureIps", azureServicesRule);153```154155### 4. Update Server Configuration156157```csharp158PostgreSqlFlexibleServerConfigurationCollection configurations = server.GetPostgreSqlFlexibleServerConfigurations();159160// Get current configuration161PostgreSqlFlexibleServerConfigurationResource config = await configurations162 .GetAsync("max_connections");163164// Update configuration165PostgreSqlFlexibleServerConfigurationData configData = new PostgreSqlFlexibleServerConfigurationData166{167 Value = "500",168 Source = "user-override"169};170171ArmOperation<PostgreSqlFlexibleServerConfigurationResource> operation = await configurations172 .CreateOrUpdateAsync(WaitUntil.Completed, "max_connections", configData);173174// Common PostgreSQL configurations to tune175string[] commonParams = {176 "max_connections",177 "shared_buffers",178 "work_mem",179 "maintenance_work_mem",180 "effective_cache_size",181 "log_min_duration_statement"182};183```184185### 5. Configure Entra ID Administrator186187```csharp188PostgreSqlFlexibleServerActiveDirectoryAdministratorCollection admins =189 server.GetPostgreSqlFlexibleServerActiveDirectoryAdministrators();190191PostgreSqlFlexibleServerActiveDirectoryAdministratorData adminData =192 new PostgreSqlFlexibleServerActiveDirectoryAdministratorData193{194 PrincipalType = PostgreSqlFlexibleServerPrincipalType.User,195 PrincipalName = "aad-admin@contoso.com",196 TenantId = Guid.Parse("<tenant-id>")197};198199ArmOperation<PostgreSqlFlexibleServerActiveDirectoryAdministratorResource> operation = await admins200 .CreateOrUpdateAsync(WaitUntil.Completed, "<entra-object-id>", adminData);201```202203### 6. List and Manage Servers204205```csharp206// List servers in resource group207await foreach (PostgreSqlFlexibleServerResource server in resourceGroup.GetPostgreSqlFlexibleServers())208{209 Console.WriteLine($"Server: {server.Data.Name}");210 Console.WriteLine($" FQDN: {server.Data.FullyQualifiedDomainName}");211 Console.WriteLine($" Version: {server.Data.Version}");212 Console.WriteLine($" State: {server.Data.State}");213 Console.WriteLine($" SKU: {server.Data.Sku.Name} ({server.Data.Sku.Tier})");214 Console.WriteLine($" HA: {server.Data.HighAvailability?.Mode}");215}216217// List databases in server218await foreach (PostgreSqlFlexibleServerDatabaseResource db in server.GetPostgreSqlFlexibleServerDatabases())219{220 Console.WriteLine($"Database: {db.Data.Name}");221}222```223224### 7. Backup and Point-in-Time Restore225226```csharp227// List available backups228await foreach (PostgreSqlFlexibleServerBackupResource backup in server.GetPostgreSqlFlexibleServerBackups())229{230 Console.WriteLine($"Backup: {backup.Data.Name}");231 Console.WriteLine($" Type: {backup.Data.BackupType}");232 Console.WriteLine($" Completed: {backup.Data.CompletedOn}");233}234235// Point-in-time restore236PostgreSqlFlexibleServerData restoreData = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)237{238 CreateMode = PostgreSqlFlexibleServerCreateMode.PointInTimeRestore,239 SourceServerResourceId = server.Id,240 PointInTimeUtc = DateTimeOffset.UtcNow.AddHours(-2)241};242243ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers244 .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-restored", restoreData);245```246247### 8. Create Read Replica248249```csharp250PostgreSqlFlexibleServerData replicaData = new PostgreSqlFlexibleServerData(AzureLocation.WestUS)251{252 CreateMode = PostgreSqlFlexibleServerCreateMode.Replica,253 SourceServerResourceId = server.Id,254 Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose)255};256257ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers258 .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql-replica", replicaData);259```260261### 9. Stop and Start Server262263```csharp264PostgreSqlFlexibleServerResource server = await resourceGroup265 .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");266267// Stop server (saves costs when not in use)268await server.StopAsync(WaitUntil.Completed);269270// Start server271await server.StartAsync(WaitUntil.Completed);272273// Restart server274await server.RestartAsync(WaitUntil.Completed, new PostgreSqlFlexibleServerRestartParameter275{276 RestartWithFailover = true,277 FailoverMode = PostgreSqlFlexibleServerFailoverMode.PlannedFailover278});279```280281### 10. Update Server (Scale)282283```csharp284PostgreSqlFlexibleServerResource server = await resourceGroup285 .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");286287PostgreSqlFlexibleServerPatch patch = new PostgreSqlFlexibleServerPatch288{289 Sku = new PostgreSqlFlexibleServerSku("Standard_D4ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),290 Storage = new PostgreSqlFlexibleServerStorage291 {292 StorageSizeInGB = 256,293 Tier = PostgreSqlStorageTierName.P40294 }295};296297ArmOperation<PostgreSqlFlexibleServerResource> operation = await server298 .UpdateAsync(WaitUntil.Completed, patch);299```300301### 11. Delete Server302303```csharp304PostgreSqlFlexibleServerResource server = await resourceGroup305 .GetPostgreSqlFlexibleServerAsync("my-postgresql-server");306307await server.DeleteAsync(WaitUntil.Completed);308```309310## Key Types Reference311312| Type | Purpose |313|------|---------|314| `PostgreSqlFlexibleServerResource` | Flexible Server instance |315| `PostgreSqlFlexibleServerData` | Server configuration data |316| `PostgreSqlFlexibleServerCollection` | Collection of servers |317| `PostgreSqlFlexibleServerDatabaseResource` | Database within server |318| `PostgreSqlFlexibleServerFirewallRuleResource` | IP firewall rule |319| `PostgreSqlFlexibleServerConfigurationResource` | Server parameter |320| `PostgreSqlFlexibleServerBackupResource` | Backup metadata |321| `PostgreSqlFlexibleServerActiveDirectoryAdministratorResource` | Entra ID admin |322| `PostgreSqlFlexibleServerSku` | SKU (compute tier + size) |323| `PostgreSqlFlexibleServerStorage` | Storage configuration |324| `PostgreSqlFlexibleServerHighAvailability` | HA configuration |325| `PostgreSqlFlexibleServerBackupProperties` | Backup settings |326| `PostgreSqlFlexibleServerAuthConfig` | Authentication settings |327328## SKU Tiers329330| Tier | Use Case | SKU Examples |331|------|----------|--------------|332| `Burstable` | Dev/test, light workloads | Standard_B1ms, Standard_B2s |333| `GeneralPurpose` | Production workloads | Standard_D2ds_v4, Standard_D4ds_v4 |334| `MemoryOptimized` | High memory requirements | Standard_E2ds_v4, Standard_E4ds_v4 |335336## PostgreSQL Versions337338| Version | Enum Value |339|---------|------------|340| PostgreSQL 11 | `Ver11` |341| PostgreSQL 12 | `Ver12` |342| PostgreSQL 13 | `Ver13` |343| PostgreSQL 14 | `Ver14` |344| PostgreSQL 15 | `Ver15` |345| PostgreSQL 16 | `Ver16` |346347## High Availability Modes348349| Mode | Description |350|------|-------------|351| `Disabled` | No HA (single server) |352| `SameZone` | HA within same availability zone |353| `ZoneRedundant` | HA across availability zones |354355## Best Practices3563571. **Use Flexible Server** — Single Server is deprecated3582. **Enable zone-redundant HA** — For production workloads3593. **Use DefaultAzureCredential** — Prefer over connection strings3604. **Configure Entra ID authentication** — More secure than SQL auth alone3615. **Enable both auth methods** — Entra ID + password for flexibility3626. **Set appropriate backup retention** — 7-35 days based on compliance3637. **Use private endpoints** — For secure network access3648. **Tune server parameters** — Based on workload characteristics3659. **Use read replicas** — For read-heavy workloads36610. **Stop dev/test servers** — Save costs when not in use367368## Error Handling369370```csharp371using Azure;372373try374{375 ArmOperation<PostgreSqlFlexibleServerResource> operation = await servers376 .CreateOrUpdateAsync(WaitUntil.Completed, "my-postgresql", data);377}378catch (RequestFailedException ex) when (ex.Status == 409)379{380 Console.WriteLine("Server already exists");381}382catch (RequestFailedException ex) when (ex.Status == 400)383{384 Console.WriteLine($"Invalid configuration: {ex.Message}");385}386catch (RequestFailedException ex)387{388 Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}");389}390```391392## Connection String393394After creating the server, connect using:395396```csharp397// Npgsql connection string398string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" +399 "Database=myappdb;" +400 "Username=pgadmin;" +401 "Password=YourSecurePassword123!;" +402 "SSL Mode=Require;Trust Server Certificate=true;";403404// With Entra ID token (recommended)405var credential = new DefaultAzureCredential();406var token = await credential.GetTokenAsync(407 new TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" }));408409string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" +410 "Database=myappdb;" +411 $"Username=aad-admin@contoso.com;" +412 $"Password={token.Token};" +413 "SSL Mode=Require;";414```415416## Related SDKs417418| SDK | Purpose | Install |419|-----|---------|---------|420| `Azure.ResourceManager.PostgreSql` | PostgreSQL management (this SDK) | `dotnet add package Azure.ResourceManager.PostgreSql` |421| `Azure.ResourceManager.MySql` | MySQL management | `dotnet add package Azure.ResourceManager.MySql` |422| `Npgsql` | PostgreSQL data access | `dotnet add package Npgsql` |423| `Npgsql.EntityFrameworkCore.PostgreSQL` | EF Core provider | `dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL` |424425## Reference Links426427| Resource | URL |428|----------|-----|429| NuGet Package | https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql |430| API Reference | https://learn.microsoft.com/dotnet/api/azure.resourcemanager.postgresql |431| Product Documentation | https://learn.microsoft.com/azure/postgresql/flexible-server/ |432| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/postgresql/Azure.ResourceManager.PostgreSql |433
Full transparency — inspect the skill content before installing.