マイクロソフトAzureは、可用性セットと可用性ゾーンと呼ばれる物理的な障害の影響を与える範囲を定義しています。AWSのAvailability Zoneに相当する概念で、ゾーンを適切に分割しなければAzure内で障害が発生した場合に適切に切り替わりません。
参考資料
参考になる公式ドキュメントを以下に示します。
事前準備
以下、仮想ネットワーク等のリソースを作成します。
az group create --name MyResourceGroup --location japaneast az network vnet create \ --resource-group MyResourceGroup \ --name MyVnet \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name MySubnet \ --vnet-name MyVnet \ --address-prefixes 172.16.0.0/24
可用性ゾーン
可用性ゾーン使用可能なリージョンの確認
可用性ゾーンは電源やスイッチなど物理的な設備を共有するエリアです。可用性ゾーンを分けてサービスを配置すれば、電源設備などに障害が発生したとしてもサービスを継続する事ができます。
しかし、全てのリージョンに複数の可用性ゾーンが存在するわけではありません。可用性ゾーンに対応しているリージョンは「可用性ゾーンをサポートする Azure サービス」に記されています。
もし、公式ドキュメントを参照するのが手間ならば、CLIからも可用性ゾーンに対応しているかどうかを調べる事ができます。以下のようにaz vm list-skusを使いZones列を参照すれば、可用性ゾーンに対応しているかどうかを確認できます。
$ az vm list-skus \ --location japaneast \ --output table ResourceType Locations Name Zones Restrictions ---------------- ----------- -------------------- ------- --------------- availabilitySets japaneast Aligned None availabilitySets japaneast Classic None disks japaneast Premium_LRS 1,2,3 None disks japaneast Premium_LRS 1,2,3 None disks japaneast Premium_LRS 1,2,3 None disks japaneast Premium_LRS 1,2,3 None <omitted> virtualMachines japaneast Standard_A1_v2 1,2,3 None virtualMachines japaneast Standard_A2m_v2 1,2,3 None virtualMachines japaneast Standard_A2_v2 1,2,3 None virtualMachines japaneast Standard_A4m_v2 1,2,3 None virtualMachines japaneast Standard_A4_v2 1,2,3 None virtualMachines japaneast Standard_A8m_v2 1,2,3 None virtualMachines japaneast Standard_A8_v2 1,2,3 None virtualMachines japaneast Standard_B12ms 1,2,3 None virtualMachines japaneast Standard_B16ms 1,2,3 None virtualMachines japaneast Standard_B1ls 1,2,3 None virtualMachines japaneast Standard_B1ms 1,2,3 None virtualMachines japaneast Standard_B1s 1,2,3 None <omitted>
可用性ゾーンを指定した仮想マシンの作成
前述のaz vm list-skusコマンドの出力のように、Azureは「1,2,3」の3つの可用性ゾーンを使えるリージョンが多く存在します。仮想マシン作成時に、zoneオプションを指定すると、仮想マシンを配置する可用性ゾーンを指定できます。作成例は以下の通りです。
az vm create \ --resource-group MyResourceGroup \ --name linux011 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --zone 1 az vm create \ --resource-group MyResourceGroup \ --name linux012 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --zone 2 az vm create \ --resource-group MyResourceGroup \ --name linux013 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --zone 3
コンピュートリソースの確認
コンピュートリソースが確かに可用性ゾーンで分離されている事を確認します。ポータル(GUI)ならば、仮想マシンの「概要」画面で、どの可用性ゾーンに属しているかを確認できます。

CLIならば以下のようなshowコマンドを使用します。
az vm show \ --resource-group MyResourceGroup \ --name linux011
出力例は以下の通りです。
$ az vm show \
  --resource-group MyResourceGroup \
  --name linux011
  <omitted>
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Detach",
      "diffDiskSettings": null,
      "diskSizeGb": 30,
      "encryptionSettings": null,
      "image": null,
      "managedDisk": {
        "diskEncryptionSet": null,
        "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/linux011_OsDisk_1_e4ebc26b05174ede84bccd65639d3f4d",
        "resourceGroup": "MyResourceGroup",
        "storageAccountType": "Premium_LRS"
      },
      "name": "linux011_OsDisk_1_e4ebc26b05174ede84bccd65639d3f4d",
      "osType": "Linux",
      "vhd": null,
      "writeAcceleratorEnabled": null
    }
  },
  "tags": {},
  "type": "Microsoft.Compute/virtualMachines",
  "userData": null,
  "virtualMachineScaleSet": null,
  "vmId": "391c70a6-f195-414e-8466-53cab81a4989",
  "zones": [
    "1"
  ]
}
ストレージリソースの確認
OSディスクも可用性ゾーンで分離されている事を確認します。ポータル(GUI)ならば、仮想マシンの「ディスク」画面で「ディスク名」を押下します。

ディスクの「概要」画面で可用性ゾーンを確認します。

CLIならば以下のようなshowコマンドを使用します。
osdiskname=$(az vm show \
  --resource-group MyResourceGroup \
  --name linux011 \
  --query "storageProfile.osDisk.name" \
  --output tsv)
az disk show \
  --resource-group MyResourceGroup \
  --name ${osdiskname}
出力例は以下の通りです。
$ az disk show \
  --resource-group MyResourceGroup \
  --name ${osdiskname}
  <omitted>
  "supportsHibernation": null,
  "tags": {},
  "tier": "P4",
  "timeCreated": "2022-03-07T04:09:11.251421+00:00",
  "type": "Microsoft.Compute/disks",
  "uniqueId": "e4ebc26b-0517-4ede-84bc-cd65639d3f4d",
  "zones": [
    "1"
  ]
}
次の検証シナリオの準備
以下スクリーンショットのように、デフォルト設定のサブスクリプションでは1リージョンあたりvCPUは10個までになっています。

次のシナリオでは仮想マシンを10個作成しますので、その準備として前述の操作で作成した仮想マシンを削除します。
for i in `seq 11 13`; do
  az vm delete \
    --resource-group MyResourceGroup \
    --name linux0${i} \
    --yes
done
可用性セット
可用性セットの定義
前述の「可用性ゾーン」の設定では、どの仮想マシンがどのゾーンに属すかを明示的に設定しました。しかし、この設定は仮想マシンの台数が増えれば設定が煩雑になり、どこかのゾーンに仮想マシンが偏ってしまう事故は容易に想像できるでしょう。
このような管理を自動的に定義するのが「可用性セット」と呼ばれる設定です。「可用性セット」は、どの程度分散させるかのパラメタ「障害ドメイン(platform-fault-domain)」「更新ドメイン(platform-update-domain)」で定義します。これら値を大きくすればするほど、仮想マシンは分散されます。
「可用性セット」の作成例は以下の通りです。
az vm availability-set create \
    --resource-group MyResourceGroup \
    --name MyAvailabilitySet \
    --platform-fault-domain-count 2 \
    --platform-update-domain-count 5
障害ドメイン
障害ドメインとは「電源とネットワーク スイッチを共有する仮想マシンのグループ」です。platform-fault-domain-countを3にすれば、3つのグループに仮想マシンが分散されます。
AWSは4つのAZを備えていますが、今のところAzureの可用性ゾーンは3つしかないので、Azureの場合はplatform-fault-domain-countに指定できる値は2か3のみです。
更新ドメイン
更新ドメインは「仮想マシンと同時に再起動できる基礎となる物理ハードウェアのグループ」です。端的に言えば、バージョンアップ等でハードウェアの再起動が必要になった時に影響を受ける範囲です。platform-update-domain-countは最大で10を指定できます。
可用性セットを指定した仮想マシンの作成
可用性セットを指定して仮想マシンを作成するには、availability-setに「可用性セット名」を指定します。操作例は以下の通りです。
「可用性ゾーン」と「可用性セット」は排他的な設定で、どちらか片方しか指定できません。
for i in `seq 20 29`; do
  az vm create \
    --resource-group MyResourceGroup \
    --name linux0${i} \
    --image UbuntuLTS \
    --size Standard_B1s \
    --admin-username azureuser \
    --ssh-key-values ~/.ssh/authorized_keys \
    --vnet-name MyVnet \
    --subnet MySubnet \
    --availability-set MyAvailabilitySet
done
可用性セットの確認
ポータル(GUI)のすべてのメニューから「コンピューティング」「可用性セット」の順に遷移します。

「Virtual Machine」の画面にて、作成した仮想マシンの「障害ドメイン」「更新ドメイン」が分散している事を確認します。

 
  
  
  
  