azure-resource-manager-postgresql-dotnet について
azure-resource-manager-postgresql-dotnetは、Azure Resource Managerを通じてAzure Database for PostgreSQL Flexible Serverを管理する.NETスキルです。サーバー、データベース、ファイアウォール、バックアップ、ライフサイクル操作を扱います。
主な機能
- 01Flexible Serverインスタンスの作成
- 02データベースとファイアウォール規則の管理
- 03サーバーパラメーターと管理者の更新
- 04バックアップと復元ポイントの確認
- 05読み取りレプリカの作成
- 06サーバーの停止・起動・拡張・削除
活用シーン
- 01PostgreSQL Flexible Serverのプロビジョニング
- 02サーバー設定やサイズの変更
- 03復旧前のバックアップ確認
- 04開発サーバーの稼働時間の管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-resource-manager-postgresql-dotnetインストール後、Claude Code で/azure-resource-manager-postgresql-dotnetを入力して読み込まれたか確認します。
詳細
Azure.ResourceManager.PostgreSql (.NET)
PostgreSQL Flexible Server デプロイを管理するための Azure Resource Manager SDK です。
インストール
dotnet add package Azure.ResourceManager.PostgreSql
dotnet add package Azure.Identity
例の基準:SDK v1.2.0/API 2023-12-01-preview。これは現行バージョンを示すものではありません。対象のサブスクリプションでサポートされている SDK/API を選択して固定し、これらのスニペットをそのバージョンに対してコンパイルしてください。
注:このスキルでは PostgreSQL Flexible Server を扱います。Single Server は廃止されているため、Flexible Server を使用し、現在のリージョンおよびバージョンのサポート状況を確認してください。
環境変数
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_RESOURCE_GROUP=<your-resource-group>
AZURE_POSTGRESQL_SERVER_NAME=<your-postgresql-server>
認証
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.PostgreSql;
using Azure.ResourceManager.PostgreSql.FlexibleServers;
ArmClient client = new ArmClient(new DefaultAzureCredential());
リソース階層
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
主なワークフロー
以下はそれぞれ独立した例示用スニペットであり、コンパイル可能な単一のプログラムではありません。インストール済み SDK に応じて、必要なインポート(Azure、Azure.Core、リソースグループの型など)を追加してください。プロビジョニングやサイズ変更の前に、サブスクリプション/リソース ID、コスト、可用性、ロールバックを確認してください。削除の前には、復元可能なバックアップがあることと、対象が正確であることを確認してください。ARM 資格情報はインフラストラクチャを管理します。データベース接続には別途、権限が付与されたデータベースロールが必要です。新しく開かれたプール接続用の Entra トークンは、Npgsql のパスワードプロバイダー API を使用して更新してください。トークンを無期限に保持しないでください。
1. PostgreSQL Flexible Server を作成する
using System;
using Azure.ResourceManager.PostgreSql.FlexibleServers;
using Azure.ResourceManager.PostgreSql.FlexibleServers.Models;
var subscription = await client.GetDefaultSubscriptionAsync();
ResourceGroupResource resourceGroup = (await subscription.GetResourceGroupAsync("my-resource-group")).Value;
PostgreSqlFlexibleServerCollection servers = resourceGroup.GetPostgreSqlFlexibleServers();
PostgreSqlFlexibleServerData data = new PostgreSqlFlexibleServerData(AzureLocation.EastUS)
{
Sku = new PostgreSqlFlexibleServerSku("Standard_D2ds_v4", PostgreSqlFlexibleServerSkuTier.GeneralPurpose),
AdministratorLogin = "pgadmin",
AdministratorLoginPassword = Environment.GetEnvironmentVariable("POSTGRES_ADMIN_PASSWORD") ?? throw new InvalidOperationException("POSTGRES_ADMIN_PASSWORD is required"),
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. データベースを作成する
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. ファイアウォールルールを構成する
PostgreSqlFlexibleServerFirewallRuleCollection firewallRules = server.GetPostgreSqlFlexibleServerFirewallRules();
// Public-access firewall rules require the client’s public egress IP, not its private VNet address.
// Example documentation range only; replace with the approved public egress range.
PostgreSqlFlexibleServerFirewallRuleData ruleData = new PostgreSqlFlexibleServerFirewallRuleData
{
StartIPAddress = System.Net.IPAddress.Parse("203.0.113.10"),
EndIPAddress = System.Net.IPAddress.Parse("203.0.113.10")
};
ArmOperation<PostgreSqlFlexibleServerFirewallRuleResource> operation = await firewallRules
.CreateOrUpdateAsync(WaitUntil.Completed, "allow-internal", ruleData);
// OPTIONAL broad exception: 0.0.0.0 allows Azure services from OTHER customers’ subscriptions too.
// Do not apply without explicit approval; prefer specific egress IPs or private networking.
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. サーバー構成を更新する
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. Entra ID 管理者を構成する
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 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. バックアップと特定時点への復元
// 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. 読み取りレプリカを作成する
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. サーバーを停止して開始する
PostgreSqlFlexibleServerResource server = await resourceGroup
.GetPostgreSqlFlexibleServerAsync("my-postgresql-server");
// Stop server (compute billing stops; storage/backup costs and automatic restart limits still apply)
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. サーバーを更新する(スケール)
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. サーバーを削除する
PostgreSqlFlexibleServerResource server = await resourceGroup
.GetPostgreSqlFlexibleServerAsync("my-postgresql-server");
await server.DeleteAsync(WaitUntil.Completed);
主な型のリファレンス
| 型 | 用途 |
|---|---|
PostgreSqlFlexibleServerResource | Flexible Server インスタンス |
PostgreSqlFlexibleServerData | サーバー構成データ |
PostgreSqlFlexibleServerCollection | サーバーのコレクション |
PostgreSqlFlexibleServerDatabaseResource | サーバー内のデータベース |
PostgreSqlFlexibleServerFirewallRuleResource | IP ファイアウォールルール |
PostgreSqlFlexibleServerConfigurationResource | サーバーパラメーター |
PostgreSqlFlexibleServerBackupResource | バックアップのメタデータ |
PostgreSqlFlexibleServerActiveDirectoryAdministratorResource | Entra ID 管理者 |
PostgreSqlFlexibleServerSku | SKU(コンピューティング階層+サイズ) |
PostgreSqlFlexibleServerStorage | ストレージ構成 |
PostgreSqlFlexibleServerHighAvailability | HA 構成 |
PostgreSqlFlexibleServerBackupProperties | バックアップ設定 |
PostgreSqlFlexibleServerAuthConfig | 認証設定 |
SKU 階層
| 階層 | ユースケース | SKU の例 |
|---|---|---|
Burstable | 開発/テスト、軽いワークロード | Standard_B1ms、Standard_B2s |
GeneralPurpose | 本番ワークロード | Standard_D2ds_v4、Standard_D4ds_v4 |
MemoryOptimized | 大容量メモリが必要な場合 | Standard_E2ds_v4、Standard_E4ds_v4 |
PostgreSQL バージョン
| バージョン | Enum 値 |
|---|---|
| PostgreSQL 11 | Ver11 |
| PostgreSQL 12 | Ver12 |
| PostgreSQL 13 | Ver13 |
| PostgreSQL 14 | Ver14 |
| PostgreSQL 15 | Ver15 |
| PostgreSQL 16 | Ver16 |
高可用性モード
| モード | 説明 |
|---|---|
Disabled | HA なし(単一サーバー) |
SameZone | 同じ可用性ゾーン内での HA |
ZoneRedundant | 複数の可用性ゾーンにまたがる HA |
ベストプラクティス
- Flexible Server を使用する — Single Server は非推奨です
- ゾーン冗長 HA を有効にする — 本番ワークロード向けです
- DefaultAzureCredential を使用する — 接続文字列よりも優先してください
- Entra ID 認証を構成する — SQL 認証だけを使用するより安全です
- 認証方法を慎重に選択する — 対応している場合は Entra 専用を優先し、パスワード認証は文書化された要件がある場合にのみ有効にしてください
- 適切なバックアップ保持期間を設定する — コンプライアンス要件に応じて 7~35 日に設定してください
- プライベート エンドポイントを使用する — セキュアなネットワークアクセスのために使用します
- サーバーのパラメーターを調整する — ワークロードの特性に基づいて調整してください
- 読み取りレプリカを使用する — 読み取りが多いワークロード向けです
- 開発/テスト用サーバーを停止する — 使用していないときのコストを節約できます
エラー処理
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}");
}
接続文字列
サーバーの作成後、次の方法で接続します。
// Supply password from a secret provider; never log the resulting connection string.
// Npgsql connection string
string connectionString = $"Host={server.Data.FullyQualifiedDomainName};" +
"Database=myappdb;" +
"Username=pgadmin;" +
$"Password={Environment.GetEnvironmentVariable("POSTGRES_ADMIN_PASSWORD") ?? throw new InvalidOperationException("Password required")};" +
"SSL Mode=VerifyFull;";
// 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=VerifyFull;";
関連 SDK
| SDK | 用途 | インストール |
|---|---|---|
Azure.ResourceManager.PostgreSql | PostgreSQL の管理(この SDK) | dotnet add package Azure.ResourceManager.PostgreSql |
Azure.ResourceManager.MySql | MySQL の管理 | dotnet add package Azure.ResourceManager.MySql |
Npgsql | PostgreSQL データアクセス | dotnet add package Npgsql |
Npgsql.EntityFrameworkCore.PostgreSQL | EF Core プロバイダー | dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL |
参考リンク
使用するタイミング
このスキルは、概要に記載されているワークフローまたはアクションを実行する場合に適用できます。
制限事項
- このスキルは、タスクが上記の説明の範囲に明確に当てはまる場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全性の境界、または成功基準が不足している場合は、作業を中断して確認を求めてください。