Closed5

Azure Web AppsにデプロイしたNestJSアプリが403で落ちる件

waiwai

Azure Web AppsにNestJSアプリをデプロイしたのだが403で落ちる。

【前情報】
Azure Web Apps
①ランタイムスタック:Node 18
②OS:Windows
③App Serviceプラン:Free

waiwai

結論:ルートディレクトリにweb.configがなかった

てっきりWeb Appsのデプロイ時に作成されるCI/CDワークフローのついでにweb.configも作ってくれるかとなぜか思い込んでいた。

後述のあれこれ調べていく中でアプリケーションサーバー周りが怪しいとアタリをつけたので、Web Appsポータルの「コンソール」メニューからwwwroot直下を調べたところ本件が発覚。

waiwai

web.configの内容

IIS上にNestJSアプリをデプロイした経験がなかったのでどんな内容で書こうかと軽くググってみたらまさにドンピシャな記事を発見。

https://medium.com/@sujan.dumaru.official/deploy-nestjs-on-iis-ada2e33f46f9

最近Mediumさんにはお世話になりっぱなしである。
基本的にこちらの記事の通りなのだが、私の場合デプロイによりdistディレクトリ下にビルド資源が配置されるようにGithub Actionsを書いていたので、handlersディレクティブとrewriteディレクティブだけそれ用にカスタマイズさせてもらった。

web.config
<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に反映させてあげたところ無事動きましたとさ。

waiwai

余談:調べたこと

ファイアウォール設定

自宅IPが弾かれるような設定になっているかと思ったらそんなことはなかった。

CosmosDBへのRBAC

いま作っているものが、Web AppsからCosmosDBへのアクセスが生じるので、DB操作権限を有するカスタムロールをマネージドIDに割り当て、そのマネージドIDをWeb Appsに付与している。
この権限があかんくて落ちてるのかと疑ったがこちらも問題なかった。

スタートアップコマンドの設定

もしかするとこれも必要かもしれない。
https://qiita.com/kyosho/items/07bbbaca4738e3877369#azure-app-service作成

調べていく中でこちらの記事を見かけたので、スタートアップコマンドでちゃんと起動するようになっているかを確認した。

が、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で設定可能だなんて知らなかった。
公式ドキュメント様々である。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-language-nodejs?pivots=platform-linux#run-custom-command

結果としてこの設定を施しても403エラーが出続けたのだが、個人的にこの処置は必要であったと思う。

waiwai

一言

Web Appsデプロイ時にweb.config用意してくれたらいいのに、と思いかけましたがそれはこっちの役目ですよね、ごめんなさい。
PaaSに甘やかされてダメになった人間の末路でした。

このスクラップは2023/10/15にクローズされました