mcpField
A
azure-resource-manager-postgresql-dotnet

azure-resource-manager-postgresql-dotnet

github.com/sickn33クラウド・DevOps48.7k58 回インストール今日更新
リポジトリ

azure-resource-manager-postgresql-dotnet について

azure-resource-manager-postgresql-dotnetは、Azure Resource Managerを通じてAzure Database for PostgreSQL Flexible Serverを管理する.NETスキルです。サーバー、データベース、ファイアウォール、バックアップ、ライフサイクル操作を扱います。

主な機能

  1. 01Flexible Serverインスタンスの作成
  2. 02データベースとファイアウォール規則の管理
  3. 03サーバーパラメーターと管理者の更新
  4. 04バックアップと復元ポイントの確認
  5. 05読み取りレプリカの作成
  6. 06サーバーの停止・起動・拡張・削除

活用シーン

  1. 01PostgreSQL Flexible Serverのプロビジョニング
  2. 02サーバー設定やサイズの変更
  3. 03復旧前のバックアップ確認
  4. 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);

主な型のリファレンス

型用途
PostgreSqlFlexibleServerResourceFlexible Server インスタンス
PostgreSqlFlexibleServerDataサーバー構成データ
PostgreSqlFlexibleServerCollectionサーバーのコレクション
PostgreSqlFlexibleServerDatabaseResourceサーバー内のデータベース
PostgreSqlFlexibleServerFirewallRuleResourceIP ファイアウォールルール
PostgreSqlFlexibleServerConfigurationResourceサーバーパラメーター
PostgreSqlFlexibleServerBackupResourceバックアップのメタデータ
PostgreSqlFlexibleServerActiveDirectoryAdministratorResourceEntra ID 管理者
PostgreSqlFlexibleServerSkuSKU(コンピューティング階層+サイズ)
PostgreSqlFlexibleServerStorageストレージ構成
PostgreSqlFlexibleServerHighAvailabilityHA 構成
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 11Ver11
PostgreSQL 12Ver12
PostgreSQL 13Ver13
PostgreSQL 14Ver14
PostgreSQL 15Ver15
PostgreSQL 16Ver16

高可用性モード

モード説明
DisabledHA なし(単一サーバー)
SameZone同じ可用性ゾーン内での HA
ZoneRedundant複数の可用性ゾーンにまたがる HA

ベストプラクティス

  1. Flexible Server を使用する — Single Server は非推奨です
  2. ゾーン冗長 HA を有効にする — 本番ワークロード向けです
  3. DefaultAzureCredential を使用する — 接続文字列よりも優先してください
  4. Entra ID 認証を構成する — SQL 認証だけを使用するより安全です
  5. 認証方法を慎重に選択する — 対応している場合は Entra 専用を優先し、パスワード認証は文書化された要件がある場合にのみ有効にしてください
  6. 適切なバックアップ保持期間を設定する — コンプライアンス要件に応じて 7~35 日に設定してください
  7. プライベート エンドポイントを使用する — セキュアなネットワークアクセスのために使用します
  8. サーバーのパラメーターを調整する — ワークロードの特性に基づいて調整してください
  9. 読み取りレプリカを使用する — 読み取りが多いワークロード向けです
  10. 開発/テスト用サーバーを停止する — 使用していないときのコストを節約できます

エラー処理

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.PostgreSqlPostgreSQL の管理(この SDK)dotnet add package Azure.ResourceManager.PostgreSql
Azure.ResourceManager.MySqlMySQL の管理dotnet add package Azure.ResourceManager.MySql
NpgsqlPostgreSQL データアクセスdotnet add package Npgsql
Npgsql.EntityFrameworkCore.PostgreSQLEF Core プロバイダーdotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

参考リンク

リソースURL
NuGet パッケージhttps://www.nuget.org/packages/Azure.ResourceManager.PostgreSql
API リファレンスhttps://learn.microsoft.com/dotnet/api/azure.resourcemanager.postgresql
製品ドキュメントhttps://learn.microsoft.com/azure/postgresql/flexible-server/
GitHub ソースhttps://github.com/Azure/azure-sdk-for-net/tree/main/sdk/postgresql/Azure.ResourceManager.PostgreSql

使用するタイミング

このスキルは、概要に記載されているワークフローまたはアクションを実行する場合に適用できます。

制限事項

  • このスキルは、タスクが上記の説明の範囲に明確に当てはまる場合にのみ使用してください。
  • 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全性の境界、または成功基準が不足している場合は、作業を中断して確認を求めてください。

コメント