しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Web App for Containers (Linux / Windows) を ARM Template でデプロイする

絶賛プレビュー中の Web App for Containers の Windows 版を ARM Template でデプロイしようと調べていたところ、思ったより Linux 版の情報が無いことに気が付いたので一緒にまとめておきます。

基本的には Windows の App Service とほぼ同じですが、追加の設定が必要になります。例を挙げれば以下のような設定です。

  • WEBSITES_ENABLE_APP_SERVICE_STORAGE を false に
  • 利用する Docker Image を設定
  • SKU を適切なものに

特に Windows Containers の場合は Premium Container の SKU を指定しないと動かないので注意。

ARM Template の全体は Gist にアップロードしてあるので、ついでに Deploy to Azure ボタンも用意しておきました。これで簡単にテンプレートの動作を確認出来るようになっています。

Linux をデプロイする

Web App の定義はほぼ変更ないのですが、Service Plan に関しては少し特殊な指定が必要になります。

Linux の場合は kind = linuxproperties.reserved = true を追加すると、Linux 向けの Service Plan が作成されます。reserved は名前からは想像できませんが、Linux かどうかのフラグになっています。

ちなみに kind = linux と指定しつつ properties.reserved = false とすると Azure Portal 上は Linux なのに中身は Windows という不思議な Service Plan が完成してしまいます。

{
  "apiVersion": "2016-09-01",
  "type": "Microsoft.Web/serverfarms",
  "kind": "linux",
  "name": "[variables('servicePlanName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "name": "[variables('servicePlanName')]",
    "reserved": true,
    "numberOfWorkers": "1"
  },
  "dependsOn": [],
  "sku": {
    "Tier": "Standard",
    "Name": "S1"
  }
},
{
  "apiVersion": "2016-08-01",
  "type": "Microsoft.Web/sites",
  "name": "[parameters('siteName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "siteConfig": {
      "name": "[parameters('siteName')]",
      "appSettings": [
        {
          "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
          "value": "false"
        }
      ],
      "linuxFxVersion": "DOCKER|nginx:alpine"
    },
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
  },
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
  ]
}

ARM Template for Web App for Containers (Linux) · GitHub

https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fgist.githubusercontent.com%2Fshibayan%2F58e0b6ed541c3ad46faff12360f7dedc%2Fraw%2Fe6f2b661c614ed36d5aaf3bf1579f5c5d8591902%2Fazuredeploy_linux.json

肝となる linuxFxVersion には単一コンテナを使う場合には DOCKER|nginx:alpine のように Docker Image の名前を指定してあげます。

複数コンテナを使う場合には COMPOSEKUBE を指定して、定義ファイルの内容を Base 64 エンコードした後に連結して指定します。この時点ではフォーマットチェックは行われません。

Windows をデプロイする

Windows も追加の設定が必要ですが、Linux よりは少し分かりやすくなっています。

Service Plan に kind = xenonproperties.isXenon = true を追加しつつ、SKU を Premium Container にすると Windows Containers 向けの Service Plan が作成されます。

ちなみに xenon というのは Windows Containers 向けのコードネームです。

{
  "apiVersion": "2016-09-01",
  "type": "Microsoft.Web/serverfarms",
  "kind": "xenon",
  "name": "[variables('servicePlanName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "name": "[variables('servicePlanName')]",
    "isXenon": true,
    "numberOfWorkers": "1"
  },
  "dependsOn": [],
  "sku": {
    "Tier": "PremiumContainer",
    "Name": "PC2"
  }
},
{
  "apiVersion": "2016-08-01",
  "type": "Microsoft.Web/sites",
  "name": "[parameters('siteName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "siteConfig": {
      "name": "[parameters('siteName')]",
      "appSettings": [
        {
          "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
          "value": "false"
        }
      ],
      "windowsFxVersion": "DOCKER|microsoft/iis"
    },
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
  },
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
  ]
}

ARM Template for Web App for Containers (Windows) · GitHub

https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fgist.githubusercontent.com%2Fshibayan%2Fc6db9ae06d9279b73bf3916a194269c0%2Fraw%2F726d8e8ee527c1d3ced195a88839e9e997c41fdf%2Fazuredeploy_windows.json

使用する Docker Image は windowsFxVersion に Linux の時と同様のフォーマットで指定します。まだ複数コンテナには対応していないので DOCKER しか指定できません。

割と簡単な ARM Template で Web App for Containers のデプロイが出来ます。Docker Image の指定部分が初期リリースの時から変更されているので、古い ARM Template の場合は注意が必要です。