みつばたんが最近 ASP.NET Core MVC 周りで死ぬほどはまっていたみたいですが、ポートフォリオサイトを作っていたようです。自分は死ぬほどはまっていた時には全くアドバイスしなかったのに、大体動くようになってからアドバイスをするという徳の低いことをした気がします。
その時のアドバイスは雑に Twitter で空リプで行いましたが、残しておいた方が良いかなと思ったので雑に Twitter を引用しつつまとめました。
認証は AAD + Easy Auth で
数えきれないぐらい言ってきていますが、サクッとサイトをログイン必須にして保護したい場合には AAD と Easy Auth を使うのが手っ取り早いです。
B2C は要らんやろ。Easy Auth で AAD を設定すれば Azure Portal にログイン出来る人間だけログイン出来るようになる
— Tatsuro Shibamura (@shibayan) 2020年7月9日
同じ App Service Plan に載せれば金額は同じやしな。https://t.co/9vTmtCukjr Core プロジェクト自体も分けた方が圧倒的に良い
— Tatsuro Shibamura (@shibayan) 2020年7月9日
カスタムドメイン + リバースプロキシ環境下で動作させている時には、Easy Auth がちゃんとホスト名を認識してくれず動作しない気配があるので、カスタムドメインを割り当てるか App Service のデフォルトドメインで運用するかになるでしょう。
プロバイダーに AAD を選ぶと、現在のテナントに入っているユーザーのみログイン可能なページを作れるので楽です。セットアップも一番楽なので、大体はこれを使っておけば良いです。
ASP.NET Core Routing のオプション
未だにデフォルトで小文字にならないのが不思議ですが、ASP.NET Core MVC のルーティングで URL を生成すると Pascal Case で生成されます。要するにクラス名と同じというわけです。
後は URL を小文字生成するようにすればダサさが消える
— Tatsuro Shibamura (@shibayan) 2020年7月9日
services.AddRouting(options => options.LowercaseUrls = true);
— Tatsuro Shibamura (@shibayan) 2020年7月9日
ルーティングのオプションで LowercaseUrls = true
を設定することで小文字な URL を生成できます。
Startup
クラスで書くと以下のようになります。知っていれば大したことない部分です。
public void ConfigureServices(IServiceCollection services) { services.AddRouting(options => options.LowercaseUrls = true); services.AddControllers(); }
ASP.NET MVC の時のように常にテンプレ的に書くようにしていますが、やはりデフォルトは小文字にしてほしいです。とにかく URL がダサくなるので止めてほしい。
Blob Storage 周りの話
データストアとして Blob Storage だけを使って、メタデータで運用するというのは今時で良い感じです。絞り込みなどは難しいですが、Blob Index Tags がリリースされれば簡単に実装できるようになります。
データストア持たずに Blob だけで済ませたのは良い実装やな。Blob Index Tags が来れば軽いフィルタリングも出来るようになるし
— Tatsuro Shibamura (@shibayan) 2020年7月9日
Japan East / West で使えるようになるのはまだまだ先な気がしますが、期待して待ちます。
正直最近というほど新しくはないですが Event Grid や Change Feed を使えば、Blob への変更を検知していろいろと後続の処理を追加できるので、Blob に置くだけというのはそういう意味でも良いです。
最近の Blob は面白くて、アップロードしたら Event Grid で Function キック、メタデータの抽出や必要であれば Materialized-view としての Data Store (Search / Cosmos) の更新とかも出来るし、処理の起点に出来るのが良い
— Tatsuro Shibamura (@shibayan) 2020年7月9日
Event Grid と Change Feed は似ていますが性質が異なるので、良い感じに使い分けていく必要があります。具体的には Push と Pull という違いです。
Change Feed はクライアントが上手く動作しなかったので試せていないですが、Object Replication で使われているので Blob Storage の新機能を裏で支えるものになっていくのでしょう。
今後みつばたんがやること
Cache の TTL をもっと長くする
Cloudflare を使ってある程度キャッシュさせているみたいですが、ヒット率が低すぎるので良くないです。
cloudflareさまのおかげで、Azureへの通信と費用が半分以下にへってるのエモい pic.twitter.com/yb6IFGpzFs
— 蜜葉 (@mitsuba_yu) 2020年7月10日
サイトの性質からすればヒット率は 98% 以上は狙えると思うので、短すぎる TTL をもっと長くして更新のタイミングで API を使ってキャッシュをパージした方が良いです。
このあたりは対して難しくはないでしょう。比較的サクッと対応できるはず。
サムネイルの生成は要改善
サムネイルの生成をアップロード時に Web サーバーでやっているのを、Event Grid + Azure Functions にすると簡単に処理を分離しつつ Web サーバーの負荷を下げることが出来ます。
webでサムネ処理するかBlobフックするかなやましいな
— 蜜葉 (@mitsuba_yu) 2020年7月11日
チュートリアルにはそのままのものがあるので、そのまま使ってしまえばよいです。
写っているものが中途半端にトリミングされることを防いで、良い感じにサムネイルを作りたい場合には Cognitive Services の Computer Vision API を使うのも手です。
https://docs.microsoft.com/en-us/rest/api/cognitiveservices/computervision/generatethumbnail
ROI を特定してサムネイルを生成してくれるので結構便利です。
お金があれば Cloudflare の Image Resizing を使ってしまうのが手っ取り早いです。
CDN が画像のリサイズや最適化を行う機能を持つことが多くなって便利になりましたが、それなりの金額を払う必要がありますね。
CI/CD パイプラインを組む + Run From Package 化
Visual Studio からのデプロイは Web Deploy が使われるので不安定です。GitHub Actions や Azure Pipelines を使って Run From Package でデプロイすることで深夜にキレる必要が無くなります。
VSからasp coreの発行の挙動が怪しすぎてキレそう
— 蜜葉 (@mitsuba_yu) 2020年7月10日
この辺りは何回も紹介していますが、以下のエントリを参照すれば解決するはずです。
初期の方からアドバイスすればもっと早く完成していた気もするのですが、まあ良いでしょう。