業界ニュース

Aspire 13.2:.NETサービス開発者が知るべきこと

Iron Software のエンジニアリングチームからの Aspire 13.2 のリリースに関するいくつかのノートを共有します。 当社では、.NET ライブラリ(IronPDFIronOCRIronXLIronWordIronBarcode 他のライブラリ)を出荷しており、ほとんどの顧客の問い合わせは分散型アプリのオーケストレーションに触れています。 それが私たちが Aspire のリリースに注目する理由です。 13.2 は、CLI が実際にほとんどの日常の作業においてダッシュボードを置き換えることができると感じた最初のリリースであり、アップグレード時にあなたを悩ませるいくつかの重大な変更があります。

これはリリースノートの反復ではありません。 公式の新機能ページには詳細なリストがあります。これは、作業中のコードベースにおいて実際に役立つものと、注目すべき落とし穴です。

要約

  • CLIはスクリプト可能になりました:デタッチドモード、aspire 停止、アイソレートモード、JSON出力
  • TypeScript AppHostはプレビュー中です。オーケストレーションレイヤーの.csprojを捨てたい場合に使用できます
  • 設定ファイルはaspire.config.jsonに統合されました(レガシーファイルは自動マイグレーションされます)
  • Foundry は Azure AI Foundry を置き換えます。 これは構築を壊します
  • WithSecretBuildArgWithBuildSecret に名前が変更されました
  • サービス発見環境変数はエンドポイント名ではなくスキームを使用するようになりました(静かなるブレイクリスク)
  • クライアント統合におけるデフォルトの Azure 資格情報の動作が変わりました

CLI がついに CLI に

これは見出しです。13.2以前では、aspire run がターミナルをブロックし、ダッシュボードが実行中のapphostを管理するための現実的な唯一の手段でした。ソロ開発者には問題ありませんが、CI、統合テスト、またはエージェント駆動のワークフローでは不便です。

13.2 はこれを修正します:

# Run in the background
aspire run --detach

# Or the new shortcut
aspire start

# See what's running
aspire ps

# Stop it
aspire 停止
aspire 停止 --all
# Run in the background
aspire run --detach

# Or the new shortcut
aspire start

# See what's running
aspire ps

# Stop it
aspire 停止
aspire 停止 --all
SHELL

--format jsonと組み合わせると(ステータスメッセージがstderrに出力されるため、何処かにパイプする場合には重要です)、本当の自動化を構築できます。 aspire ps --resources --format json は、エディタ統合とスクリプトのための堅固な構成要素です。

アイソレートモードは隠れたヒーロー

--isolated は待ち望んでいたものです。 これは、ポートをランダム化し、ユーザーの秘密情報を分離してアプホストを実行し、ポート競合や設定の衝突を防ぎます:

aspire run --isolated
aspire start --isolated
aspire run --isolated
aspire start --isolated
SHELL

同じアプホストの 2 つのチェックアウト - メインと機能ブランチ、並行統合テスト、またはエージェント駆動のワークフローを同時に実行しようとしたことがあるなら、その痛みを感じたことがあります。 ランダムなポートと分離された秘密情報により、ついに N コピーをスピンアップし、どうでもよくなります。

git ワークワークツリー単独では、このアップグレードの価値があります。 ネイティブ依存を持つ実際のサービスを立ち上げる統合テストスイートにおいて(PDF 生成のための Chrome レンダリング、OCR のための Tesseract、一般的な重量級)、これは信頼性の違いになります。

aspire doctor と aspire describe

aspire doctor は、環境を通じて動作します:開発者証明書状態、コンテナ実行時バージョン、.NET SDK、WSL2設定、エージェント設定。 それはすべてのフレームワークが持つべきもので、ほとんどのフレームワークは気にしません。 出力は実行可能です。 何かが間違っている場合、何をすべきかを教えてくれます。

aspire describe --follow は、ターミナルからリソース状態をストリーミングで表示することができます。 ダッシュボードが示すデータと同じですが、パイプ可能。 tmux ペインにドロップすると、80 列でダッシュボードの値の多くを取得できます。

リソースのコマンドが整理されました

古い resource-start / resource-停止 / resource-restart コマンドは、よりクリアなサブコマンド形式に取って代わられます:

aspire resource api restart
aspire resource api rebuild
aspire resource api restart
aspire resource api rebuild
SHELL

rebuild は新しいものです。 これは、.NET プロジェクトの 1 つのリソースを停止し、ビルドし、再起動し、アプホストセッション全体を壊すことなく行います。 12 リソースグラフの 1 つのサービスを変更し、すべてを再起動することにうんざりしたなら、これはその修正です。 私たち自身もこれを感じました: PDF レンダテンプレートを反復処理したり、OCR 前処理を調整したりするときに、単に 1 つのプロジェクトを再ロードするために全体のグラフを再起動することはすぐに古びてきます。

CLI にとどまることなく秘密情報と証明書

2 つの新しい専用のコマンドグループ:

aspire certs clean
aspire certs trust

aspire secret set ApiKey super-secret-value
aspire secret list --format json
aspire certs clean
aspire certs trust

aspire secret set ApiKey super-secret-value
aspire secret list --format json
SHELL

aspire secret はより大きな成果です。 これは、アプリモデルのAddParameter(..., secret: true)をバックアップするユーザーシークレットストアと同じものにマップされますが、これらを管理するために.NET CLIをインストールする必要はありません。 すべての開発者が .NET SDK を持っていないポリグロットアプホストにおいて、これは重要です。

CI のための aspire wait

aspire wait api --status healthy --timeout 120
aspire wait api --status healthy --timeout 120
SHELL

リソース状態でブロックされます。 aspire start--format json と組み合わせて、sleep 30 && hopeするのではなく、実際に準備が整うまで待つCIスクリプトを書けるようになりました。

設定: すべてを支配する 1 つのファイル

Aspire はその設定ファイルを統合しています。 以前の .aspire/settings.jsonapphost.run.json の分割はなくなり、プロジェクトルートに単一の aspire.config.json に置き換わりました:

{
  "appHost": {
    "path": "apphost.ts",
    "language": "typescript/nodejs"
  },
  "sdk": { "version": "13.2.0" },
  "channel": "stable",
  "profiles": {
    "default": {
      "applicationUrl": "https://localhost:17000;http://localhost:15000"
    }
  }
}

移行は自動です。 既存のプロジェクトで最初に aspire コマンドを実行すると、レガシーファイルは新しい形式に統合され、パスがプロジェクトのルートに再フェイレールされます。 レガシーファイルは保存されているため、古いCLIバージョンを並行して使用することができます。グローバル設定(globalsettings.json)も移行されます。

.aspire/settings.jsonapphost.run.json に直接アクセスしている自動化がある場合は、移行を計画してください。

TypeScript AppHost(プレビュー)

これは初日に使用するかどうかに関係なく興味深いです。 今や TypeScript でアプホストを書くことができます:

import { createBuilder } from './.modules/aspire.js';

const builder = await createBuilder();

const cache = await builder.addRedis("cache");

const api = await builder.addProject("api", "../api")
    .withReference(cache)
    .waitFor(cache);

await builder.build().run();

バックグラウンドでは、TS アプホストは、JSON-RPC 経由でローカルトランスポート上で Aspire の .NET オーケストレーションホストと話すゲストプロセスとして実行されます。 同じリソースモデル、同じダッシュボード、同じ統合が、ただ TypeScript で表現されます。

興味深い点はそのコード生成です。 aspire add を実行すると、CLIは統合 for .NETアセンブリを検査し、TypeScript SDKを.modules/に生成します。 aspire restore はそれらを再生成します。アップグレードやブランチの切り替え後に便利です(aspire run でも自動で実行されます)。 13.2 ジェネレーターは Go、Java、Rust のテストターゲットも追加しており、これはどこに向かっているのかを示唆します。

.NET 優先のチームである私たちには"これを監視する"というよりは"これを出荷する"というものですが、コード生成パターンは将来のポリグロットアプホスト言語がすべて同じモデルに従うことを意味します。 ホストブリッジがどのように機能するかについては 多言語アーキテクチャ ドキュメント を参照してください。

ダッシュボード: テレメトリーのエクスポート/インポートは新しいおもちゃです

ダッシュボードに本格的なエクスポート/インポートワークフローがあります。 設定 → 管理 から、リソースとテレメトリーの種類を選び、JSON の zip としてエクスポートします。後でダッシュボードに再インポートするか、他の人や LLM に渡し分析してもらいます。

aspire export CLIコマンドは同じバンドルを生成します:

aspire export --output .\artifacts\aspire-export.zip
aspire export <resource>
aspire export --output .\artifacts\aspire-export.zip
aspire export <resource>
SHELL

バグレポートに本当に役立ちます。 "いくつかのスクリーンショットとログファイルです"ではなく、実際のテレメトリー状態のスナップショットを添付できます。

その他のダッシュボード側のノート:

  • リソースパラメータをダッシュボード UI から直接設定し, ユーザーの秘密に保存するオプションと共に
  • 環境変数はリソース詳細ビューから.envファイルとしてエクスポートされることがあります
  • リソースグラフレイアウトは適応的なフォースダイレクト配置を使用します。 複雑なグラフは顕著に乱雑さが減ります
  • /api/telemetryにあるテレメトリHTTP APIはOTLP JSONを返します; NDJSONストリーミングのために?follow=trueをサポートしています。 エンドポイントはリソース、スパン、ログ、およびトレースをカバーします(完全なトレース検索のための/traces/{traceId}を含む)

スタンドアローンのダッシュボードは、テレメトリー API をデフォルトで オフ にします。 ダッシュボードを自分でホストしていてAPIに依存している場合、DASHBOARD__API__AUTHMODE および DASHBOARD__API__PRIMARYAPIKEY)が必要です。 AppHost統合シナリオはまだ機能します。なぜなら、Aspire.Hostingがツール用にAPIを自動的に配線するからです。

アプリモデルに関する重要な点

WithMcpServer

アプリモデル内でリソースがMCPエンドポイントをホストしていることを宣言できます。

var api = builder.AddProject<Projects.MyApi>("api")
    .WithMcpServer("/mcp");
var api = builder.AddProject<Projects.MyApi>("api")
    .WithMcpServer("/mcp");
Dim api = builder.AddProject(Of Projects.MyApi)("api") _
    .WithMcpServer("/mcp")
$vbLabelText   $csharpLabel

Aspireツールはそのエンドポイントを発見し、プロキシできます。 コードエージェントにツールを公開するものを提供している場合、これがそれを接続するための最もクリーンな方法です。 オプションを介してカスタムパスまたはエンドポイント名をサポート。

コンテキストベースのエンドポイント解決

必要になるまで気づかないタイプのものです。 エンドポイントは特定の呼び出し元やネットワークの視点から解決されるようになりました:

var endpoint = redis.GetEndpoint("tcp");

var url = await endpoint.GetValueAsync(new ValueProviderContext {
    Caller = containerApp.Resource,
});
var endpoint = redis.GetEndpoint("tcp");

var url = await endpoint.GetValueAsync(new ValueProviderContext {
    Caller = containerApp.Resource,
});
Dim endpoint = redis.GetEndpoint("tcp")

Dim url = Await endpoint.GetValueAsync(New ValueProviderContext With {
    .Caller = containerApp.Resource
})
$vbLabelText   $csharpLabel

同じRedisエンドポイントは、ホストプロセスからはcache:6379に解決されます(コンテキストに依存します)。 PublicInternetを提供します。

リリースノートは、これらのAPIが13.1で存在したが正しく動作しなかったことを明示的に述べています。 したがって、13.1で何かを書いた場合、再テストしてください。リソース階層ドキュメントに詳細があります。

コンテナビルドシークレット

WithSecretBuildArgWithBuildSecret に名前が変更されました。 新しい名前の方が明確です。 これらはビルド引数としてではなく、Docker/Podmanを通じて正しいビルドシークレットとして流れ込みます(イメージ履歴に漏れない)。

builder.AddContainer("worker", "contoso/worker")
    .WithDockerfile("../worker")
    .WithBuildSecret("ACCESS_TOKEN", accessToken);
builder.AddContainer("worker", "contoso/worker")
    .WithDockerfile("../worker")
    .WithBuildSecret("ACCESS_TOKEN", accessToken);
$vbLabelText   $csharpLabel

ビルドシークレットは、今やファイルとしても使用できます(例えば、コンテナビルドにおけるプライベートレジストリアクセス用の.npmrc)。これは、ほとんどの現実的なユースケースをカバーしています。

重要な統合

完全なリストは長いです。 強調すべきものはこれです:

  • Docker Compose公開が安定しました(プレビューレリースでした)。 docker-compose.yamlを生成します。"Azureへのデプロイ"が答えでない場合の便利な逃げ道です。 IronPDF、IronOCR、IronXLがLinuxコンテナとDockerをきれいにサポートしているため、ネイティブ依存関係を含むコンテナを出荷している場合には注目すべきですので、生成されたコンポーズファイルは通常、手動修正をせずに動作します。
  • Azure Virtual Network統合(Aspire.Hosting.Azure.Network)により、VNets, サブネット, NSGs, NAT gateways, プライベートエンドポイントをapphostで宣言できます。AddPrivateEndpoint は自動的にプライベートDNSゾーン、仮想ネットワークリンクを作成し、ターゲットのパブリックアクセスを無効にします。 これは以前は別のBicepファイルを維持する必要があるようなことでした。
  • Azure Data Lake Storageはホスティングとクライアントサポートの両方を取得しました:AddAzureDataLakeServiceClient / AddAzureDataLakeFileSystemClient。 DI登録、リトライ、ヘルスチェック、テレメトリ、一般的なアスパイアスタック。
  • MongoDB EF Core には新しいクライアント統合(Aspire.MongoDB.EntityFrameworkCore)があります。 通常の場合はEnrichMongoDbContext<TContext>()
  • Azure AI Inferenceはチャットだけでなく、埋め込みもサポートするようになりました。 IEmbeddingGenerator<string, Embedding<float>>をインジェクトしてください。 キー付きバリアントも利用可能です。
  • Azure Container Registry にはWithPurgeTask("0 1 * * *", ago: TimeSpan.FromDays(7), keep: 5)が追加され、cronスケジュールに基づいてACRパージタスクを設定します。
  • JavaScriptリソース用のBunサポートWithBun()経由で提供。 Yarnの信頼性はWithYarn()を介して実現されました。
  • Microsoft FoundryはAzure AI Foundryを置き換えます。 Aspire.Hosting.FoundryAspire.Hosting.Azure.AIFoundry に取って代わられました。 ブレイキングチェンジ; 詳細は以下をご覧ください。

まとめ:Aspire 13.2でのドキュメントサービス

これは弊社が内部でライブラリとともに分散シナリオをテストするために実践しているパターンです。 これは、多くの新しい13.2機能が、この種のマルチサービスセットアップで報われるため、見せる価値があります。玩具デモではなく。

var builder = DistributedApplication.CreateBuilder(args);

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

// A worker service that uses IronPDF for HTML to PDF rendering
var renderer = builder.AddProject<Projects.PdfRenderer>("renderer")
    .WithReference(cache)
    .WaitFor(cache)
    .WithMcpServer("/mcp");

// An OCR worker that uses IronOCR for image and PDF text extraction
var ocr = builder.AddProject<Projects.OcrWorker>("ocr-worker")
    .WithReference(cache);

// API gateway that fans out to both
builder.AddProject<Projects.Api>("api")
    .WithReference(renderer)
    .WithReference(ocr)
    .WaitFor(renderer)
    .WaitFor(ocr);

builder.Build().Run();
var builder = DistributedApplication.CreateBuilder(args);

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

// A worker service that uses IronPDF for HTML to PDF rendering
var renderer = builder.AddProject<Projects.PdfRenderer>("renderer")
    .WithReference(cache)
    .WaitFor(cache)
    .WithMcpServer("/mcp");

// An OCR worker that uses IronOCR for image and PDF text extraction
var ocr = builder.AddProject<Projects.OcrWorker>("ocr-worker")
    .WithReference(cache);

// API gateway that fans out to both
builder.AddProject<Projects.Api>("api")
    .WithReference(renderer)
    .WithReference(ocr)
    .WaitFor(renderer)
    .WaitFor(ocr);

builder.Build().Run();
Imports DistributedApplication

Dim builder = DistributedApplication.CreateBuilder(args)

Dim cache = builder.AddRedis("cache")

' A worker service that uses IronPDF for HTML to PDF rendering
Dim renderer = builder.AddProject(Of Projects.PdfRenderer)("renderer") _
    .WithReference(cache) _
    .WaitFor(cache) _
    .WithMcpServer("/mcp")

' An OCR worker that uses IronOCR for image and PDF text extraction
Dim ocr = builder.AddProject(Of Projects.OcrWorker)("ocr-worker") _
    .WithReference(cache)

' API gateway that fans out to both
builder.AddProject(Of Projects.Api)("api") _
    .WithReference(renderer) _
    .WithReference(ocr) _
    .WaitFor(renderer) _
    .WaitFor(ocr)

builder.Build().Run()
$vbLabelText   $csharpLabel

具体的には13.2から得られるもの:

  • aspire start --isolatedにより、ポートの競合を起こさずにこのグラフの2つのコピーを並行して実行することができます。 ブランチを比較したり、レンダラーに対して並行統合テストを実行する場合に便利です
  • aspire resource renderer rebuildにより、Razorテンプレートを変更した際にPDFレンダラーのみをリロードします。全体のグラフをバウンスする代わりに。
  • aspire wait renderer --status healthy --timeout 120により、Chromeレンダリングが初期化されるまでCIをブロックし、PDF生成テストを実行することができます
  • テレメトリHTTP APIとaspire exportは、OTLP形式で各レンダーコールのスパンを提供します。これにより、本番トラフィック中に遅いCSSルールを実際にキャッチすることができます
  • WithMcpServerにより、コードエージェントワークフローのためにレンダラーをMCPツールとして公開することができます。プログラム的にドキュメントを生成するものを構築している場合に役立ちます

上記のようなレンダラーサービスを構築したい場合は、IronPDFのHTMLからPDFへのチュートリアルでC#側が説明されています。OCRワーカーについては、IronOCR入門ガイドで基本が紹介されています。

実際に影響を受ける可能性のあるブレイキングチェンジ

どれにぶつかる可能性が高いかの概略順:

サービスディスカバリー環境変数の命名

# Before (13.0/13.1)
services__myservice__myendpoint__0 = https://localhost:5001

# After (13.2)
services__myservice__https__0 = https://localhost:5001
# Before (13.0/13.1)
services__myservice__myendpoint__0 = https://localhost:5001

# After (13.2)
services__myservice__https__0 = https://localhost:5001
SHELL

エンドポイントのスキームがエンドポイントの名前の代わりに使用されます。 これらの環境変数名にマッチするコードまたは設定がある場合は、更新してください。 これはほとんどサイレントなブレイクです:何も投げられません、変数は異なるキーを持つだけです。

BeforeResourceStartedEvent

以前はより広く発火していました; 現在ではリソースを実際に開始する際にのみ発火し、すべての状態変化で発火するわけではありません。 以前の動作に基づいたハンドラがあった場合、それは静かに実行を停止します。

AIFoundryからFoundryへ

パッケージとAPIの名前変更。 パッケージ参照と呼び出しを更新してください:

<PackageReference Include="Aspire.Hosting.Foundry" Version="13.2.0" />
<PackageReference Include="Aspire.Hosting.Foundry" Version="13.2.0" />
XML
// Before
var ai = builder.AddAzureAIFoundry("ai");

// After
var foundry = builder.AddFoundry("ai");
var project = foundry.AddProject("agents");
var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
// Before
var ai = builder.AddAzureAIFoundry("ai");

// After
var foundry = builder.AddFoundry("ai");
var project = foundry.AddProject("agents");
var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
' Before
Dim ai = builder.AddAzureAIFoundry("ai")

' After
Dim foundry = builder.AddFoundry("ai")
Dim project = foundry.AddProject("agents")
Dim chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini)
$vbLabelText   $csharpLabel

ローカルモデルの開発ではRunAsFoundryLocalはまだ機能しますが、Foundry Localとして設定された親リソースの場合にはFoundry Projectsはサポートされていません。

デフォルトAzureクレデンシャル

Aspire Azureクライアント統合は、引数なしのDefaultAzureCredentialコンストラクタを使用しなくなりました。 ManagedIdentityCredential以外の資格情報を依存してAzureサービスで動作していた場合、動作が変わります。 デフォルトAzureクレデンシャルドキュメントをプロダクションにアップグレードする前に読んでください。

リソースコマンドの名前変更

resource-start / resource-停止 / resource-restartaspire resource <name> start です|停止|restart。 すべてのスクリプトを更新してください。--apphostオプションがレガシーな--project`よりも推奨されています(依然として受け入れられます)。

接続プロパティサフィックス

接続プロパティサフィックスが追加されました。 接続プロパティに直接アクセスする場合(WithReference 経由ではなく)、コードがまだそれらを解決するか確認してください。

WithSecretBuildArg to WithBuildSecret

前述のとおり。 単純な名前の変更です。

IAzureContainerRegistry は非推奨

代わりに、計算環境で ContainerRegistry プロパティを使用してください。

ダッシュボードテレメトリAPIはopt-in(スタンドアロン)になりました

もう一度言及されていますが、スタンドアロンのダッシュボードデプロイを今すぐAPIを明示的に有効にする必要があります。

アップグレードすべきか?

マルチサービスアプリをローカルで動かしている.NETショップにとっては、おそらくそうです。上記のブレイキングチェンジをインベントリが完了していると思われる場合には。 CLIの改善点だけでも、それに値します。 特にデタッチモードとアイソレートモードは、実際のワークフロープロブレムを修正します。

Foundryユーザーの場合:名前変更は今回のリリースの新しいものを取得したい場合に強制的な移行ですので、計画してください。

TypeScriptに興味がある方に:13.2はTS apphostが評価できるほど実際的なものである初めてのリリースです。 まだプレビューですが、金曜日の午後に試す価値があります。

アップグレード自体は13.xをすでに使用している場合はワンライナーです:

aspire update --self
aspire update
aspire update --self
aspire update
SHELL

12.xかそれ以前を使用している場合は、アップグレードガイドを確認してください。13.0の手順はスキップできません。

パッチノート:13.2.1

オリジナルのリリース以降、信頼性の修正を含む13.2.1が出荷されました。 TypeScript SDKの名前変更が少しあり、すでにTS apphostプレビューを使用している場合にのみ重要です:

以前
runAsExistingFromParameters(name, resourceGroup)runAsExisting(name, { resourceGroup })
publishAsExistingFromParameters(name, resourceGroup)publishAsExisting(name, { resourceGroup })
withConnectionPropertyValue(name, value)withConnectionProperty(name, value)
withParameterBuildArg(name, parameter)withBuildArg(name, parameter)

withConnectionPropertyValue は、生成されたSDK内で互換性の別名として維持されているため、ランタイム中断はありません。

分散.NETアプリをドキュメントワークロードで構築していますか?

サービスがPDF生成、OCR、Excel処理、バーコード、またはその他のカバーしているフォーマットを行う場合、私たちのライブラリは、Aspireがオーケストレートするようなマルチサービス、コンテナフレンドリーなセットアップに最適です。 すべてが.NET 10, 9, 8, 7, 6, Framework, Core、およびLinuxコンテナ、Azure、AWS、オンプレミスで動作します。

いくつかのスタートポイント:

  • IronPDFはHTMLからPDF、PDF編集、署名、フォーム用です。 チュートリアルハブが動作するレンダリングサービスへ最速のパスです
  • IronOCRは125以上の言語での画像およびPDFのテキスト抽出用です
  • IronXLはオフィスインターロップを必要とせずにExcelの読み書き用です
  • IronWordはDOCX生成と編集用です。
  • IronBarcodeおよびIronQRはバーコードとQRの生成とスキャン用です
  • Iron Suiteは、上記の製品を1つ以上利用したい場合に

30日トライアルキーを入手し、Aspire apphost内でPDFまたはOCRサービスを1時間未満で稼働させることができます。 何かおかしなことに遭遇した場合、私たちのサポートティームは実際のエンジニアであり、チケットトリアージキューではありません。

それで終わりです。 次回のリリースでお会いしましょう。