しばやん雑記

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

Azure App Service の Clone App 機能が Standard でも使えるようになっていた

これまでは App Service の Premium 以上でしか使えなかった Clone App 機能が、いつの間にかに Standard でも使えるようになっていました。ドキュメントの履歴を見る限りでは 6 月ぐらいには Standard でも解放されていたようですが、アナウンスはされてない感があります。

Docs の更新日時は 2016 年から止まってますが、単にタイムスタンプが更新されてないだけでした。

Clone App の利用用途はドキュメントに書いてあるようにリージョンを変更したり、App Service から App Service Environment への移行などが考えられますが、個人的には Scale unit の変更や HA / DR サイトの構築に使えるかなと思っています。

Premium V2 や新しい VNET Integration を利用するためには新しい Scale unit 上に App Service Plan を作る必要があります。Webspace の関係で別リソースグループに作る必要があるので複雑ですが、多少は Webspace と App Service Plan の制約については書いてきているので、気になる方は参考にしてください。

Clone 後の App Service Plan が別 Scale unit に載っている場合は Inbound / Outbound IP が変わるので、そういう点では注意が必要です。

これまで Premium 限定だったので真面目に触る気がなかったのですが、Standard なら使いやすくなったと思います。とりあえず Clone App を初めて使ってみることにします。

Clone App を試す

Standard の App Service Plan 上で動いてる App Service を開いて Clone App を選ぶと、以下のようなページが表示されるようになっているはずです。

Clone のタイミングで Application Insights の新規作成や既存へのリンクが行えるのは便利です。

f:id:shiba-yan:20191103153531p:plain

それ以外にもいくつかの設定項目があって、Clone 対象の設定をいくつか選べました。

カスタムドメイン周りの設定は移行が面倒なので、サクッと Clone したいですがまだ Azure Portal から対象には選べないようです。この辺りが最近用意されたものなのかはわかりません。

f:id:shiba-yan:20191103153745p:plain

気になっていた証明書周りは全く移行されないみたいだったので、基本的には証明書系は Key Vault に格納して App Service から参照するように構築するのが吉です。

Azure Portal からの Key Vault 証明書のインポートは簡単になったので、寄せておくと幸せになれます。

カスタムドメインは Azure Portal からは Clone 対象になりませんでしたが、ドメインの所有確認は出来ているので DNS 周りを弄ることなくドメインの追加作業自体は行えます。

他にも Traffic Manager と連携する機能も用意されているらしいので、DR サイトは簡単に作れそうです。

ARM Template で実行する

Clone App の画面に Automation options のリンクが用意されていて、それを選ぶと ARM Template がダウンロードできました。多少整形したテンプレートが以下になります。

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string"
    },
    "hostingPlanName": {
      "type": "string"
    },
    "hostingEnvironment": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "sku": {
      "type": "string"
    },
    "skuCode": {
      "type": "string"
    },
    "workerSize": {
      "type": "string"
    },
    "serverFarmResourceGroup": {
      "type": "string"
    },
    "subscriptionId": {
      "type": "string"
    }
  },
  "resources": [
    {
      "apiVersion": "2016-09-01",
      "name": "[parameters('hostingPlanName')]",
      "type": "Microsoft.Web/serverfarms",
      "location": "[parameters('location')]",
      "properties": {
        "name": "[parameters('hostingPlanName')]",
        "workerSizeId": "[parameters('workerSize')]",
        "numberOfWorkers": "1",
        "hostingEnvironment": "[parameters('hostingEnvironment')]"
      },
      "sku": {
        "Tier": "[parameters('sku')]",
        "Name": "[parameters('skuCode')]"
      }
    },
    {
      "name": "[parameters('name')]",
      "type": "Microsoft.Web/sites",
      "properties": {
        "cloningInfo": {
          "SourceWebAppId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/<ResourceGroup>/providers/Microsoft.Web/sites/<SiteName>",
          "CloneSourceControl": true,
          "CloneCustomHostNames": false
        },
        "name": "[parameters('name')]",
        "siteConfig": {
          "appSettings": []
        },
        "serverFarmId": "[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
        "hostingEnvironment": "[parameters('hostingEnvironment')]"
      },
      "apiVersion": "2018-11-01",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
      ]
    }
  ]
}

App Service Plan から作成しているので多少長いですが、重要なのは cloningInfo の設定だけのようです。

ARM Template のリファレンスに cloningInfo で設定できる項目が載っていますが、何処までちゃんと動くのかは確認できていません。カスタムドメインの設定もあるので、有効化できる気がしますが未確認です。

本来なら Clone など行わずに ARM Template や Terraform の定義レベルで複数同じ設定の App Service が作成できるので、新規開発の場合はそっちを利用するべきです。これはあくまでも既存の App Service 向けです。

日本国内の場合は IaC 導入前に Japan East に作成していた App Service を Japan West に Clone して、Traffic Manager で分散という構成を手間なく構築できそうです。