ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

(勝手に)続・Azure Web AppでNode-REDを動かす手順

この記事は 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 を有効にしようとするとデプロイに失敗するので、選択したプランに FD が含まれていたら、alwaysOn を無効にしています。

ただ、これだけだとあまりにもアレなので、App Service on Linux へデプロイするための対応 (デプロイ ファイル azuredeloy_linux.json とデプロイ ボタン)も用意しました。

github.com

本当は、デプロイ ファイルもボタンも一つにして、プラットフォームの選択でいろいろ分けたかったのですが、今の知識ではプランの選択肢をプラットフォームごとに切り替える方法がわからなかったので、泣く泣く二つずつ用意しています😥。

あと、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 ) ことが多いので、気長にお待ちください。

それでは。