Azure App Serviceの可用性ゾーン冗長化が一般提供されたのでためしてみた

2021.09.05

いわさです。

以前から、App Service Environmentでは可用性ゾーン冗長がサポートされていましたが、今回非ASE環境でもサポートされるようになりました。
Azureの可用性ゾーンについては以下を参照してください。

App Serviceで利用するにあたっての仕様や制限は以下に記載されています。

気になるところをざっと挙げると

  • 設定は新規App Serivceプラン作成時のみ有効化が可能。
  • 対応リージョンが限られていて、東日本は対応されているが西日本は対応されていない。
  • プレミアムのV2, V3が対応
  • 自動でインスタンスサイズが3からになる
  • ARMでのみ有効化できる

あたりでしょうか。

本日はその中でも以下について実際に試してみました。

  • ポータル上はやはり設定項目がない?
  • ARMデプロイ時の既定値の確認
  • 西日本でのデプロイ
  • App Service新規作成時に併せて作成できるApp Serviceプランはどうなっているか

ポータル上はやはり設定項目がない?

まぁ、無かったです(終わり)

ARMデプロイ時の既定値の確認

ARMテンプレートでApp ServiceプランのプロパティにてzoneRedundanttrueに指定することで、ゾーン冗長化が有効となります。
今回は有効化指定、無効化指定、未設定時のデフォルトを確認しました。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "functions": [],
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2018-02-01",
            "name": "iwasa-appplan-20210904-east-1",
            "location": "Japan East",
            "sku": {
                "name": "P1v3",
                "tier": "PremiumV3",
                "size": "P1v3",
                "family": "Pv3",
                "capacity": 3
            },
            "kind": "app",
            "properties": {
                "zoneRedundant": true
            }
        },
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2018-02-01",
            "name": "iwasa-appplan-20210904-east-2",
            "location": "Japan East",
            "sku": {
                "name": "P1v3",
                "tier": "PremiumV3",
                "size": "P1v3",
                "family": "Pv3",
                "capacity": 3
            },
            "kind": "app",
            "properties": {
                "zoneRedundant": false
            }
        },
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2018-02-01",
            "name": "iwasa-appplan-20210904-east-3",
            "location": "Japan East",
            "sku": {
                "name": "P1v3",
                "tier": "PremiumV3",
                "size": "P1v3",
                "family": "Pv3",
                "capacity": 3
            },
            "kind": "app",
            "properties": {}
        }
    ],
    "outputs": {}
}
iwasa.takahito@hoge azure-appservice-zoneredundant % az deployment group create --resource-group 20210904 --template-file app-service-plan-east.json

3つとも、東日本でデプロイしました。

ではそれぞれの設定結果を見ていきましょう。

有効化(指定のとおり)

無効化(指定のとおり)

未設定時は無効となる

西日本でのデプロイ

失敗するのか、成功した上で強制的に無効化になるのか気になっていたのですが、デプロイ時にエラーとなりました。

iwasa.takahito@hoge azure-appservice-zoneredundant % az deployment group create --resource-group 20210904 --template-file app-service-plan-west.json
{"status":"Failed","error":{"code":"DeploymentFailed","message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.","details":[{"code":"BadRequest","message":"{\r\n  \"Code\": \"BadRequest\",\r\n  \"Message\": \"Requested features are not supported in region. Please try another region.\",\r\n  \"Target\": null,\r\n  \"Details\": [\r\n    {\r\n      \"Message\": \"Requested features are not supported in region. Please try another region.\"\r\n    },\r\n    {\r\n      \"Code\": \"BadRequest\"\r\n    },\r\n    {\r\n      \"ErrorEntity\": {\r\n        \"ExtendedCode\": \"59911\",\r\n        \"MessageTemplate\": \"Requested features are not supported in region. Please try another region.\",\r\n        \"Parameters\": [],\r\n        \"Code\": \"BadRequest\",\r\n        \"Message\": \"Requested features are not supported in region. Please try another region.\"\r\n      }\r\n    }\r\n  ],\r\n  \"Innererror\": null\r\n}"}]}}

App Service新規作成時に併せて作成できるApp Serviceプランはどうなっているか

私はよく使うのですが、App Service作成時にSKUとサイズだけ指定してApp Serivceプランを作成するケースがあると思います。
これ、リソースグループやリージョンなどは自動で設定されるんですよね。
では、今回のゾーン冗長設定についてはどうなるでしょうか。

デプロイ前にARMテンプレート確認できるので見てみましょう。

    "resources": [
        {
            "apiVersion": "2018-11-01",
            "name": "[parameters('name')]",
            "type": "Microsoft.Web/sites",
            "location": "[parameters('location')]",
            "tags": {},
            "dependsOn": [
                "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
            ],
            "properties": {
                "name": "[parameters('name')]",
                "siteConfig": {
                    "appSettings": [],
                    "metadata": [
                        {
                            "name": "CURRENT_STACK",
                            "value": "[parameters('currentStack')]"
                        }
                    ],
                    "phpVersion": "[parameters('phpVersion')]",
                    "netFrameworkVersion": "[parameters('netFrameworkVersion')]",
                    "alwaysOn": "[parameters('alwaysOn')]"
                },
                "serverFarmId": "[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                "clientAffinityEnabled": true
            }
        },
        {
            "apiVersion": "2018-11-01",
            "name": "[parameters('hostingPlanName')]",
            "type": "Microsoft.Web/serverfarms",
            "location": "[parameters('location')]",
            "kind": "",
            "tags": {},
            "dependsOn": [],
            "properties": {
                "name": "[parameters('hostingPlanName')]",
                "workerSize": "[parameters('workerSize')]",
                "workerSizeId": "[parameters('workerSizeId')]",
                "numberOfWorkers": "[parameters('numberOfWorkers')]"
            },
            "sku": {
                "Tier": "[parameters('sku')]",
                "Name": "[parameters('skuCode')]"
            }
        }
    ]

指定がされていないですね。
となると先程検証したように、無効になりそうな予感がします。

ゾーン冗長は「無効」で作成されましたね。

まとめ

  • 基本無効化されているので、明示的な指定が必要だと思っておけば良さそう
  • 新規作成時のみ対応
  • 対応リージョンの確認が必要