Azure Web AppsにデプロイしたNestJSアプリが403で落ちる件
Azure Web AppsにNestJSアプリをデプロイしたのだが403で落ちる。
【前情報】
Azure Web Apps
①ランタイムスタック:Node 18
②OS:Windows
③App Serviceプラン:Free
結論:ルートディレクトリにweb.configがなかった
てっきりWeb Appsのデプロイ時に作成されるCI/CDワークフローのついでにweb.configも作ってくれるかとなぜか思い込んでいた。
後述のあれこれ調べていく中でアプリケーションサーバー周りが怪しいとアタリをつけたので、Web Appsポータルの「コンソール」メニューからwwwroot直下を調べたところ本件が発覚。
web.configの内容
IIS上にNestJSアプリをデプロイした経験がなかったのでどんな内容で書こうかと軽くググってみたらまさにドンピシャな記事を発見。
最近Mediumさんにはお世話になりっぱなしである。
基本的にこちらの記事の通りなのだが、私の場合デプロイによりdistディレクトリ下にビルド資源が配置されるようにGithub Actionsを書いていたので、handlersディレクティブとrewriteディレクティブだけそれ用にカスタマイズさせてもらった。
<configuration>
<system.webServer>
<handlers>
<!-- ↓ここ -->
<add name="iisnode" path="dist/main.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="NestJS" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<!-- ↓ここ -->
<action type="Rewrite" url="dist/main.js" />
</rule>
</rules>
</rewrite>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
</configuration>
これをWeb Appsに反映させてあげたところ無事動きましたとさ。
余談:調べたこと
ファイアウォール設定
自宅IPが弾かれるような設定になっているかと思ったらそんなことはなかった。
CosmosDBへのRBAC
いま作っているものが、Web AppsからCosmosDBへのアクセスが生じるので、DB操作権限を有するカスタムロールをマネージドIDに割り当て、そのマネージドIDをWeb Appsに付与している。
この権限があかんくて落ちてるのかと疑ったがこちらも問題なかった。
スタートアップコマンドの設定
もしかするとこれも必要かもしれない。
調べていく中でこちらの記事を見かけたので、スタートアップコマンドでちゃんと起動するようになっているかを確認した。
が、UIが刷新されたのか、それとも私のApp ServiceプランがFree tierゆえか、記事にて語られているスタートアップコマンド設定入力欄がなかった。(2023年10月15日時点)
ので、Azure CLIから直接設定をぶち込めないか試してみたところ普通にできた。
az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "node dist/main"
スタートアップコマンドもAzure CLIで設定可能だなんて知らなかった。
公式ドキュメント様々である。
結果としてこの設定を施しても403エラーが出続けたのだが、個人的にこの処置は必要であったと思う。
一言
Web Appsデプロイ時にweb.config用意してくれたらいいのに、と思いかけましたがそれはこっちの役目ですよね、ごめんなさい。
PaaSに甘やかされてダメになった人間の末路でした。