この記事は Node-RED Advent Calendar 2018 9 日目です。
そして、node-red を Azure Web Apps にデプロイを、、、と思ったら、zuhito さんが Qiita 記事 Azure Web AppでNode-REDを動かす手順 を投稿していました。
重箱の隅で申し訳ないですが、上記記事の中で残課題になっていた、 デプロイ時の WebSocket の有効化に対応するために、デプロイ ファイル (azuredeploy.json) を一部修正しました。
Before
{ "apiVersion": "2015-08-01", "name": "[parameters('siteName')]", "type": "Microsoft.Web/sites", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]" ], "properties": { "serverFarmId": "[parameters('hostingPlanName')]" }, "resources": [ { (略) } ] }
After
{ "apiVersion": "2015-08-01", "name": "[parameters('siteName')]", "type": "Microsoft.Web/sites", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]" ], "properties": { "serverFarmId": "[parameters('hostingPlanName')]", "siteConfig": { "webSocketsEnabled": true, "alwaysOn": "[and(not(contains(parameters('sku'), 'F')), not(contains(parameters('sku'), 'D')))]" } }, "resources": [ { (略) } ] }
はい、下記要素を足しただけです。
"siteConfig": { "webSocketsEnabled": true, "alwaysOn": "[and(not(contains(parameters('sku'), 'F')), not(contains(parameters('sku'), 'D')))]" }
元のデプロイ ファイルがほぼ完成形だったので、あまりやることがありませんでした。
alwaysOn
は プランを Basic 以上にしないとデプロイ時にエラーになるので、少しだけ頑張っています。
Free、もしくは Shared の場合は、alwaysOn を有効にしようとするとデプロイに失敗するので、選択したプランに F
か D
が含まれていたら、alwaysOn を無効にしています。
ただ、これだけだとあまりにもアレなので、App Service on Linux へデプロイするための対応 (デプロイ ファイル azuredeloy_linux.json とデプロイ ボタン)も用意しました。
本当は、デプロイ ファイルもボタンも一つにして、プラットフォームの選択でいろいろ分けたかったのですが、今の知識ではプランの選択肢をプラットフォームごとに切り替える方法がわからなかったので、泣く泣く二つずつ用意しています😥。
あと、app.js の中で process.env.port
と小文字の port
を参照していたので、process.env.PORT
と大文字に直しました。
これ、Windows で動かす限りは、環境変数に大文字小文字の区別がないので、問題ないのですが、Linux にデプロイしたときにどうしても動かずハマりました。
というか、Windows には環境変数にも大文字小文字の区別がないとは!😲
Pull Request も出していますが、まだマージされていないので、マージされるまでは一時的に↑のリポジトリや↓のボタンをお試しください。
For Windows Web App | For Linux Web App |
---|---|
ちなみに、デプロイは結構時間かかりますし、Linux 版は Azure へのデプロイが完了しても npm install
が終わっていない (特に express ) ことが多いので、気長にお待ちください。
それでは。