.NET Aspire マニフェストを使用して接続文字列をカスタマイズする
Visual Studio や Azure Developer CLI などの配置ツールを使用して、.NET Aspire ソリューションの内容を記述するマニフェスト ファイルを作成します。 配置をカスタマイズする場合は、マニフェスト ファイルを直接変更できます。
あなたが勤めるアウトドア用品店では、既存の Azure Cache for Redis インスタンスを使用して、Web アプリ マイクロサービスの出力キャッシュをホストすることにしました。 あなたは Web アプリ サービスが Azure Cache for Redis の正しいインスタンスに接続していることを確認する必要があります。
このユニットでは、.NET Aspire マニフェスト ファイル内のバッキング サービスへの接続文字列を変更する方法について説明します。
.NET CLI を使用してマニフェスト ファイルを生成する
ローカル開発およびデバッグ中に、.NET Aspire ではマニフェスト ファイルは作成されません。 配置を行うときは、.NET で、マイクロサービス、バッキング サービス、構成を含む .NET Aspire ソリューションの内容を記述する必要があります。 マニフェスト ファイルはこの目的のために使われます。 ここにソリューションを JSON 形式で記述します。
マニフェスト ファイルを作成するには、Visual Studio と Azure Developer CLI の両方で、ターゲットを指定して .NET CLI run
コマンドを実行します。 同じコマンドを手動で実行して、次のように独自のマニフェスト ファイルを作成できます。
dotnet run --project eShop.AppHost\eShop.AppHost.csproj `
--publisher manifest `
--output-path ../aspire-manifest.json
Note
必ず --project
オプションを使用してアプリ ホスト プロジェクトを指定します。
このコマンドによって次のテキストのような出力が生成されます。
Building...
info: Aspire.Hosting.DistributedApplication[0]
Aspire version: 8.0.1+a6e341ebbf956bbcec0dda304109815fcbae70c9
info: Aspire.Hosting.Publishing.ManifestPublisher[0]
Published manifest to: C:\repos\eShop\aspire-manifest.json
起動プロファイルを使用して dotnet
コマンドを実行することもできます。 起動プロファイルは、.NET プロジェクトの実行時にそれを構成する設定のグループです。 たとえば、.NET Aspire Starter テンプレートを使用すると、次の起動プロファイルが作成されます。
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:17170;http://localhost:15281",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21147",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22239"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:15281",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19197",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20233"
}
}
}
起動プロファイルを追加して、次のテキストのような JSON コードを含むマニフェスト ファイルを作成します。
"profiles": {
"generate-manifest": {
"commandName": "Project",
"launchBrowser": false,
"dotnetRunMessages": true,
"commandLineArgs": "--publisher manifest --output-path aspire-manifest.json"
}
}
Visual Studio では、デバッグを開始するときに generate-manifest プロファイルを選択できます。 コマンド ラインで、--launch-profile
オプションを使用します。
dotnet run --launch-profile generate-manifest
マニフェスト ファイルの形式
マニフェストは、resources
という 1 つの最上位要素がある JSON ファイルです。 そのオブジェクト内には、マイクロサービスとバッキング サービスごとに 1 つのオブジェクトがあります。 これらの各オブジェクトの設定には、接続文字列、環境変数、コンテナー イメージ名が含まれます。
変更を加えていない .NET Aspire Starter テンプレートのマニフェストの例を次に示します。 このソリューションでは Redis Cache を使用します。
{
"resources": {
"cache": {
"type": "container.v0",
"connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
"image": "docker.io/library/redis:7.2",
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"targetPort": 6379
}
}
},
"apiservice": {
"type": "project.v0",
"path": "AspireStarter.ApiService/AspireStarter.ApiService.csproj",
"env": {
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
"ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http"
},
"https": {
"scheme": "https",
"protocol": "tcp",
"transport": "http"
}
}
},
"webfrontend": {
"type": "project.v0",
"path": "AspireStarter.Web/AspireStarter.Web.csproj",
"env": {
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
"ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true",
"ConnectionStrings__cache": "{cache.connectionString}",
"services__apiservice__http__0": "{apiservice.bindings.http.url}",
"services__apiservice__https__0": "{apiservice.bindings.https.url}"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http",
"external": true
},
"https": {
"scheme": "https",
"protocol": "tcp",
"transport": "http",
"external": true
}
}
}
}
}
接続文字列とバインド参照
このマニフェスト例には、次の 3 つのリソースがあります。
webfrontend
:このリソースは、顧客に Web インターフェイスを提供するマイクロサービスです。apiservice
:このリソースは、webfrontend
から呼び出される REST API です。 テンプレートでは、この呼び出しは気象データの取得に使用されます。cache
:このリソースは Redis Cache であり、webfrontend
マイクロサービスのパフォーマンスを最適化するために使用されます。
3 つのリソースのそれぞれに、そのリソースへの接続に使用できるプロトコルを指定する bindings
セクションがあることに注目してください。
アプリ ホストの Program.cs ファイルでは、webfrontend
プロジェクトは cache
と apiservice
の両方に依存します。
var cache = builder.AddRedis("cache");
var apiService = builder.AddProject<Projects.AspireStarter_ApiService>("apiservice");
builder.AddProject<Projects.AspireStarter_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(cache)
.WithReference(apiService);
マニフェスト ファイルでは、これらの依存関係は環境変数として表現されます。
"env": {
"ConnectionStrings__cache": "{cache.connectionString}",
"services__apiservice__http__0": "{apiservice.bindings.http.url}",
"services__apiservice__https__0": "{apiservice.bindings.https.url}"
}
依存関係では、マニフェスト ファイルの構造を参照するプレースホルダー文字列が使用されます。 たとえば、3 つ目の依存関係は API サービスの HTTPS バインディングを参照します。