もしAzureのインフラ障害でApp Serviceの稼働率が下がるのが気になるなら、「ゾーン冗長」が対策になるかもしれない。ゾーン冗長とは何か、また注意点や操作手順について解説する。
対象:Azure App Service、App Serviceプラン
「突然Azure App Serviceの応答が途絶し、回復までしばらくかかった(後でAzureの局所的な障害が原因だと判明した)」といった経験をしたAzure運用担当者は意外と多いのではないだろうか(筆者はある)。
Azureに限らず、クラウド上のインフラの障害はいつでも発生する可能性のある問題だ。そのため、より高い稼働率(より短いダウンタイム)が求められるWebアプリ/サイトでは、少々のインフラ障害で応答が途絶しないように設計する必要がある。
本Tech TIPSでは、こうしたインフラ障害の対策の一つとして、App Serviceの「ゾーン冗長」を紹介したい。ゾーン冗長とは何か、そしてその注意点や設定手順などを解説する。
Azureの「ゾーン冗長」の「ゾーン」とは、「可用性ゾーン(Availability Zone)」を指す。可用性ゾーンとは、「東日本」「西日本」といったAzureのリージョンの中にある複数のデータセンターを数kmのサイズで区切った各グループのことだ。
可用性ゾーン同士は性能の高いネットワークで接続されていて、より短い遅延で通信できる。その一方で、電源やネットワークといった各種インフラは可用性ゾーンごとに独立しているため、ある可用性ゾーンが障害で停止しても、(同じリージョン内にある)別の可用性ゾーンは引き続き正常に稼働できる可能性が高い。
つまり、複数の可用性ゾーンに同じApp Serviceのインスタンスを「冗長」に配置して同時に稼働させておけば、障害発生時もいずれかの可用性ゾーンにあるインスタンスが常に応答できる。これがゾーン冗長の基本的な考え方だ。
ゾーン冗長を有効にした場合、デフォルトでは上図のように3つのインスタンスが各可用性ゾーンに配置される。ただし、状況によっては2つのインスタンスしかデプロイされない(2つの可用性ゾーンしか利用できない)こともある。また、デプロイ直後のインスタンスが3つでも、スケールインして2つに減らすことが可能だ(1つに減らそうとするとエラーで失敗する)。逆にスケールアウトして4つ以上に増やすと、3つの可用性ゾーンに分散配置される。
さて、ゾーン冗長を利用してApp ServiceのWebサイト/アプリの稼働率や可用性を高めるには、それを実行するプラットフォームである「App Serviceプラン」のゾーン冗長を有効化する必要がある。以下ではその注意点や操作手順を説明していく。
App Serviceプランのゾーン冗長は、その作成時にしか有効にできない。つまり、既存のApp Serviceプランを作り直すことなく、ゾーン冗長を有効化することはできない。逆に、ゾーン冗長が有効なApp Serviceプランでゾーン冗長を無効化することもできない。
また、ゾーン冗長が可能なApp Serviceプランの価格プランはPremium V2/V3に限られる。FreeやBasic、Standardではゾーン冗長を利用できないので注意してほしい。
さらに、リージョンによってゾーン冗長が利用できないこともある。例えば、執筆時点では「South India(南インド)」リージョンだとゾーン冗長が利用できないようだ。日本国内の場合、東日本リージョンと西日本リージョンはともに利用できる。
ゾーン冗長の欠点は、料金が高いことだ。通常は1つのインスタンスで済むところをデフォルトでは3つのインスタンスで冗長化する分、単一インスタンスに対して3倍の料金がかかってしまう。特にP2V3以上の価格プランのように単一時の料金が高めなほど、ゾーン冗長による料金増大のインパクトは大きくなるので注意が必要だ。
その他、リージョン全体に及ぶ障害が発生した場合、全ての可用性ゾーンが障害の影響を受けると、ゾーン冗長が有効なApp Serviceプランも障害から逃れられない可能性が高い。この場合、複数のリージョンにリソースを分散配置するなど、ゾーン冗長とはまた別の対策が必要になる。
これまでゾーン冗長を有効化したApp Serviceプランを作ったことがない場合は、まずゾーン冗長が有効なApp Serviceプランを新規作成する必要がある。
Azureポータルの場合、以下のように作成ウィザードの途中に表示される「ゾーン冗長」ラジオボタンで[有効]を選択すればよい。
ゾーン冗長が有効なApp Serviceプランを作成したら、そこにApp Serviceを新規作成しよう。すると、自動的に3つのインスタンスにまたがってApp Serviceが実行されるはずだ。
App Serviceを作成する際に、ゾーン冗長が有効なApp Serviceプランを同時に作成することも可能だ。
ARM(Azure Resource Manager)テンプレートでもゾーン冗長が有効なApp Serviceプランをデプロイできる。
// ファイル: asp.azuredeploy.bicep
////////// ゾーン冗長が有効なApp Serviceプランを作成する //////////
param appServicePlanName string // App Serviceプラン名
param location string = resourceGroup().location // 作成先のリージョン
param skuName string = 'P1v3' // SKU名称。後述の「skus」のキー名から選択
@minValue(2) // ゾーン冗長時のインスタンス最小数は2
@maxValue(30) // 価格プランがPremium V2/V3の場合、最大数は30
param baseCapacity int = 3 // デプロイ直後のインスタンス数
var skus = {
// SKUの定義。Premium V2/V3のみ
P2v2: {
name: 'P2v2'
tier: 'PremiumV2'
capacity: baseCapacity
}
P0v3: {
name: 'P0v3'
tier: 'PremiumV3'
capacity: baseCapacity
}
P1v3: {
name: 'P1v3'
tier: 'PremiumV3'
capacity: baseCapacity
}
P1mv3: {
name: 'P1mv3'
tier: 'PremiumV3'
capacity: baseCapacity
}
P2v3: {
name: 'P2v3'
tier: 'PremiumV3'
capacity: baseCapacity
}
}
// リソース生成: App Serviceプラン
resource appServicePlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: appServicePlanName
location: location
sku: skus[skuName]
kind: 'linux' // OSはLinuxとする
properties: {
zoneRedundant: true // ゾーン冗長を有効にする
reserved: true // Linuxを使用する場合はtrue(falseだとエラーで失敗する)
}
}
ゾーン冗長を有効にするには、リソース「appServicePlan」の「properties.zoneRedundant」を「true」にする必要がある。また「sku.capacity」(デプロイ直後のインスタンス数)には2以上の整数を指定すること。
すでにあるApp Serviceプランでゾーン冗長が有効化どうかは、以下のようにAzureポータルで確認できる。
azure CLIでも、以下のようなコマンドラインで確認できる。
az appservice plan show -g <リソースグループ名> -n <App Serviceプラン名> --query "{zoneRedundant:properties.zoneRedundant}"
ゾーン冗長が有効なら「"zoneRedundant": true」、無効なら「"zoneRedundant": false」とそれぞれ出力されるはずだ。
■関連リンク
Copyright© Digital Advantage Corp. All Rights Reserved.