しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

みつばたんへの Twitter での Azure / ASP.NET Core アドバイスのまとめ

みつばたんが最近 ASP.NET Core MVC 周りで死ぬほどはまっていたみたいですが、ポートフォリオサイトを作っていたようです。自分は死ぬほどはまっていた時には全くアドバイスしなかったのに、大体動くようになってからアドバイスをするという徳の低いことをした気がします。

その時のアドバイスは雑に Twitter で空リプで行いましたが、残しておいた方が良いかなと思ったので雑に Twitter を引用しつつまとめました。

認証は AAD + Easy Auth で

数えきれないぐらい言ってきていますが、サクッとサイトをログイン必須にして保護したい場合には AAD と Easy Auth を使うのが手っ取り早いです。

カスタムドメイン + リバースプロキシ環境下で動作させている時には、Easy Auth がちゃんとホスト名を認識してくれず動作しない気配があるので、カスタムドメインを割り当てるか App Service のデフォルトドメインで運用するかになるでしょう。

プロバイダーに AAD を選ぶと、現在のテナントに入っているユーザーのみログイン可能なページを作れるので楽です。セットアップも一番楽なので、大体はこれを使っておけば良いです。

ASP.NET Core Routing のオプション

未だにデフォルトで小文字にならないのが不思議ですが、ASP.NET Core MVC のルーティングで URL を生成すると Pascal Case で生成されます。要するにクラス名と同じというわけです。

ルーティングのオプションで 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 がリリースされれば簡単に実装できるようになります。

Japan East / West で使えるようになるのはまだまだ先な気がしますが、期待して待ちます。

正直最近というほど新しくはないですが Event Grid や Change Feed を使えば、Blob への変更を検知していろいろと後続の処理を追加できるので、Blob に置くだけというのはそういう意味でも良いです。

Event Grid と Change Feed は似ていますが性質が異なるので、良い感じに使い分けていく必要があります。具体的には Push と Pull という違いです。

Change Feed はクライアントが上手く動作しなかったので試せていないですが、Object Replication で使われているので Blob Storage の新機能を裏で支えるものになっていくのでしょう。

今後みつばたんがやること

Cache の TTL をもっと長くする

Cloudflare を使ってある程度キャッシュさせているみたいですが、ヒット率が低すぎるので良くないです。

サイトの性質からすればヒット率は 98% 以上は狙えると思うので、短すぎる TTL をもっと長くして更新のタイミングで API を使ってキャッシュをパージした方が良いです。

このあたりは対して難しくはないでしょう。比較的サクッと対応できるはず。

サムネイルの生成は要改善

サムネイルの生成をアップロード時に Web サーバーでやっているのを、Event Grid + Azure Functions にすると簡単に処理を分離しつつ Web サーバーの負荷を下げることが出来ます。

チュートリアルにはそのままのものがあるので、そのまま使ってしまえばよいです。

写っているものが中途半端にトリミングされることを防いで、良い感じにサムネイルを作りたい場合には 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 でデプロイすることで深夜にキレる必要が無くなります。

この辺りは何回も紹介していますが、以下のエントリを参照すれば解決するはずです。

初期の方からアドバイスすればもっと早く完成していた気もするのですが、まあ良いでしょう。