.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 プロジェクトは cacheapiservice の両方に依存します。

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}"
}

.NET Aspire プロジェクトの依存関係によってマニフェスト ファイル内の参照がどのように生成されるかを示すダイアグラム。

依存関係では、マニフェスト ファイルの構造を参照するプレースホルダー文字列が使用されます。 たとえば、3 つ目の依存関係は API サービスの HTTPS バインディングを参照します。

.NET Aspire マニフェスト ファイルでプレースホルダーがどのように構築されるかを示すダイアグラム。

詳細情報