Node.js アプリのエントリポイントの指定
Azure App Service で Node.js アプリをテンプレートから作成すると、うまいことルートに配置された index.js
が起動してくれます。
この仕組みがブラックボックスな感じで気持ち悪いので調べてみたところ、このエントリポイントの指定は web.config
ファイルにあるようです。
Windows ベースの App Service で Node.js アプリを動作させる場合、Windows の Web サーバーである IIS 上で動作する iisnode という Node.js 実装が使用されます。
IIS が起動するときに設定ファイルである web.config
が読み込まれ、上記の設定により iisnode
がエントリポイント index.js
を使って起動するという流れになります。
なので、作成している Node.js アプリのエントリポイント(メインの JS ファイル)が変わった場合は、この web.config
ファイルを修正する必要があります。
あと、このような仕組みのため、web.config
ファイルは必ずアプリを構成する JS ファイルと一緒にデプロイしないといけないということも分かります。
上記の設定のままであれば、デプロイ先のルートディレクトリに、少なくとも下記の 2 ファイルが配置されていなければいけません。
- web.config (IIS の設定ファイル)
- index.js (上記ファイルで指定されたエントリポイント)
なぜ紛らわしいのか?
Node.js アプリを開発するとき、通常は package.json
の start
スクリプトとしてエントリポイントを指定します。
こうすることで、npm start
と実行するだけで、index.js
をエントリポイントとして Node.js アプリが起動するようになっています。
アプリケーションをローカルで実行すると、アプリケーションを Azure にデプロイするとどう表示されるかを把握できます。ターミナル ウィンドウを開き、
npm start
スクリプトを使用して、組み込みの Node.js HTTP サーバーを起動します。
と書かれています。
間違ってはいないのですが、こんな風に書かれたら、package.json
の scripts.start
の定義を変更すれば App Service 上の振る舞いも変わると思うじゃないですか。
ところがどっこい、package.json
を修正しても、App Service 上での動作は何も変わりません。
web.config
が真犯人だからです。
気をつけましょー。
コラム: PORT 環境変数
Azure App Service 上で Node.js アプリを動作させると、自動的に PORT
環境変数が定義されます。
なので、Node.js アプリ内で Web サーバーを起動させるときは、process.env.PORT
に設定されたポート番号を使うようにします。
App Service にはこういった約束事がいろいろありますね。
関連記事
- Azure DevOps で無料のプライベート Git リポジトリ (Repos) を使用する
- Azure: Cosmos DB の SQL API をプロキシ経由で使用する
- Azure Speech Service を使って音声をテキストに変換する (STT)
- チャットボット: 独自のミドルウェアを作成してログを記録する
- チャットボット: 独自のミドルウェアを作成して禁止ワードを拒否するようにする
- チャットボット: Bot Builder SDK の Dialog で会話の流れをデザインする (2) スタック管理
- チャットボット: Bot Builder SDK で画像やリストなどのリッチなメッセージを送る (MessageFactory)