C# Academy · レッスン

OpenAPI、バージョニングとデプロイ

Swagger/OpenAPIドキュメントを生成し、APIをバージョン管理して、Minimal APIをAzure App Serviceまたはコンテナーにデプロイします。

レッスン 4/413 ステップ

「OpenAPI、バージョニングとデプロイ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

Minimal APIs の OpenAPI

OpenAPI(旧称 Swagger)は、対話型の API ドキュメントを生成します。.NET 9 では AddOpenApi() が組み込まれています。それ以前のバージョンでは Swashbuckle.AspNetCore を使用します。

Swashbuckle による Swagger の追加

Swashbuckle をインストールしてサービスで設定し、仕様書と Swagger UI を提供するミドルウェアを追加します。

// dotnet add package Swashbuckle.AspNetCore

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(opt =>
    opt.SwaggerDoc("v1", new() { Title = "Products API", Version = "v1" }));

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

OpenAPI 用のエンドポイントへの注釈付け

Produces、ProducesProblem、WithSummary、WithDescription を使って、生成される OpenAPI 仕様を充実させます。

app.MapGet("/products/{id}", GetProduct)
   .WithName("GetProductById")
   .WithSummary("Get a product by ID")
   .WithDescription("Returns the product matching the given numeric ID.")
   .Produces<ProductDto>(200)
   .Produces<ProblemDetails>(404)
   .WithTags("Products");

ルートグループによる API バージョニング

シンプルなバージョニング戦略では、バージョンをプレフィックスにしたルートグループを使用します。基本的なバージョニングに追加パッケージは必要ありません。

var v1 = app.MapGroup("/api/v1").WithTags("v1");
var v2 = app.MapGroup("/api/v2").WithTags("v2");

v1.MapGet("/products", GetProductsV1);
v2.MapGet("/products", GetProductsV2); // different DTO shape

// Clients use /api/v1/products or /api/v2/products

ヘッダー/クエリによるバージョニングのための Asp.Versioning

Asp.Versioning.Http パッケージを使うと、Minimal APIs にクエリ文字列、ヘッダーベース、URL セグメントによるバージョニングを追加でき、OpenAPI と完全に統合できます。

// dotnet add package Asp.Versioning.Http

builder.Services.AddApiVersioning(opt =>
{
    opt.DefaultApiVersion = new ApiVersion(1, 0);
    opt.AssumeDefaultVersionWhenUnspecified = true;
    opt.ApiVersionReader = new QueryStringApiVersionReader("api-version");
});

// /products?api-version=2.0
app.MapGet("/products", GetProducts)
   .HasApiVersion(2, 0);

バージョンごとの個別仕様書の生成

Swashbuckle を設定してバージョンごとに個別の OpenAPI ドキュメントを生成すると、利用者には自身のバージョンに関係するエンドポイントだけが表示されます。

builder.Services.AddSwaggerGen(opt =>
{
    opt.SwaggerDoc("v1", new() { Title = "API", Version = "v1" });
    opt.SwaggerDoc("v2", new() { Title = "API", Version = "v2" });
});

app.UseSwaggerUI(opt =>
{
    opt.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
    opt.SwaggerEndpoint("/swagger/v2/swagger.json", "v2");
});

自己完結型バイナリの発行

Minimal API を自己完結型の単一バイナリとして発行すると、対象マシンに .NET ランタイムをインストールする必要がなくなります。

# Publish for Linux x64 as self-contained
dotnet publish -c Release -r linux-x64 --self-contained true

# Run the output binary
./bin/Release/net9.0/linux-x64/publish/MyApi

# Optionally single-file:
# dotnet publish -c Release -r linux-x64 -p:PublishSingleFile=true

Docker によるコンテナ化

公式の .NET ベースイメージを使って、API を Docker イメージにパッケージ化します。マルチステージ Dockerfile により、最終イメージを小さく保てます。

# Dockerfile (multi-stage)
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MyApi.dll"]

# Build and run
# docker build -t my-api .
# docker run -p 8080:8080 my-api

Azure App Service へのデプロイ

CLI から Azure App Service に直接デプロイします。サービスがスケーリング、証明書、カスタムドメインを管理します。

# Publish to folder first
dotnet publish -c Release -o ./publish

# Deploy to Azure App Service
az webapp up \
  --name my-products-api \
  --resource-group myRG \
  --runtime DOTNETCORE:9.0 \
  --sku B1

# View logs
az webapp log tail --name my-products-api --resource-group myRG

ヘルスチェック

ヘルスチェックエンドポイントを追加すると、オーケストレーター(Kubernetes、Azure)が API の稼働状況とトラフィックを受け付ける準備ができているかを確認できます。

builder.Services.AddHealthChecks()
    .AddDbContextCheck<AppDbContext>()
    .AddUrlGroup(new Uri("https://api.external.com/ping"), "external");

app.MapHealthChecks("/health");
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
    Predicate = hc => hc.Tags.Contains("ready")
});

実践:本番環境チェックリスト

本番環境の Minimal API には、正確性、可観測性、セキュリティのために、これらの設定を含める必要があります。

// builder configuration
builder.Services.AddProblemDetails();
builder.Services.AddHealthChecks();
builder.Services.AddRateLimiter(...);
builder.Services.AddOutputCache();

// app pipeline
app.UseHttpsRedirection();
app.UseExceptionHandler();
app.UseRateLimiter();
app.UseOutputCache();
app.UseAuthentication();
app.UseAuthorization();

app.MapHealthChecks("/health");
// ... your endpoints
app.Run();

確認問題

Minimal APIs でエンドポイントのメタデータ(Produces、WithSummary など)を OpenAPI ツールから参照できるようにするメソッドはどれですか。

まとめ:OpenAPI、バージョニング、デプロイ

重要なポイント:

  • AddEndpointsApiExplorer + Swashbuckle により、Minimal APIs 用の Swagger UI を利用できます
  • Produces、WithSummary、WithTags で注釈を付けると、充実した OpenAPI ドキュメントを作成できます
  • シンプルなバージョニングにはルートグループを使い、高度なシナリオには Asp.Versioning を使用します
  • 柔軟にデプロイするには、自己完結型または Docker イメージとして発行します
  • Kubernetes/Azure の readiness probe 用にヘルスチェックを追加します
無料で開始

AI チューターと学ぶ C# — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
93
レッスン
346

よくある質問

「OpenAPI、バージョニングとデプロイ」レッスンは無料ですか?

はい。「OpenAPI、バージョニングとデプロイ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「OpenAPI、バージョニングとデプロイ」で何を学びますか?

Swagger/OpenAPIドキュメントを生成し、APIをバージョン管理して、Minimal APIをAzure App Serviceまたはコンテナーにデプロイします。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「OpenAPI、バージョニングとデプロイ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 初めてのMinimal APIの作成
  2. ルートグループ、パラメーターと検証
  3. Minimal APIのミドルウェアとフィルター
  4. OpenAPI、バージョニングとデプロイ
← C# Academyに戻る