🧅

Azure 可用性ゾーン で 物理ゾーン と 論理ゾーン を確認する

2023/11/26に公開

可用性ゾーン の 物理ゾーン と 論理ゾーン

Japan East リージョンは可用性ゾーンがサポートされているリージョンです。
Japan East では、 3つの可用性ゾーン提供されており、それぞれのゾーンが、1 つまたは複数のデータセンターで構成されています。
2つの可用性ゾーンにまたがるようにシステムをデプロイしておけば、万が一、データセンターレベルの障害が発生してしまった場合でも、サービスの継続が可能になります。

可用性ゾーンには、実は、物理ゾーン と 論理ゾーン という概念があります。
イメージとしては、以下のような感じです。

Azure の Japan East リージョンを構成する 東日本(東京、埼玉)にある各データセンターは、3つの物理ゾーンのいずれかに属しています。
一方の論理ゾーンは、各サブスクリプションから指定できる 3つのゾーン であり、各論理ゾーン が 各物理ゾーン にマップされています。
公式ドキュメント Azure リージョンと可用性ゾーンとは にも、以下のように記載されています。

==== 引用 ======
各データセンターは、物理ゾーンに割り当てられています。
物理ゾーンは、Azure サブスクリプションの論理ゾーンにマップされています。
Azure サブスクリプションには、サブスクリプションの作成時に、このマッピングが自動的に割り当てられます。
checkZonePeers と呼ばれる専用の ARM API を使用して、複数のサブスクリプションにまたがる回復性のあるソリューションのゾーン マッピングを比較できます。
===== 終 ======

Azure Portal から確認したり、各種デプロイ時指定できる可用性ゾーンは、論理ゾーンの方です。

ここで少し注意となるのは、このマッピングは、実は、サブスクリプションによって異なる場合があるということです。
サブスクリプションA では、論理ゾーン1 が 物理ゾーン1 とマップされていても、サブスクリプションB では 論理ゾーン1 は 物理ゾーン2 とマップされていたりする、というような感じです。
これは例えば、異なるサブスクリプションで、レイテンシを考慮して物理的に近接してリソースをデプロイしたいといった場合に、注意すべき点となります。

物理ゾーン と 論理ゾーン の対応を確認する

2 つの API について紹介します。

API 概要
listLocations ある 1つの サブスクリプション の 物理ゾーン と 論理ゾーン の対応を確認する
checkZonePeers 複数の サブスクリプション の 論理ゾーン 同士の対応を確認する

listLocations API : ある 1つの サブスクリプション での 物理ゾーン と 論理ゾーン の対応を確認する

あるサブスクリプションでの 物理ゾーン と 論理ゾーン の対応を確認するには、Azure 可用性ゾーンの移行ベースラインで紹介されている、REST API listLocations を利用します。

Azure CLI での利用例は以下の通りです。

AzCLI サンプル listLocations
#Parameter Setting
subscriptionId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# 物理ゾーンと論理ゾーンの対応一覧を取得し、 Japan のゾーンマッピング のみに絞って表示
az rest --method get --url "https://management.azure.com/subscriptions/${subscriptionId}/locations?api-version=2022-12-01"| grep Zone |grep japan -B 1
AzCLI 実行結果例
 [ ~ ]$ #Parameter Setting
subscriptionId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
 [ ~ ]$ 
 [ ~ ]$ # 物理ゾーンと論理ゾーンの対応一覧を取得し、 Japan のゾーンマッピング のみに絞って表示
az rest --method get --url "https://management.azure.com/subscriptions/${subscriptionId}/locations?api-version=2022-12-01"| grep Zone |grep japan -B 1
          "logicalZone": "1",
          "physicalZone": "japaneast-az2"
          "logicalZone": "2",
          "physicalZone": "japaneast-az3"
          "logicalZone": "3",
          "physicalZone": "japaneast-az1"

checkZonePeers API : 複数の サブスクリプション の 論理ゾーン 同士の対応を確認する

複数のサブスクリプションの論理ゾーン同士の対応を確認したい場合には、REST API checkZonePeers が利用できます。

例えば以下のように利用することができ、subscriptionId1 で指定したサブスクリプションでの各論理ゾーンが、subscriptionId2 ではどの論理ゾーンとなっているかが確認できます。

AzCLI サンプル
#Parameter Setting
subscriptionId1="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
subscriptionId2="yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"

# subscriptionId1 と subscriptionId2 の論理ゾーン同士の対応を確認する
az rest --method post --url "https://management.azure.com/subscriptions/${subscriptionId1}/providers/Microsoft.Resources/checkZonePeers/?api-version=2022-12-01" --body @- << EOF
{
  "location":"japaneast",
  "subscriptionIds":[
    "subscriptions/${subscriptionId2}",
  ]
}
EOF

実行した結果は以下のように表示されます。

AzCLI 実行結果例
{
  "availabilityZonePeers": [
    {
      "availabilityZone": "1",
      "peers": [
        {
          "availabilityZone": "2",
          "subscriptionId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
        }
      ]
    },
    {
      "availabilityZone": "2",
      "peers": [
        {
          "availabilityZone": "1",
          "subscriptionId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
        }
      ]
    },
    {
      "availabilityZone": "3",
      "peers": [
        {
          "availabilityZone": "3",
          "subscriptionId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
        }
      ]
    }
  ],
  "location": "japaneast",
  "subscriptionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

例えば、以下の箇所から、subscriptionId1 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" の論理ゾーン1 は、subscriptionId2 "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" では論理ゾーン2 となっている、ということを示しています。

AzCLI 実行結果例 - 抜粋 -
{
  "availabilityZonePeers": [
    {
      "availabilityZone": "1",
      "peers": [
        {
          "availabilityZone": "2",
          "subscriptionId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
        }
      ]
    },
    ... 略 ...
      "location": "japaneast",
  "subscriptionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

自分のサブスクリプションが、どのSKU を どの論理ゾーン でデプロイできるのか?

サブスクリプションによっては、リージョンまたは可用性ゾーンで、一部 SKU を使用できない場合があります。
ドキュメント SKU 利用不可エラーを解決する にも記載されていますが、要求されたサイズが場所またはゾーンで使用できないというエラー メッセージが表示される場合があります。
Azure Portal でデプロイしようとすると以下のようなエラーが表示されたり、Bicep や コマンド を利用しての作成を試みた場合にもドキュメント記載のエラーが表示されたりします。

例えば仮想マシンであれば、以下のようなコマンド で、サブスクリプションで使用可能な SKU を確認することができます。
デプロイしようとしているシリーズが決まっている場合には、以下のような形で確認することができます。

AzCLI サンプル
# 確認したい SKU が決まっていれば、こっちのが見やすい

az vm list-skus --location japaneast --size Standard_D --zone --output table
実行結果例
az vm list-skus --location japaneast --size Standard_D --zone --output table

ResourceType     Locations    Name                 Zones    Restrictions
---------------  -----------  -------------------  -------  --------------
virtualMachines  japaneast    Standard_D11_v2      1,2,3    None
virtualMachines  japaneast    Standard_D12_v2      1,2,3    None
virtualMachines  japaneast    Standard_D13_v2      1,2,3    None
virtualMachines  japaneast    Standard_D14_v2      1,2,3    None
virtualMachines  japaneast    Standard_D16ads_v5   2,3      None
virtualMachines  japaneast    Standard_D16as_v4    1,2,3    None
virtualMachines  japaneast    Standard_D16as_v5    2,3      None

量は膨大にはなりますが、すべての SKU を確認したい場合には、以下のような形で確認することができます。

AzCLI サンプル
# 可用性ゾーンをサポートする japaneast リージョンで使用可能なすべての VM サイズを一覧表示します。
# --location      : リージョンを指定
# --resource-type : リソースの種類 ("virtualmachines"、"disks"など)。
# --zone          : 可用性ゾーンをサポートする SKU を表示します。
# --all           : 現在のサブスクリプションでは使用できない VM サイズを含むすべての情報を表示します。

az vm list-skus --location japaneast --resource-type virtualmachines --zone --all --output table

まとめ

可用性ゾーンには、物理ゾーンと論理ゾーンの概念があります。
REST API listLocations や、REST API checkZonePeers を利用することで、マッピングを確認できます。

API 概要
listLocations ある 1つの サブスクリプション の 物理ゾーン と 論理ゾーン の対応を確認する
checkZonePeers 複数の サブスクリプション の 論理ゾーン 同士の対応を確認する

可用性ゾーンを利用しつつ、レイテンシも考慮する必要があるなどには、可用性ゾーンとリージョンを使用するための推奨事項 に記載されているような、特定ゾーンを指定してのデプロイが必要な場合もあります。

異なるサブスクリプションでは、可用性ゾーンの物理ゾーンと論理ゾーンのマッピングが異なっている可能性もありますので、確認してみてください。

参考URL

Microsoft (有志)

Discussion