🦞

「自作ライブラリのAspire対応をしてみての感想 ...」に関してC# Tokyoで登壇しました

2024/03/27に公開

株式会社ジェイテックジャパン CTOの高丘 @tomohisaです。2024年3月26日、【登壇者募集中】【オンライン】.NET Aspireイベントで登壇しました!

https://csharp-tokyo.connpass.com/event/312383/

スライドはこちらです。

https://speakerdeck.com/tomohisa/zi-zuo-raiburarinoaspiredui-ying-wositemitenogan-xiang-sekiban-plus-aspire-equals-jian-dan-ibentososinguhuan-jing-gou-zhu

登壇内容のまとめ

Aspireへのライブラリ対応の方法

Aspire には

  • ホストに追加する機能
    • ローカルでプロセスとして起動するもの
    • Dockerなどのコンテナで起動するもの
    • ConnectionString を提供するもの
  • 各サービスで使うコンポーネント
    • 環境変数で設定を受け取る
    • Aspireなしでも動くが、使いやすさを提供するためにNugetパッケージを提供している

SekibanはCosmosやPostgresを使うコンポーネントのため、Aspireとして特別にリリースしなくても、Aspireのコンポーネントの利用は可能
では、なぜAspire対応をしたのか?

image1

Aspireのページにあるように、 簡単に接続するために設計された NuGet パッケージ がAspireの利点であるため、SekibanのようなAspireのコンポーネントを使用するライブラリもAspire用のNuget パッケージをリリースすることで便利に利用することができる。

リリースの仕方について

AspireのGithubのDiscussionsで直接聞いてみた

image1

追加方法の結論

  • Aspireのコンポーネントは特別でないから普通はいらないよ
    • はい、理解して作成しています。あった方がユーザーが楽だから
  • Aspire.* はオフィシャルコンポーネントに予約されているから使えないよ
    • はい、理解しています
  • あとは自分で好きな名前でいいんじゃない

追加しました!

Postgres版も将来追加予定(Packageを作らなくてもAspireでPostgresを使用可能)

Aspire + Sekiban連携の説明

Cosmos DBのホストの定義に関して
接続文字列をホストから送ることで設定可能

builder.AddConnectionString("SekibanAspireCosmos"); // 検証済み

Cosmos DBのコントロールでの使用
Sekiban.Aspire.Infrastructure.Cosmos Nugetパッケージをインストール
Aspire用のAddCosmosを呼び出す

builder.AddSekibanCosmosDb()
    .AddSekibanCosmosAspire("SekibanAspireCosmos")
    .AddSekibanBlobAspire("SekibanAspireBlob");

Postgres のホスト定義

  • HostでPostgresインスタンスを立てる🙆
  • HostのPostgresインスタンスのWebのAdminツールを立てる🙆
  • Hostのデータを毎回クリアしないようにする🙆
  • Hostに複数のデータベースを作成する🙆
var postgres = builder.AddPostgres(
        "aspirePostgres", 
        password: builder.Configuration["POSTGRES_PASSWORD"])
    .WithVolumeMount("VolumeMount.postgres.data", "/var/lib/postgresql/data")
    .WithPgAdmin()
    .AddDatabase("SekibanAspirePostgres");

Postgres のコンポーネントの利用方法

  • Sekiban.Infrastructure.Postgres (Aspire専用ではない)Nugetをインストール
  • Aspireの設定を追加する
  • Sekibanは現在はPostgresとBlobStorageが必要
builder.AddSekibanPostgresDbOnlyFromConnectionStringName("SekibanAspirePostgres");
builder.AddSekibanAzureBlobStorage();

上記のサンプルはSekibanのオフィシャルのサンプルとして追加しています。

Sekiban Aspire Sample

その後のデモでは以下の点を行いました。

  • Sekibanのコードを確認
  • Postgresのホストに接続してデータを作る
  • Postgresのアドミンサービスを使ってみる
  • Postgresのデータを再起動でも残っているのを確認
  • Postgresのデータの削除
  • Postgresから、Cosmos DBに接続を切り替える

Aspireの利点 + 将来性

いくつかの質問や懸念点を扱いました

App Hostから起動して、AppServiceのデバッグはできますか?
はい、プロセスにアタッチして可能です

プレビュー版で開発して大丈夫ですか?
はい、リリースだけに関しては、普通にプロジェクトごとにAppServiceにリリースするコードを現時点でも記述可能です。
全部の自動リリースのコードもすでにかけますし、将来はAWSに対しても欠けるようになると思いますが、デプロイ機能は使っても使わなくてもオーケー

分散システムについて今から考えないといけませんか?
いいえ、YARPなどのSevice Discovery は後から追加することは可能なので、普通に開発していくことができます。

Blazorじゃないとだめなの?
いいえ、相対フォルダでnpmパッケージを追加できるようになりました。
macだとNVMのデフォルトが古くて動かなかった
なぜか、設定変更だけでなく、macのリスタートが必要でした
sudo dotnet workload update で dcpを更新する必要がありました
npm i をしとかないとダメだった。

一緒に実行できるから楽に管理できるので良さそう。

デメリット的なことは?
きれいにうごかないときにアプリの再起動が必要なことがある
Macの再起動か必要な時もある
starter プロジェクトではない時に設定が面倒だったりする
まだAzure Functionsに対応していない??? David Fowlerの出ているPodcastでは将来対応すると言っていた
https://www.dotnetrocks.com/details/1881

まとめ

  • つかってみてとても使いやすい
  • DevSecOps的ないろんな新しい機能を追加していきやすい
  • 分散システムの構成も作りやすい。スケールアップ、リバースプロキシ、コンテナ、Dapr etc...
  • Postgresのローカル開発環境を簡単に建てられるの嬉しい
  • AppServiceのデファクトスタンダードになりそう
  • 触っておくと良いと思いました

今回の登壇では、Nuget をニューゲットと正しく発音しようと試みたのですが、半分以上 ヌーゲットと言ってしまいました。ニューゲットの方が正しいですよというのをどこかでみたので、修正しようとしたのですが、なかなか治らないものですね。

先回の登壇でもジェミニ、ジェミナイ問題が話題になりました。発音はできるだけ正しいものを行いたいのですが、なかなか難しいですね。

他の登壇の感想

20240326_NET Aspire概要

たなか🐧さんによるAspireの概要セッション、特にAspireについてあまり知らない方が見ても概要がよるわかる内容でとても良かったです。

  • ホスト
  • コンポーネント
  • ダッシュボード
  • サービスディスカバリー
  • オブザーバビリティー
  • デプロイメント

などの基本用語を説明してくださった上でデモも行ってくださいました。

  • WPFとの連携
  • Orleans
    などの技術についても扱ってくださったので勉強になりました。

https://www.docswell.com/s/tanaka_733/ZXYX8N-2024-03-26-aspire

もうすぐGA(のはず)!.NET Aspire実践的探求デモ

Takashi UesakaさんによるAspireのライブデモセッションでした。

Aspire Starter テンプレートから開始して

  • AzureのPostgresに接続する
  • PostgresのEntity Framework Coreを定義する
  • Hostから接続文字列をインジェクトする
  • HostでローカルPostgresを立てる
  • ローカルPostgresに初期データを入れる
  • azd コンソールで Azure Container Appsでappservice, webappのリリースをしつつ、postgresの接続文字列は設定として既存のマネージドAzure Postgresのものを導入する

までを行いつつ、余った時間で

  • ダッシュボードをリリースして既存のAspireアプリから監視データを送る

  • 永続化手法が確立していないため現時点ではあまり使い物にならない(将来的には永続化が確立して使いやすくなる可能性もあると思います)
    のデモも見せてくださり、盛りだくさんでした

  • SQL Server

  • Dapr
    のデモも準備してくださっていたみたいなので、どこかで2時間くらいのハンズオンセッションをyoutubeなどで公開してくださると、使いたい方々にとってとても有益なのかなと思いました。

まとめ

参加者の少ないイベントでしたが、Aspireはdotnet自体の価値を高めてこれからのdotnet開発のデファクトスタンダードになりそうに感じているので、とても楽しいイベントでした。発表者、イベント運営の皆様、参加者の皆様、ありがとうございました。

ジェイテックジャパンブログ

Discussion