$30 off During Our Annual Pro Sale. View Details »

.NET Aspire を使おう!

Kazuki
June 26, 2024

.NET Aspire を使おう!

第3回 Azure Travelers 勉強会 山形の旅での登壇資料です。
https://jat.connpass.com/event/308087/

Kazuki

June 26, 2024
Tweet

More Decks by Kazuki

Other Decks in Technology

Transcript

  1. #AzureTravelers 自己紹介 名前: 大田 一希 (Kazuki Ota) 所属: 日本マイクロソフト 役職:

    クラウド ソリューション アーキテクト エバンジェリスト(AI & AppDev) 好き: C#、Azure PaaS 系サービス 苦手: パクチー、インテリセンスの弱い言語 趣味: ゲーム、絵を描くこと X(旧 Twitter): @okazuki Zenn: https://zenn.dev/okazuki
  2. #AzureTravelers 宣伝 2 この後登壇の mihohoi さんと .NET の YouTube チャンネルで

    .NET Aspire をします! Let's Learn .NET: Aspire (日本語) (youtube.com) vs
  3. #AzureTravelers 本セッションのゴール .NET 開発者向け .NET Aspire を自分のプロジェクトに 追加してもいいかなって思ってもらう 非 .NET

    開発者向け .NET Aspire みたいなものが自分の 好きな言語にも欲しい!!って思ってもらう
  4. #AzureTravelers .NET Aspire の代表的な機能  ローカル開発向けのオーケストレーション機能  複数プロジェクト (サービス) からなるアプリケーションのローカル環境での実行を容易にす

    るための仕組み  .NET Aspire ホスティング パッケージで色々なサービスに対応  サービスを名前指定で HTTP 通信をするためのサービス検出機能  コンポーネント  Redis や PostgreSQL や Azure Storage Account などの一般的なサービスと リトライや OpenTelemetry などを構成済みの状態で接続するための NuGet パッケージ群  各種ツール  Visual Studio、Visual Studio Code、dotnet CLI による開発支援機能  Visual Studio、Azure Developer CLI による Azure Container Apps へのデプロイ  OSS の Aspire8 project による Kubernetes へのデプロイ
  5. #AzureTravelers .NET Aspire を構成するもの  ローカル開発向けのオーケストレーション機能  複数プロジェクト (サービス) からなるアプリケーションのローカル環境での実行を容易にす

    るための仕組み  .NET Aspire ホスティング パッケージで色々なサービスに対応  コンポーネント  Redis や PostgreSQL や Azure Storage Account などの一般的なサービスとのシームレスな接 続を実現するための NuGet パッケージ群  各種ツール  Visual Studio、Visual Studio Code、dotnet CLI による開発支援機能  Visual Studio、Azure Developer CLI による Azure Container Apps へのデプロイ  OSS の Aspire8 project による Kubernetes へのデプロイ これらを全て もしくは部分的に使える
  6. #AzureTravelers .NET Aspire ダッシュボード 起動したサービスの状態の可視化 ✓ 各サービスのエンドポイント確認 ✓ 各サービスの環境変数の確認 ✓

    各サービスの死活監視 ✓ OpenTelemetry のトレースの確認 ✓ OpenTelemetry のメトリックの確認 ✓ アプリのログの確認
  7. #AzureTravelers アプリ モデル サービス間の依存関係を C# で定義したもの • .NET Aspire の肝の

    1 つ • AppHost プロジェクトの Program.cs で記載 var builder = DistributedApplication.CreateBuilder(args); var cache = builder.AddRedis("cache"); var apiService = builder .AddProject<Projects.AspireApp3_ApiService>("apiservice"); builder.AddProject<Projects.AspireApp3_Web>("webfrontend") .WithExternalHttpEndpoints() .WithReference(cache) .WithReference(apiService); builder.Build().Run(); • AddXXXX というメソッドでアプリモデルに追加 • 引数で名前を指定 • AddProject でプロジェクトを登録 • AppHost プロジェクトに参照を追加するとプ ロジェクト名の型が生成される • 「Addサービス名」で各種サービスを登録 • サービスはホスティングパッケージという NuGet パッケージで追加する
  8. #AzureTravelers アプリ モデル サービス間の依存関係を C# で定義したもの • .NET Aspire の肝の

    1 つ • AppHost プロジェクトの Program.cs で記載 var builder = DistributedApplication.CreateBuilder(args); var cache = builder.AddRedis("cache"); var apiService = builder .AddProject<Projects.AspireApp3_ApiService>("apiservice"); builder.AddProject<Projects.AspireApp3_Web>("webfrontend") .WithExternalHttpEndpoints() .WithReference(cache) .WithReference(apiService); builder.Build().Run(); • WithXXXX というメソッドで依存関係などの設定 を追加する • WithReference で依存関係を定義 • WithExternalHttpEndpoints で外部公開の HTTP エンドポイントの存在を明示
  9. #AzureTravelers アプリ モデル ローカル開発時に一括実行 DistributedApplication (アプリ モデル) "cache": Redis のコンテナ

    "apiservice": .NET プロジェクト https://localhost:7829 で起動 "webfrontend": .NET プロジェクト https://localhost:8080 で起動 外部公開用 HTTP エンドポイント 参照 参照
  10. #AzureTravelers アプリ モデル ローカル実行時に環境変数の自動設定 DistributedApplication (アプリ モデル) "cache": Redis のコンテナ

    "apiservice": .NET プロジェクト https://localhost:7829 で起動 "webfrontend": .NET プロジェクト https://localhost:8080 で起動 外部公開用 HTTP エンドポイント 参照 参照 以下の環境変数をデバッグ実行時に自動設定 • ConnectionStrings__cache=tcp://localhost:XXXX • Services__apiservice__https__0=https://localhost:7829
  11. #AzureTravelers 参考: アプリ モデルに追加可能なもの ✓ Azure のリソース • 「Aspire.Hosting.Azure.サービス名」パッケージで Azure

    リソースを指定可能 • 例: Aspire.Hosting.Azure.Redis パッケージを追加することで Redis を Azure Cache for Redis を指定可能 ✓ 任意のコンテナー イメージ • AddContainer メソッドで追加可能 • AddRedis は AddContaienr を使いやすくしたラッパーメソッド ✓ 実行可能ファイル ✓ Bicep ✓ Node.js や npm • Aspire.Hosting.NodeJs パッケージを追加することで指定可能 • ユースケース • フロントエンドは React や Vue などで作ってバックエンドを .NET で作るケース • フロントエンドは .NET で作ってバックエンドは Node.js で作るケース
  12. #AzureTravelers サービスのデフォルトの構成 ServiceDefaults プロジェクトで提供されるデフォルトの構成 • OpenTelemetry の構成 • サービス検出の構成 •

    サービス検出を使用した HttpClient の構成 • ローカル開発用のヘルスチェック エンドポイントの構成 ServiceDefaults プロジェクトの Extensions.cs にコードで定義される 以下の 2 つの拡張メソッドを通して提供される • AddServiceDefaults 拡張メソッド • MapDefaultEndpoints 拡張メソッド
  13. #AzureTravelers サービス検出 別のサービスを呼び出す際に名前でアクセス可能にする機能 .NET でのサービス検出 - .NET | Microsoft Learn

    apiservice エンドポイント: https://localhost:8080 webfrontend 呼び出す 例: webfrontend から apiservice を呼び出す場合
  14. #AzureTravelers サービス検出 サービス名でアクセス可能になる .NET でのサービス検出 - .NET | Microsoft Learn

    通常 var response = await httpClient.GetAsync("https://localhost:8080/api/xxxxx"); サービス検出機能を使う場合 var response = await httpClient.GetAsync("https://apiservice/api/xxxxx"); ホスト名 + ポートではなく名前でアクセス可能になる
  15. #AzureTravelers .NET Aspire コンポーネント .NET Aspire 用に最適な構成が行われたクライアントを DI コンテナに追加する ヘルパー

    ライブラリ • 「Aspire.サービス名.機能名」という名前のNuGet パッケージとして提供 • 例: Aspire.StackExchange.Redis, Aspire.Npgsql, Aspire.Oracle.EntityFrameworkCore リトライや OpenTelemetry などが構成されたクライアントを簡単に追加可能 以下のようなコードで "cache" という名前のアプリ モデルに登録された Redis に接続可能な クライアントが構成される builder.AddRedis("cache"); builder.AddRedisOutput("cache");
  16. #AzureTravelers .NET Aspire を使えば楽が出来そう • .NET Aspire を使えば関係するミドルウェアも一括実行 • 手順書が以下の内容で

    OK • Visual Studio のインストール • Azure Developer CLI インストール • Docker Desktop のインストール • git clone してプロジェクト開いて実行