含まれているもの: ホスティング統合 —および—
Client 統合
PostgreSQL は、信頼性、機能の堅牢性、およびパフォーマンスに対する高い評価を得ている、長年にわたるアクティブな開発を行う、強力なオープン ソースのオブジェクト リレーショナル データベース システムです。
.NET Aspire
PostgreSQL 統合により、既存の PostgreSQL データベースに接続したり、.NETを使用して docker.io/library/postgres
から新しいインスタンスを作成したりできます。
ホスティング統合
PostgreSQL ホスティング統合は、さまざまな PostgreSQL リソースを次の種類としてモデル化します。
これらの型と API にアクセスして、アプリ ホスト プロジェクト内のリソースとして表現するには、📦Aspire.Hosting の NuGet パッケージPostgreSQL をインストールします。
dotnet add package Aspire.Hosting.PostgreSQL
詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。
PostgreSQLサーバーリソースを追加する
アプリ ホスト プロジェクトで、AddPostgres インスタンスの builder
を呼び出して PostgreSQL サーバー リソースを追加し、次の例に示すように、AddDatabase インスタンスで postgres
を呼び出してデータベース リソースを追加します。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
.NET
.NET Aspire 前の例に示すように、docker.io/library/postgres
イメージを使用してコンテナー イメージをアプリ ホストに追加すると、ローカル コンピューターに新しい PostgreSQL サーバー インスタンスが作成されます。
PostgreSQL サーバーとデータベース インスタンス (postgresdb
変数) への参照を使用して、依存関係をExampleProject
に追加します。
データベース リソースをアプリ モデルに追加すると、データベースがまだ存在しない場合は作成されます。 データベースの作成は、 アプリ ホストイベント API (特に ResourceReadyEvent) に依存します。 つまり、 postgres
リソースの 準備ができたら、イベントが発生し、データベース リソースが作成されます。
PostgreSQL サーバーリソースには、username
の "postgres"
として、password
メソッドを使用してランダムに生成された CreateDefaultPasswordParameter を含む既定の資格情報が含まれています。
WithReference メソッドは、ExampleProject
という名前の "messaging"
で接続を構成します。 詳細については、「コンテナー リソースのライフサイクルの」を参照してください。
ヒント
既存の PostgreSQL サーバーに接続する場合は、代わりに AddConnectionString を呼び出します。 詳細については、「既存のリソースを参照する」を参照してください。
PostgreSQL リソースをデータベース スクリプトとともに追加する
既定では、 PostgresDatabaseResourceを追加すると、次のスクリプトに依存してデータベースが作成されます。
CREATE DATABASE "<QUOTED_DATABASE_NAME>"
既定のスクリプトを変更するには、データベース リソース ビルダーで WithCreationScript
メソッドの呼び出しをチェーンします。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var databaseName = "app_db";
var creationScript = $$"""
-- Create the database
CREATE DATABASE {{databaseName}};
""";
var db = postgres.AddDatabase(databaseName)
.WithCreationScript(creationScript);
builder.AddProject<Projects.ExampleProject>()
.WithReference(db)
.WaitFor(db);
// After adding all resources, run the app...
前の例では、 app_db
という名前のデータベースを作成します。 このスクリプトは、データベース リソースの作成時に実行されます。 スクリプトは文字列として WithCreationScript
メソッドに渡され、 PostgreSQL リソースのコンテキストで実行されます。
注
作成スクリプトを使用する場合、データベース への接続コマンド (\c
) はサポートされていません。
PostgreSQL pgAdminリソースを追加する
PostgreSQL メソッドを使用して builder
に AddPostgres
リソースを追加する場合は、WithPgAdmin への呼び出しをチェーンして、dpage/pgadmin4 コンテナーを追加できます。 このコンテナーは、Web ベースの管理ダッシュボードを提供する、PostgreSQL データベース用のクロスプラットフォーム クライアントです。 次の例を考えてみましょう。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgAdmin();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
上記のコードは、docker.io/dpage/pgadmin4
イメージに基づいてコンテナーを追加します。 コンテナーは、PostgreSQL サーバーとデータベース リソースを管理するために使用されます。
WithPgAdmin
メソッドは、PostgreSQL データベース用の Web ベースの管理者ダッシュボードを提供するコンテナーを追加します。
pgAdmin ホスト ポートを構成する
pgAdmin コンテナーのホスト ポートを構成するには、WithHostPort サーバー リソースで PostgreSQL メソッドを呼び出します。 次の例は、pgAdmin コンテナーのホスト ポートを構成する方法を示しています。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgAdmin(pgAdmin => pgAdmin.WithHostPort(5050));
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
上記のコードでは、pgAdmin コンテナーのホスト ポートを追加して構成します。 それ以外の場合、ホスト ポートはランダムに割り当てられます。
pgWeb リソース PostgreSQL 追加する
PostgreSQL メソッドを使用して builder
リソースを AddPostgres
に追加する場合は、WithPgWeb への呼び出しをチェーンして、sosedoff/pgweb コンテナーを追加できます。 このコンテナーは、Web ベースの管理ダッシュボードを提供する、PostgreSQL データベース用のクロスプラットフォーム クライアントです。 次の例を考えてみましょう。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgWeb();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
上記のコードは、docker.io/sosedoff/pgweb
イメージに基づいてコンテナーを追加します。 登録されているすべての PostgresDatabaseResource インスタンスは、インスタンスごとに構成ファイルを作成するために使用され、各構成は、pgweb コンテナー ブックマーク ディレクトリにバインドされます。 詳細については、PgWeb ドキュメントの Server 接続ブックマークを参照してください。
pgWeb ホスト ポートを構成する
pgWeb コンテナーのホスト ポートを構成するには、WithHostPort サーバー リソースで PostgreSQL メソッドを呼び出します。 次の例は、pgAdmin コンテナーのホスト ポートを構成する方法を示しています。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgWeb(pgWeb => pgWeb.WithHostPort(5050));
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
上記のコードでは、pgWeb コンテナーのホスト ポートを追加して構成します。 それ以外の場合、ホスト ポートはランダムに割り当てられます。
データ ボリュームを持つ PostgreSQL サーバー リソースを追加する
PostgreSQL サーバー リソースにデータ ボリュームを追加するには、WithDataVolume サーバー リソースで PostgreSQL メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithDataVolume(isReadOnly: false);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
データ ボリュームは、コンテナーのライフサイクル外に PostgreSQL サーバー データを保持するために使用されます。 データ ボリュームは、/var/lib/postgresql/data
サーバー コンテナーの PostgreSQL パスにマウントされ、name
パラメーターが指定されていない場合は、名前がランダムに生成されます。 データボリュームおよび、それがバインドマウントよりも優先される理由についての詳細は、をご覧ください。
重要
.NET Aspire PostgreSQL統合を含む一部のデータベース統合では、Azure Container Apps (ACA) へのデプロイ後にデータ ボリュームを正常に使用できません。 これは、ACA は Server メッセージ ブロック (SMB) を使用してコンテナーをデータ ボリュームに接続し、一部のシステムではこの接続を使用できないためです。 Aspire ダッシュボードでは、この問題の影響を受けるデータベースの状態は [アクティブ化] または [アクティブ化に失敗しました] になっていますが、[実行中] と表示されることはありません。
この問題を解決するには、マネージド サービス Azure Database for PostgreSQL を使用して、ACA 内のコンテナーではなくデプロイされたデータベースをホストします。これは、この問題に関係なく推奨される方法です。 次のアプリ ホスト コードは、データベースを Azure Database for PostgreSQL にデプロイし、開発中にデータ ボリュームを含むコンテナーとして実行する方法を示しています。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
.RunAsContainer(container =>
{
container.WithDataVolume();
});
builder.Build().Run();
PostgreSQL サーバーリソースにデータバインドマウントを追加する
PostgreSQL サーバー リソースにデータ バインド マウントを追加するには、WithDataBindMount メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithDataBindMount(
source: @"C:\PostgreSQL\Data",
isReadOnly: false);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
重要
データ バインド マウント、パフォーマンス、移植性、およびセキュリティが向上し、運用環境に適した ボリュームと比較して機能が制限されています。 ただし、バインド マウントを使用すると、ホスト システム上のファイルに直接アクセスして変更できるため、リアルタイムの変更が必要な開発とテストに最適です。
データ バインド マウントは、ホスト マシンのファイルシステムに依存して、コンテナーの再起動時に PostgreSQL サーバー データを保持します。 データ バインド マウントは、C:\PostgreSQL\Data
サーバー コンテナー内のホスト コンピューター上の Windows 上の /PostgreSQL/Data
(または Unix上の PostgreSQL) パスにマウントされます。 データバインドマウントの詳細については、「Docker ドキュメント:バインド マウント」を参照してください。
initバインドマウントでPostgreSQLサーバーリソースを追加する
PostgreSQL サーバー リソースに init バインド マウントを追加するには、WithInitBindMount メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithInitBindMount(@"C:\PostgreSQL\Init");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
init バインド マウントは、ホスト コンピューターのファイルシステムに依存して、コンテナー PostgreSQL フォルダーを使用して サーバー データベースを初期化します。 このフォルダーは、postgres-data フォルダーの作成後に、実行可能なシェル スクリプトまたは .sql コマンド ファイルを実行する初期化に使用されます。 init バインド マウントは、C:\PostgreSQL\Init
サーバー コンテナー内のホスト コンピューター上の Windows 上の /PostgreSQL/Init
(または Unixの PostgreSQL) パスにマウントされます。
パラメーター付きでサーバーリソース PostgreSQL を追加する
コンテナー イメージで使用されるユーザー名とパスワードを明示的に指定する場合は、これらの資格情報をパラメーターとして指定できます。 次の代替例を考えてみましょう。
var builder = DistributedApplication.CreateBuilder(args);
var username = builder.AddParameter("username", secret: true);
var password = builder.AddParameter("password", secret: true);
var postgres = builder.AddPostgres("postgres", username, password);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
パラメーターの指定の詳細については、「外部パラメーターの
ホスティング統合の正常性チェック
PostgreSQL ホスティング統合により、PostgreSQL サーバー リソースの正常性チェックが自動的に追加されます。 正常性チェックでは、PostgreSQL サーバーが実行されていること、およびサーバーへの接続を確立できることを確認します。
ホスティング統合は、📦 AspNetCore.HealthChecks.Npgsql NuGet パッケージに依存します。
Client 統合
.NET Aspire PostgreSQL クライアント統合を開始するには、クライアントを利用するアプリケーションプロジェクトに、📦AspireNpgsql NuGet パッケージをインストールしてください。このプロジェクトは PostgreSQL クライアントを使用するものです。 PostgreSQL クライアント統合は、との対話に使用できる PostgreSQL インスタンスを登録します。
dotnet add package Aspire.Npgsql
Npgsql クライアントを追加する
クライアントを使用するプロジェクトの Program.cs ファイルで、任意の AddNpgsqlDataSource で IHostApplicationBuilder 拡張メソッドを呼び出して、依存関係挿入コンテナーを介して使用する NpgsqlDataSource
を登録します。 このメソッドは、接続名パラメーターを受け取ります。
builder.AddNpgsqlDataSource(connectionName: "postgresdb");
ヒント
connectionName
パラメーターは、アプリ ホスト プロジェクトに PostgreSQL サーバー リソースを追加するときに使用する名前と一致する必要があります。 詳細については、「PostgreSQL サーバー リソースを追加」を参照してください。
ビルダーに NpgsqlDataSource
を追加した後、依存関係の挿入を使用して NpgsqlDataSource
インスタンスを取得できます。 たとえば、サンプル サービスからデータ ソース オブジェクトを取得するには、それをコンストラクター パラメーターとして定義し、ExampleService
クラスが依存関係挿入コンテナーに登録されていることを確認します。
public class ExampleService(NpgsqlDataSource dataSource)
{
// Use dataSource...
}
依存関係の挿入についての詳細は、.NET "依存関係の挿入"を参照してください。
キー付き Npgsql クライアントを追加する
接続名が異なる複数の NpgsqlDataSource
インスタンスを登録する場合があります。 キー付き Npgsql クライアントを登録するには、AddKeyedNpgsqlDataSource メソッドを呼び出します。
builder.AddKeyedNpgsqlDataSource(name: "chat");
builder.AddKeyedNpgsqlDataSource(name: "queue");
その後、依存関係の挿入を使用して NpgsqlDataSource
インスタンスを取得できます。 たとえば、サービスの例から接続を取得するには、次のようにします。
public class ExampleService(
[FromKeyedServices("chat")] NpgsqlDataSource chatDataSource,
[FromKeyedServices("queue")] NpgsqlDataSource queueDataSource)
{
// Use data sources...
}
キー付きサービスの詳細については、「.NET 依存関係の挿入: キー付きサービスの」を参照してください。
設定
.NET Aspire PostgreSQL 統合には、プロジェクトの要件と規則を満たす複数の構成アプローチとオプションが用意されています。
接続文字列を使用する
ConnectionStrings
構成セクションの接続文字列を使用する場合は、AddNpgsqlDataSource メソッドを呼び出すときに接続文字列の名前を指定できます。
builder.AddNpgsqlDataSource("postgresdb");
その後、接続文字列は ConnectionStrings
構成セクションから取得されます。
{
"ConnectionStrings": {
"postgresdb": "Host=myserver;Database=postgresdb"
}
}
詳細については、ConnectionStringを参照してください。
構成プロバイダーを使用する
.NET Aspire
PostgreSQL 統合では、Microsoft.Extensions.Configurationがサポートされます。
NpgsqlSettings キーを使用して、appsettings.json またはその他の構成ファイルから Aspire:Npgsql
を読み込みます。 いくつかのオプションを構成する appsettings.json の例:
次の例は、使用可能なオプションの一部を構成する appsettings.json ファイルを示しています。
{
"Aspire": {
"Npgsql": {
"ConnectionString": "Host=myserver;Database=postgresdb",
"DisableHealthChecks": false,
"DisableTracing": true,
"DisableMetrics": false
}
}
}
完全な PostgreSQL クライアント統合 JSON スキーマについては、Aspireを参照してください。Npgsql/ConfigurationSchema.json.
インライン デリゲートを使用する
また、Action<NpgsqlSettings> configureSettings
デリゲートを渡して、一部またはすべてのオプションをインラインで設定することもできます。たとえば、正常性チェックを無効にできます。
builder.AddNpgsqlDataSource(
"postgresdb",
static settings => settings.DisableHealthChecks = true);
Client 統合ヘルスチェック
既定では、.NET.NET Aspireクライアント統合 すべてのサービスで 正常性チェック 有効になっています。 同様に、多くの .NET.NET Aspireホスティング統合 もヘルスチェックエンドポイントを有効にします。 詳細については、以下を参照してください。
- C#でのアプリ正常性チェック .NET
- ASP.NET Core での健康診断チェック
- 基になる
NpgSqlHealthCheck
データベースに対してコマンドが正常に実行できることを確認する Postgresを追加します。 -
/health
HTTP エンドポイントと統合します。このエンドポイントは、アプリがトラフィックを受け入れる準備ができていると見なされるために、登録されているすべての正常性チェックに合格する必要があります
可観測性とテレメトリ
伐採
.NET Aspire PostgreSQL 統合では、次のログ カテゴリが使用されます。
Npgsql.Connection
Npgsql.Command
Npgsql.Transaction
Npgsql.Copy
Npgsql.Replication
Npgsql.Exception
トレース作業
.NET Aspire PostgreSQL 統合では、OpenTelemetryを使用して次のトレース アクティビティが出力されます。
Npgsql
メトリック
.NET Aspire PostgreSQL 統合では、OpenTelemetryを使用して次のメトリックが出力されます。
- Npgsql:
ec_Npgsql_bytes_written_per_second
ec_Npgsql_bytes_read_per_second
ec_Npgsql_commands_per_second
ec_Npgsql_total_commands
ec_Npgsql_current_commands
ec_Npgsql_failed_commands
ec_Npgsql_prepared_commands_ratio
ec_Npgsql_connection_pools
ec_Npgsql_multiplexing_average_commands_per_batch
ec_Npgsql_multiplexing_average_write_time_per_batch
関連項目
.NET Aspire