JMDC TECH BLOG

JMDCのエンジニアブログです

.NET Aspireをローカル開発環境に取り入れてみる

こんにちは。インシュアランス本部ソリューション部の照屋です。
今年、JMDCではアドベントカレンダーに参加しています。

qiita.com

本記事は JMDC Advent Calendar 2025 10日目の記事です。


はじめに

弊部署ではWebアプリやWeb API、DBなどの多層構造を持つ分散アプリケーションを.NET系の技術スタックで開発することがあります。本番環境ではPaaSやクラウドDBを利用してアプリケーションを動かしますが、開発初期においてローカル端末に開発環境を整備する手間がかかることが悩みの種でした。

手間1: 接続情報の準備と設定

Webアプリ・Web API・DB間の接続URLや接続文字列を決定し、手動で設定ファイルに記述する必要があること

手間2:複数層にまたがるデバッグのやりづらさ

Webアプリが遅いと感じたとき、その原因が「Web API側か」「DB側か」をログやネットワークツールを横断して調べる必要があり、問題の切り分けに時間がかかること。

このような手間に対して.NET Aspireを取り入れたら楽になるか試してみました。

.NET Aspireとは

.NET Aspireは分散アプリケーションの開発を支援するための便利機能を詰め合わせた、マイクロソフト社製のツールキットです。

aspire.dev

分散アプリケーションはフロントエンド、バックエンドAPI、DB、キャッシュといった複数のサービスから構成されるため、ローカル環境で各サービスをセットアップするには時間を要します。Aspireにはこのような環境構築とデバッグの複雑さを解消するツールが提供されています。

本記事では、Aspireの2つの機能に焦点を当てて紹介します。

オーケストレーション

App Hostプロジェクトと呼ばれる特別なC#プロジェクトに、アプリケーションを構成する各サービス(自作のC#プロジェクトや実行ファイル、Dockerコンテナ等)を宣言的に定義できます。サービス間の依存関係も定義でき、AppHostプロジェクトを実行するだけでサービス群を正しい順序で一括起動・停止できます。

また、Aspireがサービス間の接続情報(APIのURL, DB接続文字列など)を自動生成し、環境変数として依存するサービスへ自動で注入してくれます。例えばWeb APIサービスに対してDBリソースの参照を定義すると、AspireがDB接続文字列を自動生成してWeb APIサービスに環境変数として注入します。

これにより、開発者が接続文字列を設定ファイルに記述する手間を減らしてくれます。

開発者ダッシュボード

アプリケーションを構成する全サービスの状態、ログ、環境変数を可視化できるWebダッシュボードを提供してくれます。
OpenTelemetryによるトレースやメトリックの収集にも対応しており、ユーザリクエストがどのサービスを経由し、どこで遅延やエラーが発生したかをトレース情報から容易に追跡できます。このダッシュボードを活用することで、複数サービスが稼働している環境下でもデバッグが格段に楽になります。

導入してみる

サンプルプロジェクト

下記構成のシステムに対してAspireを導入するケースを例にとって説明します。

導入前のプロジェクト構成

  • Webアプリ ・・・ C#プロジェクト。画面表示時にWeb APIをコールする。
  • Web API ・・・C#プロジェクト。WebアプリからのAPIコールを受け、レスポンスで渡すデータをDBから取得する。
  • DB・・・Dockerコンテナ。Web APIが参照するデータが定義されている。

導入手順

  1. Aspire CLIをインストールします。

  2. PowerShellで導入先システムのプロジェクトフォルダに移動し、aspire initコマンドを実行します。

     PS C:\> cd C:\tmp\AspireApp\
     PS C:\> aspire init
    
     ソリューションが検出されました: SampleApp.sln
    
     Which version of Aspire do you want to use?
     Multiple versions of Aspire are available. If you want to use
     the latest stable version choose 13.0.1.
    
     ✔  Aspire の初期化が完了しました。
    

    初期化が完了すると、導入先システムのソリューションファイルにAppHostServiceDefaultsという名称のC#プロジェクトが追加されます。

  3. AppHostプロジェクトのAppHost.csにローカル開発環境で使用するリソースを定義します。

var builder = DistributedApplication.CreateBuilder(args);

// MySQLサーバー(Dockerコンテナ)
var mysql = builder.AddMySql("mysql")
        .WithLifetime(ContainerLifetime.Persistent);
// MySQLサーバーに論理DB("mysql-db")を追加
var mysqldb = mysql.AddDatabase("mysql-db");

// Web APIサービス(C#プロジェクト)
var apiService = builder.AddProject<Projects.SampleApp_ApiService>("apiservice")
        .WithHttpHealthCheck("/health")
        .WithReference(mysqldb) // MySQL論理DBを参照
        .WaitFor(mysqldb);

// Webアプリ(C#プロジェクト)
builder.AddProject<Projects.SampleApp_Web>("webfrontend")
        .WithExternalHttpEndpoints()
        .WithHttpHealthCheck("/health")
        .WithReference(apiService) // WebアプリはWeb APIサービスを参照
        .WaitFor(apiService);

builder.Build().Run();

4.WebアプリおよびWeb APIの各プロジェクトに対して下記設定を行います。

  • ServiceDefaultsプロジェクトへの参照を追加
  • Program.csにServiceDefaultの利用設定を追加
var builder = WebApplication.CreateBuilder(args);

// ServiceDefaults利用設定
builder.AddServiceDefaults();

// ...

var app = builder.Build();
app.Run();

これで導入完了です。 導入後のシステム構成は下図のようなイメージになります。

導入後のプロジェクト構成

使ってみる

Visual Studio等のIDEでAppHostプロジェクトを実行すると、ブラウザに開発者ダッシュボードが表示され、AppHost.csで定義した各サービスが自動で立ち上がります。

Visual Studioから起動

開発者ダッシュボードのリソース画面では各サービスの名前、稼働状態、URL等を確認できます。

リソース画面

サービスの関連をグラフ形式で確認することもできます。

リソースグラフ表示

コンソールログ画面では各サービスのログを確認できます。

コンソールログ

OpenTelemetryをサポートしておりトレース情報やメトリクスも確認することができます。
トレース情報が見えるためボトルネックとなっているサービスをダッシュボード上ですぐに特定できます。

トレース情報

メトリック

便利な機能: GitHub Copilotによるデバッグ分析

IDEから起動した場合、開発者ダッシュボードでGitHub Copilotチャットを使用することができます。GitHub CopilotアカウントはIDEでサインインしているアカウントが使用されます。

トレース情報やログを分析データソースとして活用できるため、サービス単体だけでなく、サービス間の相関分析も行えます。例えば「Web APIサービスで発生しているエラーの概要を教えて」「最も遅延しているAPIコールはどれか」といった質問をCopilotに投げかけるだけで、複数のサービスを横断したデバッグや問題の切り分けを効率的に行えるため、とてもおすすめです。

GitHub Copilotを利用したデバッグ

まとめ

.NET Aspireを導入することでローカル開発環境にかかる手間を減らすことができ便利です。

  • 設定管理の自動化: サービス間の接続情報をAppHostが自動で注入してくれるため、設定ファイルの手動編集や環境変数管理が不要になります。

  • デバッグの効率化: 開発者ダッシュボードがログ、トレース、メトリックを一元管理・可視化してくれるため、複数サービスが関わる問題も容易に特定できるようになります。

.NET系のプロジェクトであれば既存環境にAspireを後から導入することも可能ですので、一度ご検討いただいてみてはいかがでしょうか。


明日11日目は、山岡さんによる「Auth0とGoogle Workspace(Googleグループ)のSAML認証を利用した話」です。お楽しみに!

JMDCでは、ヘルスケア領域の課題解決に一緒に取り組んでいただける方を積極採用中です!フロントエンド /バックエンド/ データベースエンジニア等、様々なポジションで募集をしています。詳細は下記の募集一覧からご確認ください。 hrmos.co

まずはカジュアルにJMDCメンバーと話してみたい/経験が活かせそうなポジションの話を聞いてみたい等ございましたら、下記よりエントリーいただけますと幸いです。 hrmos.co

★最新記事のお知らせはぜひ X(Twitter)、またはBlueskyをご覧ください!

twitter.com

bsky.app