次の方法で共有


.NET .NET Aspire 9.0 の新機能

9.0 は、の次の主要な一般提供 (GA) リリースです。両方のサポートしています。

  • .NET 8.0 長期サポート (LTS) または
  • .NET 9.0 Standard Term Support (標準用語サポート) (STS)。

手記

.NET 8 または .NET 9 で .NET Aspire 9.0 を使用できます。

このリリースでは、コミュニティから最も要求の多い機能と問題点に対処します。 最高の機能はコミュニティ主導です! コミュニティに参加するには、 Discord にアクセスしてチーム メンバーとチャットし、 GitHubで共同作業を行います。

公式の .NET バージョンと .NET Aspire バージョンのサポートの詳細については、次を参照してください。

.NET .NET Aspire 9 にアップグレードする

以前のバージョンの .NET Aspire から .NET Aspire 9 にアップグレードするには、公式の Upgrade to .NET.NET Aspire 9 ガイドの指示に従ってください。 このガイドでは、既存の .NET Aspire ソリューションを .NET Aspire 9 にアップグレードする方法について詳しく説明します。 手動で行う場合でも、アップグレード アシスタントを使用する場合でも、このガイドはプロセスを短時間で実行します。

ツールの機能強化

.NET Aspire 9 を使用すると、.NET Aspire アプリケーションを開発するように環境を簡単に構成できます。 .NET ワークロードは不要です。 代わりに、.NET.NET Aspire ソリューションのアプリ ホスト プロジェクトに新しい .NET.NET Aspire SDK をインストールします。 詳細については、「.NET.NET Aspire セットアップとツールの」を参照してください。

テンプレートが移動されました

.NET .NET Aspire 9 では、ワークロード経由でインストールされたコンテンツを別の NuGet パッケージに移動します。 これには、新しい .NET.NET Aspire プロジェクトとソリューションを作成するためのテンプレートが含まれます。 これらのテンプレートは、dotnet new install コマンドを使用してインストールされます。 これらは、次のコマンドを実行してインストールできます。

dotnet new install Aspire.ProjectTemplates::9.0.0

アドバイス (if the intended meaning is 'advice') チップ (if the intended meaning is 'gratuity')

.NET .NET Aspire ワークロードが既にインストールされている場合は、--force フラグを渡して既存のテンプレートを上書きする必要があります。 .NET .NET Aspire ワークロードをアンインストールしてください。

詳細については、.NET.NET Aspire テンプレートのを参照してください。

ダッシュボード UX の機能強化と新しい対話機能

.NET .NET Aspire ダッシュボード は、リリースごとに引き続き改善されています。

リソースのライフサイクルを管理する

ダッシュボードで最も要求される機能は、調整された名前付きリソースのライフ サイクルを管理することです。 具体的には、リソースを停止、開始、再起動する機能です。 この機能は、プロジェクト、コンテナー、実行可能ファイルに対して機能します。 これにより、アプリ ホスト全体を再起動しなくても、個々のリソースを再起動できます。 プロジェクト リソースの場合、デバッガーがアタッチされると、再起動時に再アタッチされます。 詳細については、「.NET.NET Aspire ダッシュボード: リソースを停止または開始する」を参照してください。

モバイルと応答性の高いサポート

.NET Aspire ダッシュボードはモバイルに対応し、さまざまな画面サイズに対応し、展開された .NET Aspire アプリケーションの外出先での管理を可能にします。 モバイルでの設定の表示やコンテンツオーバーフローなど、アクセシビリティの改善が行われました。

リソースの詳細における機密性の高いプロパティ、ボリューム、そしてヘルスチェック

リソースの詳細の表示には、いくつかの機能強化が含まれています。

  • プロパティは機密性の高いものとしてマークでき、ダッシュボード UI で自動的にマスクされます。 このセキュリティ機能は、ダッシュボードを他のユーザーと画面共有するときに、誤ってキーやパスワードを公開するのを防ぐのに役立ちます。 たとえば、コンテナー引数は機密情報を渡す可能性があるため、既定ではマスクされます。

  • 構成済みのコンテナー ボリュームは、リソースの詳細に一覧表示されます。

  • .NET .NET Aspire 9 では、健康診断のサポート機能が追加されます。 これらのチェックに関する詳細情報がリソースの詳細ウィンドウに表示され、リソースが異常または低下としてマークされる理由が表示されるようになりました。 健康診断の詳細については、ここを参照してください

カラフルなコンソール ログ

ANSI エスケープ コード、色 (前景と背景) や太字、下線、斜体などのスタイルを制御して、ターミナル内のテキストを書式設定します。 以前は、ダッシュボードのコンソール ログ ページでは、一度に 1 つの ANSI エスケープ コードしかレンダリングできず、複数のコードが結合されたときに失敗していました。 たとえば、赤のテキストを表示できますが、赤と太字の両方のテキストは表示できません。

@mangeg からのコミュニティへの貢献によって、ANSI エスケープ コードのサポートが強化され、この制限が削除されました。

カラフルなコンソール ログ

コンソール ログのもう 1 つの改善点は、サポートされていないエスケープ コードを非表示にすることです。 カーソルの配置やオペレーティング システムとの通信など、テキストの表示に関連しないコードは、この UI では意味をなせず、非表示になります。

ユーザー中心のテレメトリ機能の追加

テレメトリ は、.NET.NET Aspireの重要な側面です。 .NET .NET Aspire 9 では、テレメトリ サービスに多くの新機能が導入されました。

テレメトリ のフィルター処理の改善

トレースは属性値でフィルター処理できます。 たとえば、アプリ内の 1 つのエンドポイントのトレースのみを表示する場合は、HTTP 要求の http.route 属性を指定した値にフィルター処理できます。

テレメトリ フィルター処理では、既存の値のオートコンプリートもサポートされています。 [フィルター の追加] ダイアログ には、ダッシュボードで使用可能な値から選択するためのコンボ ボックスが表示されます。 この機能を使用すると、実際のデータに対するフィルター処理がはるかに簡単になり、自分で値を入力して入力ミスを回避できます。

詳細については、「.NET.NET Aspire ダッシュボード: トレースをフィルター処理する」を参照してください。

複数のリソースからのテレメトリを結合する

リソースに複数のレプリカがある場合、テレメトリをフィルター処理して、すべてのインスタンスのデータを一度に表示できるようになりました。 (application)というラベルが付いた親リソースを選択します。 詳細については、「.NET.NET Aspire ダッシュボード: 複数のリソースからのテレメトリを結合する」を参照してください。

ブラウザー テレメトリのサポート

ダッシュボードでは、HTTP およびクロスオリジン リソース共有 (CORS) 経由の OpenTelemetry プロトコル (OTLP) がサポートされます。 これらの機能により、ブラウザー アプリから .NET Aspire ダッシュボードに OpenTelemetry を送信できるようになります。

たとえば、ブラウザー ベースのシングル ページ アプリ (SPA) では、ブラウザーで作成された構造化されたログ、トレース、メトリックをダッシュボードに送信するように、JavaScript OpenTelemetry SDK を構成できます。 ブラウザーテレメトリは、server テレメトリと共に表示されます。

トレース詳細ページ(ブラウザーテレメトリーを含む)

ブラウザー テレメトリの構成の詳細については、「ブラウザー テレメトリの有効化 ドキュメント」を参照してください。

アプリ ホスト (オーケストレーション)

.NET .NET Aspire アプリ ホスト は、.NET.NET Aspireの 最も重要な 機能の 1 つです。 .NET .NET Aspire 9 では、アプリ ホストに固有のいくつかの新機能が追加されました。

依存関係の待機中

.NET .NET Aspireと共にフォローしている場合は、アプリ ホスト プロジェクトがアプリ モデルを定義する場所であることが既にわかっています。 分散アプリケーション ビルダーを作成し、リソースを追加して構成し、依存関係を表現します。 これで、開始する前に、リソースが別のリソースの を待機 必要があることを指定できます。 これにより、依存関係が "準備完了" の場合にのみリソースを起動することで、起動時の接続エラーを回避できます。

var builder = DistributedApplication.CreateBuilder(args);

var rabbit = builder.AddRabbitMQ("rabbit");

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(rabbit)
       .WaitFor(rabbit); // Don't start "api" until "rabbit" is ready...

builder.Build().Run();

アプリ ホストは、起動すると、api リソースを開始する前に、rabbit リソースの準備が整うのを待ちます。

リソースを待機するために公開されるメソッドは 2 つあります。

  • WaitFor: リソースの準備が整うのを待ってから、別のリソースを開始します。
  • WaitForCompletion: リソースが完了するのを待ってから、別のリソースを開始します。

詳細については、「.NET.NET Aspire アプリ ホスト: リソースの待機」を参照してください。

リソース正常性チェック

WaitFor API は、標準の .NET 正常性チェック を使用して、リソースの準備ができているかどうかを判断します。 しかし、"リソースの準備中" とはどういう意味ですか? 最も良い点は、コンシューマーが既定値を超えて構成できる点です。

リソースが正常性チェックを公開しない場合 (アプリに正常性チェックが登録されていない場合)、アプリ ホストは、依存リソースを開始する前に、リソースが Running 状態になるまで待機します。

HTTP エンドポイントを公開するリソースの場合、HTTP 200 応答の特定のパスをポーリングする正常性チェックを簡単に追加できます。

var builder = DistributedApplication.CreateBuilder(args);

var catalogApi = builder.AddContainer("catalog-api", "catalog-api")
                        .WithHttpEndpoint(targetPort: 8080)
                        .WithHttpHealthCheck("/health");

builder.AddProject<Projects.WebApplication1>("store")
       .WithReference(catalogApi.GetEndpoint("http"))
       .WaitFor(catalogApi);

builder.Build().Run();

前の例では、catalog-api リソースに正常性チェックを追加します。 アプリ ホストは、正常性チェックが正常な状態を返すのを待ってから、store リソースを開始します。 /health エンドポイントから HTTP 200 状態コードが返されたときにリソースの準備ができていることが判断されます。

store catalog-api が正常になるのを待っている間、ダッシュボードのリソースは次のように表示されます。

不健康なリソースを待機してから を開始する

アプリ ホストの正常性チェック メカニズムは、Microsoft.Extensions.Diagnostics.HealthChecks 名前空間からの IHealthChecksBuilder 実装に基づいています。

ダッシュボードに表示される健康診断のレポート データです。

ダッシュボードのリソース詳細ビューでヘルスチェックの詳細を

カスタムヘルスチェックの作成は簡単です。 まず正常性チェックを定義し、その名前を適用するリソースに関連付けます。

var builder = DistributedApplication.CreateBuilder(args);

var healthyAfter = DateTime.Now.AddSeconds(20);

builder.Services.AddHealthChecks().AddCheck(
    "delay20secs",
    () => DateTime.Now > healthyAfter 
        ? HealthCheckResult.Healthy() 
        : HealthCheckResult.Unhealthy()
    );

var cache = builder.AddRedis("cache")
                   .WithHealthCheck("delay20secs");

builder.AddProject<Projects.MyApp>("myapp")
       .WithReference(cache)
       .WaitFor(cache);

前の例では、cache リソースに正常性チェックを追加します。このリソースでは、アプリ ホストの起動後、最初の 20 秒間は異常として報告されます。 そのため、myapp リソースは開始するまで 20 秒間待機し、cache リソースが正常であることを確認します。

AddCheck メソッドと WithHealthCheck メソッドは、正常性チェックを作成して特定のリソースに関連付ける簡単なメカニズムを提供します。

永続的なコンテナー

アプリ ホストでは、永続的な コンテナー サポートされるようになりました。 永続的なコンテナーは、コンテナーの典型的なライフサイクルから逸脱して、.NET.NET Aspire オーケストレーションされたアプリとは異なります。 .NET Aspire オーケストレーターによって作成 作成され、 (まだ使用できない場合) は開始されますが、.NET Aspireによって破棄されません。

これは、アプリ ホストが停止した後でもコンテナーを実行し続ける場合に便利です。

大事な

これらのコンテナーを削除するには、コンテナー ランタイムを使用してコンテナーを手動で停止する必要があります。

永続的な有効期間を持つ IResourceBuilder<ContainerResource> を定義するには、WithLifetime メソッドを呼び出し、ContainerLifetime.Persistent渡します。

var builder = DistributedApplication.CreateBuilder(args);

var queue = builder.AddRabbitMQ("rabbit")
                   .WithLifetime(ContainerLifetime.Persistent);

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(queue)
       .WaitFor(queue);

builder.Build().Run();

ダッシュボードには、ピン アイコンが付いた永続的なコンテナーが表示されます。

永続的なコンテナー

アプリ ホストが停止した後、コンテナーは引き続き実行されます。

Docker デスクトップが RabbitMQを示す。

コンテナー永続化メカニズムは、コンテナーを再作成するタイミングを特定しようとします。 たとえば、コンテナーの環境が変更された場合、リソースの入力構成が変更された場合にコンテナーを手動で停止する必要がないように、コンテナーが再起動されます。

リソース コマンド

アプリ ホストでは、リソースへのカスタム コマンドの追加がサポートされています。 これは、アプリ ホストでネイティブにサポートされていないカスタム機能を追加する場合に便利です。 多くの場合、リソースにカスタム拡張メソッドを公開すると役立つ可能性があります。 .NET .NET Aspire Community Toolkit は、これらの拡張機能を共有するのに適した場所です。

カスタム コマンドを定義すると、ユーザー エクスペリエンス機能としてダッシュボードで使用できます。

大事な

これらの .NET.NET Aspire ダッシュボード コマンドは、ダッシュボードをローカルで実行する場合にのみ使用できます。 Azure Container Appsでダッシュボードを実行している場合は使用できません。

カスタム リソース コマンドの作成の詳細については、「方法: .NET.NET Aspireでカスタム リソース コマンドを作成する」を参照してください。

コンテナー ネットワーク

アプリ ホストは、すべてのコンテナーを default-aspire-networkという名前の共通ネットワークに追加するようになりました。 これは、ホスト ネットワークを経由せずにコンテナー間で通信する場合に便利です。 これにより、コンテナーがコンテナー名を使用して相互に通信できるため、docker 作成からアプリ ホストへの移行も容易になります。

イベント モデル

イベント モデルを使用すると、開発者はアプリケーションとリソースのライフサイクルにフックできます。 これは、アプリケーションのライフサイクル内の特定のポイントでカスタム コードを実行する場合に便利です。 イベントをサブスクライブするには、グローバル イベントやリソースごとのイベントなど、さまざまな方法があります。

グローバル イベント:

  • BeforeStartEvent: アプリケーションの起動前にトリガーされるイベント。 これは、アプリ モデルへの変更が最後に観察される場所です。 これは、"実行" モードと "発行" モードの両方で実行されます。 これはブロック イベントです。つまり、すべてのハンドラーが完了するまでアプリケーションは開始されません。
  • AfterResourcesCreatedEvent: リソースの作成後にトリガーされるイベント。 これは実行モードでのみ実行されます。
  • AfterEndpointsAllocatedEvent: エンドポイントがすべてのリソースに割り当てられた後にトリガーされるイベント。 これは実行モードでのみ実行されます。

グローバル イベントは、アプリ ホストのライフ サイクル イベントに似ています。 詳細については、「アプリ ホストのライフ サイクル」を参照してください。

リソース単位のイベント :

  • BeforeResourceStartedEvent: 1 つのリソースが開始される前にトリガーされるイベント。 これは実行モードでのみ実行されます。 これはブロック イベントです。つまり、すべてのハンドラーが完了するまでリソースは開始されません。
  • ConnectionStringAvailableEvent: リソースに接続文字列が使用可能な場合にトリガーされるイベント。 これは実行モードでのみ実行されます。
  • ResourceReadyEvent: リソースを使用する準備ができたときにトリガーされるイベント。 これは実行モードでのみ実行されます。

詳細については、「でのイベントの 」を参照してください。

統合

.NET .NET Aspire は、お気に入りのサービスやツールを簡単に使い始める統合を引き続き追加します。 詳細については、.NET.NET Aspire 統合の概要を参照してください。

Redis Insight

Redis リソースでは、Redis Insights のサポートを利用できます。

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRedis("redis")
       .WithRedisInsight(); // Starts a Redis Insight container image
                            // that is pre-configured to work with the
                            // Redis instance.

WithRedisInsight 拡張メソッドは、複数の Redis リソースに適用でき、それぞれが Redis Insight ダッシュボードに表示されます。

複数の インスタンス を示す Insight ダッシュボード

詳細については、「Insightsを使用して Redis リソース Redis 追加する」を参照してください。

OpenAI (プレビュー)

.NET Aspire 9 以降では、最新の公式 OpenAI dotnet ライブラリを直接使用できる追加の OpenAI 統合が利用できます。 client 統合は、OpenAIClient をサービス コレクション内のシングルトン サービスとして登録します。 client を使用して、OpenAIREST API を操作できます。

さらに、既に使用可能な .NET AspireAzureOpenAI 統合 が改善され、新しい AddOpenAIClientFromConfiguration(IHostApplicationBuilder, String) ビルダー メソッドを使用して、Azure AI OpenAI サービスまたは専用の OpenAIREST API のいずれかに対して OpenAIClient を柔軟に構成できます。 次の例では、接続文字列が AzureAzure AI OpenAI サービス用であるかどうかを検出し、最も適切な OpenAIClient インスタンスを自動的に登録します。

builder.AddOpenAIClientFromConfiguration("openai");

たとえば、openai 接続が Endpoint=https://{account}.azure.com;Key={key}; のように見えた場合、ドメイン名が原因で Azure AI OpenAIclient を登録できる可能性があると推測されます。 それ以外の場合は、一般的な OpenAIClient が使用されます。

詳細については、Azureに依存しない client 解決 を参照してください。

MongoDB

AddMongoDB(IDistributedApplicationBuilder, String, Nullable<Int32>, IResourceBuilder<ParameterResource>, IResourceBuilder<ParameterResource>) 拡張メソッドを使用する場合の MongoDB ユーザー名とパスワードの指定のサポートを追加しました。 指定しない場合、ランダムなユーザー名とパスワードが生成されますが、パラメーター リソースを使用して手動で指定できます。

var builder = DistributedApplication.CreateBuilder(args);

var username = builder.AddParameter("mongousername");
var password = builder.AddParameter("mongopassword", secret: true);

var db = builder.AddMongo("db", username, password);

重要な Azure の改善

以降のセクションでは、.NET Aspire 9 で追加された Azure の機能強化について説明します。 すべての重大な変更の完全な一覧については、 9の破壊的変更 を参照してください。

Azure リソースのカスタマイズ

.NET Aspire 8 では、基になる Azure.Provisioning ライブラリが新しく、安定しているとマークされる前にフィードバックを収集したため、Azure リソースのカスタマイズは試験的としてマークされました。 .NET .NET Aspire 9 では、これらの API が更新され、試験的な属性が削除されました。

Azure リソースの名前付けの破壊的変更

Azure.Provisioning ライブラリの更新の一環として、Azure リソースの既定の名前付けスキームが更新され、さまざまな名前付けポリシーのサポートが強化されました。 ただし、この更新により、リソースの名前付け方法が変更されました。 新しい名前付けポリシーでは、.NET Aspire アプリケーションを 8 から 9 に更新した後、既存の Azure リソースが破棄され、新しい Azure リソースが作成される可能性があります。 .NET .NET Aspire 8 と同じ名前付けポリシーを引き続き使用するには、AppHost Program.csに次のコードを追加します。

var builder = DistributedApplication.CreateBuilder(args);

builder.Services.Configure<AzureProvisioningOptions>(options =>
{
    options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});

Azure SQL、PostgreSQL、および Redis 更新

Azure SQL、PostgreSQL、および Redis リソースは、これらのテクノロジ用のローカル コンテナー リソースがあるため、他の Azure リソースとは異なります。 .NET Aspire 8 では、これらの Azure リソースを作成するには、ローカル コンテナー リソースから始めて、Azure リソースに対して "As" または "PublishAs" を作成する必要がありました。 この設計では問題が発生し、他の API には適合しませんでした。

たとえば、.NET.NET Aspire 8 に次のコードがあるとします。

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddSqlServer("sql")
                 .PublishAsAzureSqlDatabase();

var pgsql = builder.AddPostgres("pgsql")
                   .PublishAsAzurePostgresFlexibleServer();

var cache = builder.AddRedis("cache")
                   .PublishAsAzureSqlDatabase();

.NET .NET Aspire 9 では、これらの API は古いものとしてマークされ、新しい API パターンが実装されました。

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddAzureSqlServer("sql")
                 .RunAsContainer();

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .RunAsContainer();

var cache = builder.AddAzureRedis("cache")
                   .RunAsContainer();
既定では Microsoft Entra ID

.NET Aspire アプリケーションのセキュリティを強化するために、Azure Database for PostgreSQL および Azure Cache for Redis リソースは、既定で Microsoft Entra ID を使用するように更新されました。 これには、これらのリソースに接続する必要があるアプリケーションを変更する必要があります。 Microsoft Entra ID を使用してこれらのリソースに接続するようにアプリケーションを更新するには、次を参照してください。

次の例では、Microsoft Entra ID を使用して Azure リソースに接続するようにアプリケーションを構成する方法を示します。

パスワードまたはアクセス キー認証を使用する必要がある場合 (推奨されません)、次のコードを使用してオプトインできます。

var builder = DistributedApplication.CreateBuilder(args);

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .WithPasswordAuthentication();

var cache = builder.AddAzureRedis("cache")
                   .WithAccessKeyAuthentication();

Azure 関数のサポート (プレビュー)

Azure Functions のサポートは、.NET.NET Aspire イシュー トラッカーで最も広く要求されている機能の 1 つであり、このリリースでプレビュー サポートを導入することに興奮しています。 このサポートを示すために、.NET.NET Aspire を使用して Webhook を作成してデプロイしてみましょう。

作業を開始するには、Visual Studio [新しいプロジェクト] ダイアログを使用して、新しい Azure Functions プロジェクトを作成します。 メッセージが表示されたら、プロジェクトの作成時に [Aspire オーケストレーション に参加] チェック ボックスをオンにします。

新しい .NET AspireAzure Functions プロジェクトを作成します。

アプリ ホスト プロジェクトで、新しい 📦Aspireに PackageReference があることを確認します。ホスティング。Azure.NuGet パッケージ 関数:

<ItemGroup>
    <PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
    <PackageReference Include="Aspire.Hosting.Azure.Functions" Version="9.0.0" />
</ItemGroup>

このパッケージは、アプリホスト内で呼び出して、.NET Aspire ホスト内の Azure Functions プロジェクトを構成できる AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String) API を提供します。

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp");

builder.Build().Run();

この例では、webhook は、入力文字列を Pig Latin に変換する役割を担います。 トリガーの内容を次のコードで更新します。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using System.Text;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;

namespace PigLatinApp;

public class Function1(ILogger<Function1> logger)
{
    public record InputText(string Value);
    public record PigLatinText(string Value);

    [Function("Function1")]
    public IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
        [FromBody] InputText inputText)
    {
        logger.LogInformation("C# HTTP trigger function processed a request.");

        var result = TranslateToPigLatin(inputText.Value);

        return new OkObjectResult(new PigLatinText(result));
    }

    private static string TranslateToPigLatin(string input)
    {
        if (string.IsNullOrEmpty(input))
        {
            return input;
        }

        var words = input.Split(' ');
        StringBuilder pigLatin = new();

        foreach (string word in words)
        {
            if (IsVowel(word[0]))
            {
                pigLatin.Append(word + "yay ");
            }
            else
            {
                int vowelIndex = FindFirstVowelIndex(word);
                if (vowelIndex is -1)
                {
                    pigLatin.Append(word + "ay ");
                }
                else
                {
                    pigLatin.Append(
                        word.Substring(vowelIndex) + word.Substring(0, vowelIndex) + "ay ");
                }
            }
        }

        return pigLatin.ToString().Trim();
    }

    private static int FindFirstVowelIndex(string word)
    {
        for (var i = 0; i < word.Length; i++)
        {
            if (IsVowel(word[i]))
            {
                return i;
            }
        }
        return -1;
    }

    private static bool IsVowel(char c) =>
        char.ToLower(c) is 'a' or 'e' or 'i' or 'o' or 'u';
}

メソッドの最初の 行にブレークポイントを設定し、F5 押して Functions ホストを起動します。 .NET .NET Aspire ダッシュボードが起動すると、次のことがわかります。

Azure Function アプリで実行されている .NET Aspire のスクリーンショット。

.NET .NET Aspire には次の内容があります。

  • ホストによるブックキーピングに使用するエミュレートされた Azure Storage リソースを構成しました。
  • Functions プロジェクトが登録されているターゲットを使用して、Functions ホストをローカルで起動しました。
  • launchSettings で定義されているポート ワイヤードしました。リッスンする関数プロジェクトのjson

任意の任意の HTTP client を使用して、トリガーに要求を送信し、デバッガーの要求本文からバインドされた入力を観察します。

curl --request POST \
  --url http://localhost:7282/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

.NET Aspire ダッシュボードのスクリーンショット: Azure 関数アプリのデバッグ。

これで、アプリケーションを Azure Container Apps (ACA) にデプロイする準備ができました。 デプロイは現在、Azure Functions Worker パッケージと Worker SDK パッケージのプレビュー ビルドによって異なります。 必要に応じて、Functions プロジェクトで参照されているバージョンをアップグレードします。

<ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.0.0-preview2" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.0-preview2" />
</ItemGroup>

また、要求を HTTP トリガーに送信できるように、Azure Functions プロジェクトのパブリック エンドポイントを公開する必要もあります。

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp")
       .WithExternalHttpEndpoints();

CLIを してアプリケーションをデプロイするには、最初に最新バージョンを入手する必要があります。 最新バージョンをインストールするには、バージョンが古い場合に警告が表示されます。 指示に従って最新バージョンに更新します。

インストール後、アプリ ホスト プロジェクトを含むフォルダーに移動し、azd init実行します。

$ azd init

Initializing an app to run on Azure (azd init)

? How do you want to initialize your app? Use code in the current directory

  (✓) Done: Scanning app code in current directory

Detected services:

  .NET (Aspire)
  Detected in: ./PigLatinApp/PigLatinApp.AppHost/PigLatinApp.AppHost.csproj

azd will generate the files necessary to host your app on Azure using Azure Container Apps.

? Select an option Confirm and continue initializing my app
? Enter a new environment name: azfunc-piglatin

Generating files to run your app on Azure:

  (✓) Done: Generating ./azure.yaml
  (✓) Done: Generating ./next-steps.md

SUCCESS: Your app is ready for the cloud!

次に、次の azd upを実行してアプリケーションをデプロイします。

$ azd up 
? Select an Azure Subscription to use: 130. [redacted]
? Select an Azure location to use: 50. (US) West US 2 (westus2)

Packaging services (azd package)


Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: [redacted]
Location: West US 2

  You can view detailed progress in the Azure Portal:
  [redacted]

  (✓) Done: Resource group: rg-azfunc-piglatin (967ms)
  (✓) Done: Container Registry: [redacted] (13.316s)
  (✓) Done: Log Analytics workspace: [redacted] (16.467s)
  (✓) Done: Container Apps Environment: [redacted] (1m35.531s)
  (✓) Done: Storage account: [redacted] (21.37s)

Deploying services (azd deploy)

  (✓) Done: Deploying service piglatinapp
  - Endpoint: {{endpoint-url}}

  Aspire Dashboard: {{dashboard-url}}

最後に、お気に入りの HTTP clientを使用して、デプロイされた Functions アプリケーションをテストします。

curl --request POST \
  --url {{endpoint-url}}/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

.NET Aspire での Azure Functions のサポートは、次のような限られたトリガーセットのサポートにより、まだプレビュー段階にあります。

詳細については、公式の .NET AspireAzure Functions インテグレーション (プレビュー)を参照してください。

Azure Container Apps のカスタマイズ

最も要求される機能の 1 つは、アプリ ホストが Bicep に触れることなく作成する Azure Container Apps をカスタマイズする機能です。 これは、Aspire.Hosting.Azure.AppContainers 名前空間の PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) API と PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) API を使用することで実現できます。 これらのメソッドは、アプリ ホストが作成するコンテナー アプリ定義 Azure をカスタマイズします。

プロジェクト ファイルにパッケージ参照を追加します。

<ItemGroup>
  <PackageReference Include="Aspire.Hosting.Azure.AppContainers"
                    Version="9.0.0" />
</ItemGroup>

次の例では、Azure Container App をゼロ (0) レプリカにスケーリングする方法を示します。

var builder = DistributedApplication.CreateBuilder(args);

var db = builder.AddAzurePostgresFlexibleServer("pg")
                .RunAsContainer()
                .AddDatabase("db");

// Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
#pragma warning disable AZPROVISION001

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(db)
       .PublishAsAzureContainerApp((module, containerApp) =>
       {
           // Scale to 0
           containerApp.Template.Value!.Scale.Value!.MinReplicas = 0;
       });

#pragma warning restore AZPROVISION001

builder.Build().Run();

前のコード例では、Azure Container App 定義の生成をアプリ ホストに延期します。 これにより、azd infra synth を実行したり、生成された bicep ファイルを安全に変更したりすることなく、Azure Container App 定義をカスタマイズできます。

参照