業界ニュース

Build 2025: Iron Softwareのお客様のためのAI & .NETの展望

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

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

要約

  • CLIは今や本当にスクリプト化可能になりました:分離モード、aspire stop、隔離モード、JSON出力
  • TypeScript AppHostは、オーケストレーション層の.csprojを避けたい場合、プレビューで利用可能です
  • 設定ファイルがaspire.config.jsonに統合されました(レガシーファイルは自動的に移行されます)
  • Foundry は Azure AI Foundry を置き換えます。 これは構築を壊します
  • WithBuildSecretに改名されました
  • サービス発見環境変数はエンドポイント名ではなくスキームを使用するようになりました(静かなるブレイクリスク)
  • クライアント統合におけるデフォルトの 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 stop
aspire stop --all
# Run in the background
aspire run --detach

# Or the new shortcut
aspire start

# See what's running
aspire ps

# Stop it
aspire stop
aspire stop --all
SHELL

--format json(ステータスメッセージがstderrに送られる一方でstdoutに送られる)が組み合わさることで、これに対する本当の自動化を構築することができます。 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-stop / 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

リソース状態でブロックされます。 sleep 30 && hopeではなく。

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

Aspire はその設定ファイルを統合しています。 旧apphost.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)も移行されます。

apphost.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 で表現されます。

興味深い点はそのコード生成です。 .modules/にTypeScript SDKを生成します。 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__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で何かを書いた場合、再テストしてください。リソース階層ドキュメントに詳細があります。

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

WithBuildSecretに改名されました。 新しい名前の方が明確です。 これらはビルド引数としてではなく、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仮想ネットワークの統合(AddPrivateEndpointは自動的にプライベートDNSゾーン、仮想ネットワークリンクを作成し、ターゲットへのパブリックアクセスを無効にします。 これは以前は別のBicepファイルを維持する必要があるようなことでした。
  • Azure Data Lake Storageはホスティングとクライアントサポートの両方を取得しました:AddAzureDataLakeServiceClient / AddAzureDataLakeFileSystemClient。DI登録、リトライ、健康チェック、テレメトリー、通常のAspireスタック。
  • MongoDB EF Coreは新しいクライアント統合を取得しました(Aspire.MongoDB.EntityFrameworkCore)。 通常のケースではEnrichMongoDbContext<TContext>()を使用します。
  • Azure AI Inferenceはチャットだけでなく、埋め込みもサポートするようになりました。 IEmbeddingGenerator<string, Embedding<float>>を注入します。 キー付きバリアントも利用可能です。
  • Azure Container RegistryWithPurgeTask("0 1 * * *", ago: TimeSpan.FromDays(7), keep: 5)を取得し、ACRパージタスクをcronスケジュールでプロビジョニングします。
  • JavaScriptリソースのためのBunサポートWithBun()経由で提供します。 Yarnの信頼性がWithYarn()によっても修正されました。
  • Microsoft FoundryはAzure AI Foundryを置き換えます。 Aspire.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は、PDF生成テストを実行する前にChromeレンダリングが初期化されるまでCIをブロックすることができます
  • テレメトリー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コンストラクターを使用しません。 AzureサービスでManagedIdentityCredential以外のクレデンシャルに依存していた場合、動作が変更されます。 デフォルトAzureクレデンシャルドキュメントをプロダクションにアップグレードする前に読んでください。

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

resource-start / resource-stop / resource-restartは今やaspire resource <name> startです|stop|restart。 スクリプトを更新してください。--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時間未満で稼働させることができます。 何かおかしなことに遭遇した場合、私たちのサポートティームは実際のエンジニアであり、チケットトリアージキューではありません。

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