Slide 1

Slide 1 text

分解して理解する Aspire .NET ラボ 2025/02/22 何縫ねの。

Slide 2

Slide 2 text

自己紹介 1 • 所属: NTTコミュニケーションズ イノベーションセンター • Microsoft MVP for Developer Technologies (2024~) • .NET / Web Development • 趣味: C#, OSS, ドール, 一眼(α7 IV), シーシャ • 執心領域 • C# ⇔ TypeScript • SignalR • Observability / OpenTelemetry 何縫ねの。 nenoNaninu nenoMake ブログ https://blog.neno.dev その他 https://neno.dev

Slide 3

Slide 3 text

OSS 紹介 2 属性を付与するだけ Tapper • C# の型定義から TypeScript の型定義を生成する .NET Tool/ library • JSON / MessagePack 対応! https://github.com/nenoNaninu/Tapper

Slide 4

Slide 4 text

OSS 紹介 3 • C# の SignalR Client を強く型付けするための Source Generator TypedSignalR.Client Before After (using TypedSignalR.Client) こんな SignalR の Hub と Receiver の interface が あったとして… 脱文字列! 全てが強く型付け! https://github.com/nenoNaninu/TypedSignalR.Client

Slide 5

Slide 5 text

4 • TypeScript の SignalR Client を強く型付けするための .NET Tool / library TypedSignalR.Client.TypeScript Before After (using TypedSignalR.Client.TypeScript) 脱文字列! 全てが強く型付け! TypeScript 用の型を C# から自動生成 MessagePack Hub Protocol 対応! https://github.com/nenoNaninu/TypedSignalR.Client.TypeScript 属性を付与するだけ! OSS 紹介

Slide 6

Slide 6 text

5 • SignalR 使ったアプリを快適に開発するための GUI を自動生成する library • 2 step で利用可能! • http pipeline に middleware の追加 • Hub と Receiver を定義してる interface に属性を付与 • JWT 認証 サポート • パラメータのユーザ定義型サポート • JSON で入力! SignalR 版 SwaggerUI TypedSignalR.Client.DevTools https://github.com/nenoNaninu/TypedSignalR.Client.DevTools OSS 紹介

Slide 7

Slide 7 text

AspNetCore.SignalR.OpenTelemetry OSS 紹介 6 https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry • トレースのための計装 • 最低限のログ • 接続時 • Transport 層の情報も出力(WebSocket 等) • メソッド呼び出し時 • HubName.MethodName の素朴なログ • メソッド呼び出し毎にログのスコープを追加 • HubName, MethodName, InvocationId を 振っているのでログの検索性が向上 • Duration • 切断時 • 切断時に例外が発生していれば例外もログに出力 Inspired by HttpLogging SignalR のメソッド呼び出し毎に スパンが切られるように https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry

Slide 8

Slide 8 text

お品書き 7 • Aspire とは (公式の言) • Aspire とは (分かりやすく) • 最小構成で Aspire を使う (not 必要最低限) • Aspire を最低限活用する • ServiceDefaults • Aspire を使ったテスト • Microsoft Developer Control Plane

Slide 9

Slide 9 text

Aspire とは (公式の言) 8

Slide 10

Slide 10 text

Aspire とは (公式の言) 9 https://youtu.be/z1M-7Bms1Jg?si=J-QkcSNjb1Y7-TR7 Aspire で何を解決しようとしていたか

Slide 11

Slide 11 text

Aspire とは (公式の言) 10 https://youtu.be/z1M-7Bms1Jg?si=J-QkcSNjb1Y7-TR7 Aspire で何を解決しようとしていたか

Slide 12

Slide 12 text

Aspire とは (公式の言) 11 https://youtu.be/z1M-7Bms1Jg?si=J-QkcSNjb1Y7-TR7 Aspire の機能として紹介されているものたち

Slide 13

Slide 13 text

Aspire とは (公式の言) 12 https://youtu.be/z1M-7Bms1Jg?si=J-QkcSNjb1Y7-TR7 Aspire の機能として紹介されているものたち てんこ盛り そして混乱する…

Slide 14

Slide 14 text

Aspire とは (公式の言) 13 https://youtu.be/fiePiEc1qcU?si=C3OYpfubori2Aj8F

Slide 15

Slide 15 text

Aspire とは (公式の言) 14 AppHost https://youtu.be/fiePiEc1qcU?si=C3OYpfubori2Aj8F

Slide 16

Slide 16 text

Aspire とは (公式の言) 15 AppHost Aspire 8 時代は Component と 呼ばれていたモノ https://youtu.be/fiePiEc1qcU?si=C3OYpfubori2Aj8F

Slide 17

Slide 17 text

Aspire とは (分かりやすく) 16

Slide 18

Slide 18 text

Aspire とは (分かりやすく) 17 Aspire が提供してくれる事は主に3つ

Slide 19

Slide 19 text

Aspire とは (分かりやすく) 18 Aspire が提供してくれる事は主に3つ 分散アプリケーションの開発のためのローカル開発環境 • 現時点においてはこれが主な価値 • 実は(?)分散アプリケーションの開発ではなくても十分利用する価値がある

Slide 20

Slide 20 text

Aspire とは (分かりやすく) 19 Aspire が提供してくれる事は主に3つ 分散アプリケーションの開発のためのローカル開発環境 • 現時点においてはこれが主な価値 • 実は(?)分散アプリケーションの開発ではなくても十分利用する価値がある 分散アプリケーションのテスト • 分散アプリケーションのテストがだいぶ書きやすくなる

Slide 21

Slide 21 text

Aspire とは (分かりやすく) 20 Aspire が提供してくれる事は主に3つ 分散アプリケーションの開発のためのローカル開発環境 • 現時点においてはこれが主な価値 • 実は(?)分散アプリケーションの開発ではなくても十分利用する価値がある 分散アプリケーションのテスト • 分散アプリケーションのテストがだいぶ書きやすくなる クラウドへのデプロイ • 現時点においてこれを目的で Aspire 使うのはあまりおススメしない

Slide 22

Slide 22 text

Aspire とは (分かりやすく) 21 Aspire を使うと前述の3つ以外にも いろいろな機能を提供してくれるらしいけど、それはどこへ…? • 例えば以下のような機能 • Observability • Resiliency • Health check • Service discovery Aspire を使う上では全て必須な要素ではない (パッケージ的には Aspire が提供している機能ではない)

Slide 23

Slide 23 text

最小構成で Aspire を使う (not 必要最低限) 22

Slide 24

Slide 24 text

最小構成で Aspire を使う (not 必要最低限) 23 最小構成でAspire を使う手順 1. AppHost を作成する • $ dotnet new aspire-apphost -n “MyAppHost” 2. AppHost の csproj にアプリケーションの project reference を追加 3. AppHost の Program.cs で AddProject する 4. 以上! 自分たちのアプリケーションの プロジェクト

Slide 25

Slide 25 text

最小構成で Aspire を使う (not 必要最低限) 24 実はこれだけで Aspire は起動する • Q: この最小構成で Aspire を使う意味あるの? • A: あまりありません • あくまで「Aspire を使う上で余計なものは必要ない」という事を伝えたい

Slide 26

Slide 26 text

最小構成で Aspire を使う (not 必要最低限) 25 実はこれだけで Aspire は起動する • Q: この最小構成で Aspire を使う意味あるの? • A: あまりありません • あくまで「Aspire を使う上で余計なものは必要ない」という事を伝えたい 現時点ではコンソールログが ここで見えるだけ

Slide 27

Slide 27 text

最小構成で Aspire を使う (not 必要最低限) 26 実はこれだけで Aspire は起動する • Q: この最小構成で Aspire を使う意味あるの? • A: あまりありません • あくまで「Aspire を使う上で余計なものは必要ない」という事を伝えたい 現時点ではコンソールログが ここで見えるだけ 下3つは現状機能しない

Slide 28

Slide 28 text

最小構成で Aspire を使う (not 必要最低限) 27 Aspire を使う上では AddServiceDefaults() とかいうのを アプリケーション側で呼び出す必要があるらしいじゃん? 呼び出さなくていいの? • AddServiceDefaults() を呼び出す事は必須ではない

Slide 29

Slide 29 text

最小構成で Aspire を使う (not 必要最低限) 28 Aspire を使う上では AddServiceDefaults() とかいうのを アプリケーション側で呼び出す必要があるらしいじゃん? 呼び出さなくていいの? • AddServiceDefaults() を呼び出す事は必須ではない 実際自分は使ってない

Slide 30

Slide 30 text

Aspire を最低限活用する 29

Slide 31

Slide 31 text

Aspire を最低限活用する 30 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3)

Slide 32

Slide 32 text

Aspire を最低限活用する 31 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3) アプリケーションに必要な各種コンポーネントを一括で起動 • C# Project (w/ debugger) だけでなく PostgreSQL, Redis 等も起動してくれる • 接続文字列も良い感じに面倒みてくれる

Slide 33

Slide 33 text

Aspire を最低限活用する 32 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3) アプリケーションに必要な各種コンポーネントを一括で起動 • C# Project (w/ debugger) だけでなく PostgreSQL, Redis 等も起動してくれる • 接続文字列も良い感じに面倒みてくれる 今まで docker compose とかで 整備していたそれらが不要に…!

Slide 34

Slide 34 text

Aspire を最低限活用する 33 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3) アプリケーションに必要な各種コンポーネントを一括で起動 • C# Project (w/ debugger) だけでなく PostgreSQL, Redis 等も起動してくれる • 接続文字列も良い感じに面倒みてくれる 開発用ダッシュボードで OpenTelemetry のテレメトリを漁れる • 構造化ログ • トレース • メトリック 今まで docker compose とかで 整備していたそれらが不要に…!

Slide 35

Slide 35 text

Aspire を最低限活用する 34 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3) アプリケーションに必要な各種コンポーネントを一括で起動 • C# Project (w/ debugger) だけでなく PostgreSQL, Redis 等も起動してくれる • 接続文字列も良い感じに面倒みてくれる 開発用ダッシュボードで OpenTelemetry のテレメトリを漁れる • 構造化ログ • トレース • メトリック OpenTelemetry 依存 今まで docker compose とかで 整備していたそれらが不要に…!

Slide 36

Slide 36 text

Aspire を最低限活用する 35 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3) アプリケーションに必要な各種コンポーネントを一括で起動 • C# Project (w/ debugger) だけでなく PostgreSQL, Redis 等も起動してくれる • 接続文字列も良い感じに面倒みてくれる 開発用ダッシュボードで OpenTelemetry のテレメトリを漁れる • 構造化ログ • トレース • メトリック アプリケーション間の HTTP 通信の構成が容易に • C# コード内で URI を文字列でべた書き可能に OpenTelemetry 依存 今まで docker compose とかで 整備していたそれらが不要に…!

Slide 37

Slide 37 text

Aspire を最低限活用する 36 Aspire をローカル開発環境で使って嬉しいポイント(TOP 3) アプリケーションに必要な各種コンポーネントを一括で起動 • C# Project (w/ debugger) だけでなく PostgreSQL, Redis 等も起動してくれる • 接続文字列も良い感じに面倒みてくれる 開発用ダッシュボードで OpenTelemetry のテレメトリを漁れる • 構造化ログ • トレース • メトリック アプリケーション間の HTTP 通信の構成が容易に • C# コード内で URI を文字列でべた書き可能に OpenTelemetry 依存 これはローカル開発環境 以外でも嬉しい 今まで docker compose とかで 整備していたそれらが不要に…!

Slide 38

Slide 38 text

Aspire を最低限活用する 37 Aspire を活用する上で 最低限アプリケーション側に追加するべきパッケージ • OpenTelemetry • 必須 • Microsoft.Extensions.ServiceDiscovery • アプリケーション間の HTTP 通信を容易にするために必要なパッケージ • アプリケーション間で HTTP 通信しないならこのパッケージは不要

Slide 39

Slide 39 text

Aspire を最低限活用する 38 Aspire が OpenTelemetry 関連でやってくれる事

Slide 40

Slide 40 text

Aspire を最低限活用する 39 Aspire が OpenTelemetry 関連でやってくれる事 WebApi

Slide 41

Slide 41 text

Aspire を最低限活用する 40 Aspire が OpenTelemetry 関連でやってくれる事 WebApi OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的

Slide 42

Slide 42 text

Aspire を最低限活用する 41 Aspire が OpenTelemetry 関連でやってくれる事 WebApi Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 やってくれる事①

Slide 43

Slide 43 text

Aspire を最低限活用する 42 Aspire が OpenTelemetry 関連でやってくれる事 WebApi Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 アプリケーション側は OTLP でテレメトリを飛ばすよう 構成しておく必要がある やってくれる事①

Slide 44

Slide 44 text

Aspire を最低限活用する 43 Aspire が OpenTelemetry 関連でやってくれる事 WebApi OTLP Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 アプリケーション側は OTLP でテレメトリを飛ばすよう 構成しておく必要がある やってくれる事①

Slide 45

Slide 45 text

Aspire を最低限活用する 44 Aspire が OpenTelemetry 関連でやってくれる事 WebApi OTLP Aspire Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 アプリケーション側は OTLP でテレメトリを飛ばすよう 構成しておく必要がある やってくれる事①

Slide 46

Slide 46 text

Aspire を最低限活用する 45 Aspire が OpenTelemetry 関連でやってくれる事 WebApi OTLP Aspire Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 アプリケーション側は OTLP でテレメトリを飛ばすよう 構成しておく必要がある Aspire は OTLP で投げられた テレメトリを受け取ってくれる (OpenTelemetry backend) やってくれる事① やってくれる事②

Slide 47

Slide 47 text

Aspire を最低限活用する 46 Aspire が OpenTelemetry 関連でやってくれる事 WebApi OTLP Aspire Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 アプリケーション側は OTLP でテレメトリを飛ばすよう 構成しておく必要がある テレメトリを ダッシュボードで 可視化 やってくれる事① やってくれる事③ Aspire は OTLP で投げられた テレメトリを受け取ってくれる (OpenTelemetry backend) やってくれる事②

Slide 48

Slide 48 text

Aspire を最低限活用する 47 Aspire が OpenTelemetry 関連でやってくれる事 WebApi OTLP Aspire Aspire はアプリケーションに OTEL_EXPORTER_OTLP_ENDPOINT という環境変数を自動で渡す OpenTelemetry Protocol (OTLP) を 用いたテレメトリの送信先は OTEL_EXPORTER_OTLP_ENDPOINT という環境変数で渡すのが標準的 アプリケーション側は OTLP でテレメトリを飛ばすよう 構成しておく必要がある テレメトリを ダッシュボードで 可視化 やってくれる事① やってくれる事③ Aspire は OTLP で投げられた テレメトリを受け取ってくれる (OpenTelemetry backend) やってくれる事② Aspire が無い時代はローカル用に OpenTelemetry backend 用の config を 書いて動かさないとだった…

Slide 49

Slide 49 text

Aspire を最低限活用する 48 OpenTelemetry の導入 C# ではじめる OpenTelemetry。 https://blog.neno.dev/entry/2023/12/23/194947 https://speakerdeck.com/nenonaninu/c-number-dehazimeru-opentelemetry

Slide 50

Slide 50 text

• アプリケーション側で環境変数を元に BaseAddress 設定して云々 • 環境変数設定する際、正しい値は何かとか把握するの地味に面倒 • そして設定漏れ… Aspire を最低限活用する 49 アプリケーション間の HTTP 通信の構成って地味に面倒ですよね… WebApi WebApi2 HTTPS WebApi から WebApi2 への HTTP 通信の構成は 地味に面倒 環境変数とかポートとか 気にする事が地味そこそこある

Slide 51

Slide 51 text

• 以下のようにベタ書きでエンドポイントを指定できる • だたし所定のフォーマットで環境変数が渡っている必要がある • services__webapi2__http • services__webapi2__https • services__webapi2__http__0 (配列形式) Aspire を最低限活用する 50 そこで Microsoft.Extensions.ServiceDiscovery

Slide 52

Slide 52 text

• 以下のようにベタ書きでエンドポイントを指定できる • だたし所定のフォーマットで環境変数が渡っている必要がある • services__webapi2__http • services__webapi2__https • services__webapi2__http__0 (配列形式) Aspire を最低限活用する 51 そこで Microsoft.Extensions.ServiceDiscovery http+https:// と書くことによって 環境変数次第で http と https を切り替えられる

Slide 53

Slide 53 text

• 以下のようにベタ書きでエンドポイントを指定できる • だたし所定のフォーマットで環境変数が渡っている必要がある • services__webapi2__http • services__webapi2__https • services__webapi2__http__0 (配列形式) Aspire を最低限活用する 52 そこで Microsoft.Extensions.ServiceDiscovery ServiceDiscovery を 使うために必要な構成 http+https:// と書くことによって 環境変数次第で http と https を切り替えられる

Slide 54

Slide 54 text

• Aspire が Ms.Ex.ServiceDiscovery 絡みでやってくれる事 • Ms.Ex.ServiceDiscovery に適した環境変数を渡してくれる (これだけ!) • WithReference でアプリケーション間の参照関係を 明示する事によってAspire は services__webapi2__http 形式の環境変数をアプリケーションに設定 Aspire を最低限活用する 53 Aspire と Microsoft.Extensions.ServiceDiscovery の関係

Slide 55

Slide 55 text

• Aspire が Ms.Ex.ServiceDiscovery 絡みでやってくれる事 • Ms.Ex.ServiceDiscovery に適した環境変数を渡してくれる (これだけ!) • WithReference でアプリケーション間の参照関係を 明示する事によってAspire は services__webapi2__http 形式の環境変数をアプリケーションに設定 Aspire を最低限活用する 54 Aspire と Microsoft.Extensions.ServiceDiscovery の関係 これだけ!

Slide 56

Slide 56 text

• Aspire が Ms.Ex.ServiceDiscovery 絡みでやってくれる事 • Ms.Ex.ServiceDiscovery に適した環境変数を渡してくれる (これだけ!) • WithReference でアプリケーション間の参照関係を 明示する事によってAspire は services__webapi2__http 形式の環境変数をアプリケーションに設定 Aspire を最低限活用する 55 Aspire と Microsoft.Extensions.ServiceDiscovery の関係 これだけ! ここに渡す名前次第で 環境変数が決まる

Slide 57

Slide 57 text

• http+https:// みたいな書き方は Grpc.Net.Client では使えない • Ms.Ex.ServiceDiscovery は DelegatingHandler を挟みこみ そこでエンドポイントを環境変数で渡された値で扱うようになる • Grpc.Net.Client は HttpMessageHandler 内で Uri を処理するより先に、 自前でプロトコルを判定している • Grpc.Net.Client では client-side load balancing のため, http://, https:// 以外にも dns://, static:// 等を書くことが可能 • http+https:// はサポート外の謎プロトコルとして判定され死ぬ Aspire を最低限活用する 56 Grpc.Net.Client と Microsoft.Extensions.ServiceDiscovery

Slide 58

Slide 58 text

Aspire を最低限活用する 57 HTTP 通信しないエンドポイントに対する接続文字列 • 例えば以下のように WithReference しているのが database の場合 • WebApi の環境変数として ConnectionStrings__mydatabase が Aspire から渡されるようになる • アプリケーション側は接続文字列を ConfigurationExtensions.GetConnectionString() で簡単に取得できる

Slide 59

Slide 59 text

Aspire を最低限活用する 58 Aspire がやってくれることとを大雑把に整理すると… • 各リソース (C# Project, PostgreSQL, Redis, etc.) の管理 • up/down/restart • OpenTelemetry backend / dashboard の提供 • アプリケーションに対してやってくれる事 • 環境変数の追加 (これだけ!) Aspire を導入するとアプリケーションに追加されると 宣伝されている機能の全ては AddServiceDefaults() した際に追加される別パッケージ由来の機能

Slide 60

Slide 60 text

Aspire を最低限活用する 59 このあたりまでやれば Aspire を 最低限活用しているといって良いでしょう…!

Slide 61

Slide 61 text

ServiceDefaults 60

Slide 62

Slide 62 text

• 前述のとおり、Aspire を使う上で必須ではない ServiceDefaults 61 Aspire の機能として宣伝されている機能は ServiceDefaults で構成されているに過ぎない

Slide 63

Slide 63 text

ServiceDefaults 62 AddServiceDefaults の中身

Slide 64

Slide 64 text

ServiceDefaults 63 AddServiceDefaults の中身 【C#】.NET 8 世代で追加された ConfigureHttpClientDefaults について。 https://blog.neno.dev/entry/2024/07/12/175331

Slide 65

Slide 65 text

ServiceDefaults 64 AddServiceDefaults の中身 【C#】.NET 8 世代で追加された ConfigureHttpClientDefaults について。 https://blog.neno.dev/entry/2024/07/12/175331 【C#】StandardResilienceHandler で HTTP リクエストの回復力を高める。 https://blog.neno.dev/entry/2024/08/08/171524

Slide 66

Slide 66 text

Aspire を使ったテスト 65

Slide 67

Slide 67 text

Aspire を使ったテスト 66 分散アプリケーションの結合テスト書きづらい • WebApi が WebApi2 を叩くような WEB API のテスト書くには、 事前に両方のサーバを立ち上げてからテストを実行する必要がある • いろいろ実行に必要なコンポーネント一式立ち上げる必要がある • WebApplicationFactory によるアプリケーション単体の WEB API のテストに比べると正直かなりめんどくさい

Slide 68

Slide 68 text

Aspire を使ったテスト 67 分散アプリケーションの結合テスト書きづらい • WebApi が WebApi2 を叩くような WEB API のテスト書くには、 事前に両方のサーバを立ち上げてからテストを実行する必要がある • いろいろ実行に必要なコンポーネント一式立ち上げる必要がある • WebApplicationFactory によるアプリケーション単体の WEB API のテストに比べると正直かなりめんどくさい Aspire を使うと かなりテストを書きやすくなる

Slide 69

Slide 69 text

Aspire を使ったテスト 68 基本は DistributedApplicationTestingBuilder

Slide 70

Slide 70 text

Aspire を使ったテスト 69 基本は DistributedApplicationTestingBuilder integration test 相当のテストが 非常に書きやすくなった

Slide 71

Slide 71 text

Aspire を使ったテスト 70 基本は DistributedApplicationTestingBuilder

Slide 72

Slide 72 text

Aspire を使ったテスト 71 基本は DistributedApplicationTestingBuilder Resources から各リソースを ひぱってきて 多少のテストも可能

Slide 73

Slide 73 text

Aspire を使ったテスト 72 WebApplicationFactory と DistributedApplicationFactory の違い • WebApplicationFactory は ConfigureServices で DI コンテナをカスタムできる • しかし DistributedApplicationFactory から各プロジェクトに対する ConfigureServices は無さそう。

Slide 74

Slide 74 text

Aspire を使ったテスト 73 WebApplicationFactory と DistributedApplicationFactory の違い • WebApplicationFactory は ConfigureServices で DI コンテナをカスタムできる • しかし DistributedApplicationFactory から各プロジェクトに対する ConfigureServices は無さそう。 このあたりがすこし不便

Slide 75

Slide 75 text

Microsoft Developer Control Plane 74 ここから少し deep な話

Slide 76

Slide 76 text

Microsoft Developer Control Plane 75 Aspire と port

Slide 77

Slide 77 text

Microsoft Developer Control Plane 76 Aspire と port

Slide 78

Slide 78 text

Microsoft Developer Control Plane 77 Aspire と port

Slide 79

Slide 79 text

Microsoft Developer Control Plane 78 Aspire と port なんかポート違うぞ…? どっち叩いても繋がるぞ…?

Slide 80

Slide 80 text

Microsoft Developer Control Plane 79 Aspire と port launchSettings.json 次第 なんかポート違うぞ…? どっち叩いても繋がるぞ…?

Slide 81

Slide 81 text

Microsoft Developer Control Plane 80 Aspire と port launchSettings.json 次第 Aspire が動的にバインドした port なんかポート違うぞ…? どっち叩いても繋がるぞ…?

Slide 82

Slide 82 text

Microsoft Developer Control Plane 81 Aspire と port なんかポート違うぞ…? どっち叩いても繋がるぞ…? launchSettings.json 次第 Aspire が動的にバインドした port

Slide 83

Slide 83 text

Microsoft Developer Control Plane 82 Aspire と port なんかポート違うぞ…? どっち叩いても繋がるぞ…? launchSettings.json 次第 Aspire が動的にバインドした port

Slide 84

Slide 84 text

Microsoft Developer Control Plane 83 Aspire と port なんかポート違うぞ…? どっち叩いても繋がるぞ…? launchSettings.json 次第 Aspire が動的にバインドした port わかる

Slide 85

Slide 85 text

Microsoft Developer Control Plane 84 Aspire と port なんかポート違うぞ…? どっち叩いても繋がるぞ…? launchSettings.json 次第 Aspire が動的にバインドした port お前は誰だ? わかる

Slide 86

Slide 86 text

Microsoft Developer Control Plane 85 Aspire と port WithReplicas を追加

Slide 87

Slide 87 text

Microsoft Developer Control Plane 86 Aspire と port

Slide 88

Slide 88 text

Microsoft Developer Control Plane 87 Aspire と port

Slide 89

Slide 89 text

Microsoft Developer Control Plane 88 Aspire と port

Slide 90

Slide 90 text

Microsoft Developer Control Plane 89 Aspire と port

Slide 91

Slide 91 text

Microsoft Developer Control Plane 90 Aspire と port

Slide 92

Slide 92 text

Microsoft Developer Control Plane 91 Reverse Proxy 的な役割をしてるのがひっそり存在する

Slide 93

Slide 93 text

Microsoft Developer Control Plane 92 Reverse Proxy 的な役割をしてるのがひっそり存在する dcpctrl (https://localhost:7023) https WebApi (https://localhost:53584) WithReplicas なし

Slide 94

Slide 94 text

Microsoft Developer Control Plane 93 Reverse Proxy 的な役割をしてるのがひっそり存在する dcpctrl (https://localhost:7023) https WebApi (https://localhost:53584) dcpctrl (https://localhost:7023) WebApi (https://localhost:55204) https WebApi (https://localhost:55207) WebApi (https://localhost:55209) WithReplicas あり WithReplicas なし

Slide 95

Slide 95 text

Microsoft Developer Control Plane 94 よもやま話: Ms.AspNetCore.OpenApi と Aspire の食い合わせが絶妙に悪い

Slide 96

Slide 96 text

Microsoft Developer Control Plane 95 よもやま話: Ms.AspNetCore.OpenApi と Aspire の食い合わせが絶妙に悪い Microsoft.AspNetCore.OpenApi が吐き出す JSON には Servers が入っている

Slide 97

Slide 97 text

Microsoft Developer Control Plane 96 よもやま話: Ms.AspNetCore.OpenApi と Aspire の食い合わせが絶妙に悪い Microsoft.AspNetCore.OpenApi が吐き出す JSON には Servers が入っている Aspire のダッシュボード上の エンドポイントから開くと 当然 dcpctrl が動いている port に繋がる

Slide 98

Slide 98 text

Microsoft Developer Control Plane 97 よもやま話: Ms.AspNetCore.OpenApi と Aspire の食い合わせが絶妙に悪い Microsoft.AspNetCore.OpenApi が吐き出す JSON には Servers が入っている dcpctrl の port 宛てではなく アプリケーションの port を 直に叩きに行くので CORS で機能しない Aspire のダッシュボード上の エンドポイントから開くと 当然 dcpctrl が動いている port に繋がる

Slide 99

Slide 99 text

Microsoft Developer Control Plane 98 よもやま話: Ms.AspNetCore.OpenApi と Aspire の食い合わせが絶妙に悪い Microsoft.AspNetCore.OpenApi が吐き出す JSON には Servers が入っている Aspire のダッシュボード上の エンドポイントから開くと 当然 dcpctrl が動いている port に繋がる 結局未だに Swashbuckle 使ってる dcpctrl の port 宛てではなく アプリケーションの port を 直に叩きに行くので CORS で機能しない

Slide 100

Slide 100 text

Microsoft Developer Control Plane 99 dcpctrl ってなに? • Microsoft Developer Control Plane (dcp) Control の事 (ぽい) • Microsoft Developer Control Plane については • ドキュメントなし • OSS でもない

Slide 101

Slide 101 text

Microsoft Developer Control Plane 100 dcpctrl ってなに? • Microsoft Developer Control Plane (dcp) Control の事 (ぽい) • Microsoft Developer Control Plane については • ドキュメントなし • OSS でもない

Slide 102

Slide 102 text

Microsoft Developer Control Plane 101 dcpctrl ってなに? • Microsoft Developer Control Plane (dcp) Control の事 (ぽい) • Microsoft Developer Control Plane については • ドキュメントなし • OSS でもない dcpctrl だけでなく dcp も存在する

Slide 103

Slide 103 text

Microsoft Developer Control Plane 102 dcpctrl ってなに? • Microsoft Developer Control Plane (dcp) Control の事 (ぽい) • Microsoft Developer Control Plane については • ドキュメントなし • OSS でもない なので「ぽい」としか いいようがない dcpctrl だけでなく dcp も存在する

Slide 104

Slide 104 text

Microsoft Developer Control Plane 103 dcpctrl ってなに? • Microsoft Developer Control Plane (dcp) Control の事 (ぽい) • Microsoft Developer Control Plane については • ドキュメントなし • OSS でもない https://github.com/dotnet/aspire/blob/v9.0.0/eng/dcppack/Common.projitems#L38-L46 なので「ぽい」としか いいようがない dcpctrl だけでなく dcp も存在する

Slide 105

Slide 105 text

Microsoft Developer Control Plane 104 dcp / dcpctrl のコマンドライン引数を覗いてみると…

Slide 106

Slide 106 text

Microsoft Developer Control Plane 105 dcp / dcpctrl のコマンドライン引数を覗いてみると… --kubeconfig …! --kubeconfig …!

Slide 107

Slide 107 text

Microsoft Developer Control Plane 106 kubeconfig を覗いてみる

Slide 108

Slide 108 text

Microsoft Developer Control Plane 107 kubeconfig を覗いてみる

Slide 109

Slide 109 text

Microsoft Developer Control Plane 108 kubeconfig を覗いてみる

Slide 110

Slide 110 text

Microsoft Developer Control Plane 109 kubeconfig を覗いてみる

Slide 111

Slide 111 text

Microsoft Developer Control Plane 110 kubeconfig を覗いてみる

Slide 112

Slide 112 text

Microsoft Developer Control Plane 111 kubeconfig を覗いてみる

Slide 113

Slide 113 text

Microsoft Developer Control Plane 112 kubeconfig を覗いてみる kubectl 叩けるのでは…?

Slide 114

Slide 114 text

Microsoft Developer Control Plane 113 kubectl 叩ける…!

Slide 115

Slide 115 text

Microsoft Developer Control Plane 114 kubectl 叩ける…! Aspire の構成

Slide 116

Slide 116 text

Microsoft Developer Control Plane 115 kubectl 叩ける…! Aspire の構成

Slide 117

Slide 117 text

Microsoft Developer Control Plane 116 kubectl で service を確認

Slide 118

Slide 118 text

Microsoft Developer Control Plane 117 kubectl で service を確認

Slide 119

Slide 119 text

Microsoft Developer Control Plane 118 kubectl で service を確認

Slide 120

Slide 120 text

Microsoft Developer Control Plane 119 kubectl で service を確認

Slide 121

Slide 121 text

Microsoft Developer Control Plane 120 kubectl で service を確認 dcpctrl は service 相当 の reverse proxy …?

Slide 122

Slide 122 text

Microsoft Developer Control Plane 121 kubectl で service を確認 dcpctrl は service 相当 の reverse proxy …? ただの reverse proxy に こんな名前与えるかなぁ…?? 他の事もやってそう…

Slide 123

Slide 123 text

Microsoft Developer Control Plane 122 Microsoft Developer Control Plane の仕事 • .NET プロジェクト起動したり、コンテナを起動したりしているのは Microsoft Developer Control Plane ぽい • Aspire は C# の k8s client 経由で Microsoft Developer Control Plane を叩いている Aspire dcp kubectl dcpctrl (reverse proxy ?)

Slide 124

Slide 124 text

まとめ 123 Aspire を必要最低限使うには • OpenTelemetry は必須 • Microsoft.Extensions.ServiceDiscovery が次点で必要 • AddServiceDefaults() は不要 Aspire を用いたテスト • 基本は DistributedApplicationTestingBuilder • WebApplicationFactory と DistributedApplicationFactory の違い Microsoft Developer Control Plane • Port の挙動はこのあたりうっすらと知っていると理解が容易 • ただしドキュメントもないし OSS でもない • kubectl で叩ける