aspire について
複数サービスのアプリを開発する .NET 開発者向けの .NET Aspire スキルです。ローカルでのオーケストレーション、共通設定、可観測性、デプロイ用アセットの生成を扱います。
主な機能
- 01AppHost によるローカルオーケストレーション
- 02共通サービスデフォルト
- 03データベースとブローカーの統合
- 04ダッシュボードでのログ・メトリクス・トレース
- 05デプロイ用アセットの生成
活用シーン
- 01サービスと依存コンポーネントの一括起動
- 02ヘルスチェックとテレメトリの共通設定
- 03コンテナーや Kubernetes のデプロイマニフェスト生成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ codewithmukesh/ dotnet-claude-kit --skill aspireインストール後、Claude Code で/aspireを入力して読み込まれたか確認します。
詳細
.NET Aspire
基本原則
- AppHost がオーケストレーションを担い、それ自体はデプロイしません — Aspire の主な役割は、サービス、データベース、メッセージブローカーをまとめて起動するローカル開発環境を提供することです。最新の Aspire では、デプロイ用アセット(docker-compose/Kubernetes マニフェスト向けの
aspire publish、Azure Container Apps 向けのaspire deploy)も生成できますが、AppHost プロセス自体は開発時およびビルド時に使うツールであり、本番環境のランタイムではありません。 - ServiceDefaults を基盤にする —
ServiceDefaultsプロジェクトでは、すべてのサービスの OpenTelemetry、ヘルスチェック、回復性を一元的に設定します。 - Aspire のインテグレーションを使う — Aspire には、PostgreSQL、Redis、RabbitMQ、SQL Server などの組み込みインテグレーションがあります。これらは接続文字列、ヘルスチェック、トレースを自動的に処理します。
- ダッシュボードをオブザーバビリティツールとして使う — ローカル開発でのトレース、ログ、メトリクスには、Seq/Grafana をローカルにセットアップする代わりに Aspire ダッシュボードを使います。
パターン
AppHost の設定
// AppHost/Program.cs
var builder = DistributedApplication.CreateBuilder(args);
// Infrastructure resources
var postgres = builder.AddPostgres("postgres")
.WithPgAdmin()
.AddDatabase("myappdb");
var redis = builder.AddRedis("redis")
.WithRedisInsight();
var rabbitmq = builder.AddRabbitMQ("messaging")
.WithManagementPlugin();
// Application projects
var api = builder.AddProject<Projects.MyApp_Api>("api")
.WithReference(postgres)
.WithReference(redis)
.WithReference(rabbitmq)
.WithExternalHttpEndpoints();
var worker = builder.AddProject<Projects.MyApp_Worker>("worker")
.WithReference(postgres)
.WithReference(rabbitmq);
builder.Build().Run();
ServiceDefaults
// ServiceDefaults/Extensions.cs — Standard Aspire service defaults
// Configures OpenTelemetry (metrics + tracing), health checks, service discovery, and resilience
public static class Extensions
{
public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder)
{
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
http.AddStandardResilienceHandler();
http.AddServiceDiscovery();
});
return builder;
}
// ConfigureOpenTelemetry: adds logging, metrics (ASP.NET, HttpClient, Runtime),
// tracing (ASP.NET, HttpClient, EF Core), and OTLP exporter if configured
// AddDefaultHealthChecks: adds a "self" liveness check tagged ["live"]
}
プロジェクトでの ServiceDefaults の使用
// MyApp.Api/Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
// Add Aspire integrations
builder.AddNpgsqlDbContext<AppDbContext>("myappdb");
builder.AddRedisDistributedCache("redis");
var app = builder.Build();
app.MapDefaultEndpoints(); // health check endpoints
app.Run();
サービス間通信
// AppHost — configure service references
var orderApi = builder.AddProject<Projects.OrderApi>("order-api");
var paymentApi = builder.AddProject<Projects.PaymentApi>("payment-api")
.WithReference(orderApi); // paymentApi can discover orderApi
// In PaymentApi — use service discovery
builder.Services.AddHttpClient<OrderClient>(client =>
{
client.BaseAddress = new Uri("https+http://order-api");
});
Aspire を使ったソリューション構成
MyApp.slnx
├── MyApp.AppHost/ # Aspire orchestrator
│ └── Program.cs
├── MyApp.ServiceDefaults/ # Shared service configuration
│ └── Extensions.cs
├── src/
│ ├── MyApp.Api/ # Web API project
│ └── MyApp.Worker/ # Background worker
└── tests/
└── MyApp.Api.Tests/
アンチパターン
AppHost プロセスをデプロイしない
// BAD — running the AppHost executable in production as an orchestrator
// The AppHost is a dev/build-time tool, not a production runtime
// GOOD — deploy the generated assets, not the AppHost:
// aspire publish → docker-compose / Kubernetes manifests from the app model
// aspire deploy → direct deployment (e.g., Azure Container Apps)
Aspire で接続文字列をハードコードしない
// BAD — hardcoding connection strings defeats Aspire's purpose
builder.Services.AddDbContext<AppDbContext>(o =>
o.UseNpgsql("Host=localhost;Database=myapp;..."));
// GOOD — use Aspire integration (connection string injected automatically)
builder.AddNpgsqlDbContext<AppDbContext>("myappdb");
ServiceDefaults を省略しない
// BAD — manually configuring each service
builder.Services.AddOpenTelemetry()...
builder.Services.AddHealthChecks()...
// GOOD — use shared service defaults
builder.AddServiceDefaults();
判断ガイド
| シナリオ | 推奨事項 |
|---|---|
| 複数のサービスを使ったローカル開発 | Aspire AppHost |
| 単一プロジェクトのローカル開発 | dotnet run で問題ありません。Aspire は任意です |
| サービス構成の共有 | ServiceDefaults プロジェクト |
| ローカル開発用データベース | Aspire の AddPostgres()/AddSqlServer() |
| サービスディスカバリー | Aspire 組み込みのサービスディスカバリー |
| 本番環境へのデプロイ | aspire publish(compose/K8s マニフェスト)または aspire deploy(ACA)。AppHost 自体は決してデプロイしません |
| ローカル開発でのオブザーバビリティ | Aspire ダッシュボード(自動設定) |
コメント
Markdown 対応