azureゾーン冗長VMの構築手順|可用性ゾーンとロードバランサーをCLIで設定

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Azure > azureゾーン冗長VMの構築手順|可用性ゾーンとロードバランサーをCLIで設定
「AzureのVMが一台落ちたら、そのゾーンのサービスが全停止した」
クラウドを使っていても、物理データセンター単位の障害は発生します。Azureの可用性ゾーン(Availability Zone)を活用したゾーン冗長構成を組んでいなければ、単一ゾーンの障害がシステム全体のダウンにつながるリスクがあります。

この記事では、東日本リージョン(Japan East)を想定環境として、Azure CLIで可用性ゾーン1・2・3に分散したVMを作成し、ゾーン冗長Standard Load Balancerで負荷分散するハンズオン手順を解説します。

この記事のポイント

・az vm create の --zone で可用性ゾーン1・2・3に分散配置できる
・ゾーン冗長にはBasicではなくStandard SKUのLoad Balancerが必須
・パブリックIPもゾーン冗長(--zone 1 2 3)に設定することが鍵
・BasicとStandard SKUの混在はエラーになるので構成前に必ず確認する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Azureゾーン冗長(Zone Redundancy)とは何か

Azureの可用性ゾーン(Availability Zone)は、同一リージョン内に物理的に分離された3つのデータセンターゾーンです。電源・冷却設備・ネットワークが独立しており、一つのゾーンで障害が発生しても、他のゾーンで処理を継続できます。

「ゾーン冗長」と「ゾーン分散」は区別して理解してください。

・ゾーン冗長(Zone-Redundant):単一リソースが複数ゾーンにまたがる構成。Standard Load BalancerのパブリックIPに --zone 1 2 3 を指定する場合がこれにあたります。
・ゾーン分散(Zone-Pinned):複数のリソースを異なるゾーンに配置する構成。VMをゾーン1・2・3にそれぞれ1台ずつ作成するケースです。

本記事では、VMをゾーン分散で配置し、フロントのLoad Balancerをゾーン冗長化する組み合わせを実装します。この構成のSLAは99.99%です(VM単体の99.9%と比較して大幅に向上します)。

構成概要

本ハンズオンで構築するアーキテクチャは以下の通りです。

・リソースグループ: rg-zone-demo
・リージョン: Japan East(東日本)
・VNet: 10.0.0.0/16
・サブネット: 10.0.1.0/24
・パブリックIP: Standard SKU・ゾーン冗長(zone 1 2 3)
・Load Balancer: Standard SKU
・VM: Ubuntu 22.04 LTS × 3台(Zone 1 / Zone 2 / Zone 3)

VMにはパブリックIPを付けず、Load Balancer経由でHTTPアクセスを受け付ける構成にします。

事前準備(Azure CLIの確認)

Azure CLIのバージョンと、ログイン状態を確認しておきます。

# バージョン確認 az version # ログイン状態の確認 az account show --query "{サブスクリプション:name, テナント:tenantId}" -o table

出力例(環境により異なります):

{ "azure-cli": "2.65.0", ... } サブスクリプション テナント ----------------- ------------------------------------ My Azure Sub xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

サブスクリプションが表示されていればログイン済みです。未ログインの場合は az login を実行してください。

次に、使用予定のリージョンでゾーンが利用可能かを確認します。

az vm list-skus \ --location japaneast \ --size Standard_B1s \ --query "[].locationInfo[0].zones" \ -o tsv

出力例(環境により異なります):

1 2 3

「1 2 3」と表示されれば、Japan Eastでゾーン1・2・3が利用可能です。

ゾーン冗長VMとLoad Balancerの構築手順

1. リソースグループとVNetの作成

まずリソースグループを作成します。

az group create \ --name rg-zone-demo \ --location japaneast

続けて仮想ネットワーク(VNet)とサブネットを作成します。

az network vnet create \ --resource-group rg-zone-demo \ --name vnet-zone-demo \ --address-prefix 10.0.0.0/16 \ --subnet-name snet-web \ --subnet-prefix 10.0.1.0/24

VMへのHTTP(80番ポート)通信を許可するNSG(ネットワークセキュリティグループ)も作成しておきます。

# NSGの作成 az network nsg create \ --resource-group rg-zone-demo \ --name nsg-web # HTTP許可ルール az network nsg rule create \ --resource-group rg-zone-demo \ --nsg-name nsg-web \ --name allow-http \ --priority 100 \ --protocol Tcp \ --destination-port-range 80 \ --access Allow

2. ゾーン冗長パブリックIPとStandard Load Balancerの作成

ここが本記事の核心です。パブリックIPとLoad Balancerの両方をStandard SKUで作成し、パブリックIPには --zone 1 2 3 を指定してゾーン冗長化します。

# ゾーン冗長パブリックIPの作成(Standard SKU + --zone 1 2 3) az network public-ip create \ --resource-group rg-zone-demo \ --name pip-lb-zone \ --sku Standard \ --zone 1 2 3

# Standard Load Balancerの作成 az network lb create \ --resource-group rg-zone-demo \ --name lb-zone-demo \ --sku Standard \ --public-ip-address pip-lb-zone \ --frontend-ip-name fe-config \ --backend-pool-name be-pool

Basic SKUを使うとゾーンが利用できないため、必ずStandardを指定してください。

3. ヘルスプローブとロードバランシングルールの設定

VMが正常に応答しているかを確認するヘルスプローブと、どのポートをどのVMへ転送するかを定義するロードバランシングルールを設定します。

# ヘルスプローブの作成(TCP 80番で死活監視) az network lb probe create \ --resource-group rg-zone-demo \ --lb-name lb-zone-demo \ --name hp-http \ --protocol Tcp \ --port 80 # ロードバランシングルールの作成(外部80 → バックエンド80) az network lb rule create \ --resource-group rg-zone-demo \ --lb-name lb-zone-demo \ --name lr-http \ --protocol Tcp \ --frontend-port 80 \ --backend-port 80 \ --frontend-ip-name fe-config \ --backend-pool-name be-pool \ --probe-name hp-http

4. 可用性ゾーンを指定してVMを作成する

VMを3台、ゾーン1・2・3にそれぞれ1台ずつ作成します。--zone オプションでゾーン番号を指定するのがポイントです。

# Zone 1 のVM az vm create \ --resource-group rg-zone-demo \ --name vm-zone1 \ --image Ubuntu2204 \ --zone 1 \ --size Standard_B1s \ --vnet-name vnet-zone-demo \ --subnet snet-web \ --nsg nsg-web \ --public-ip-address "" \ --admin-username azureuser \ --generate-ssh-keys # Zone 2 のVM az vm create \ --resource-group rg-zone-demo \ --name vm-zone2 \ --image Ubuntu2204 \ --zone 2 \ --size Standard_B1s \ --vnet-name vnet-zone-demo \ --subnet snet-web \ --nsg nsg-web \ --public-ip-address "" \ --admin-username azureuser \ --generate-ssh-keys # Zone 3 のVM az vm create \ --resource-group rg-zone-demo \ --name vm-zone3 \ --image Ubuntu2204 \ --zone 3 \ --size Standard_B1s \ --vnet-name vnet-zone-demo \ --subnet snet-web \ --nsg nsg-web \ --public-ip-address "" \ --admin-username azureuser \ --generate-ssh-keys

--public-ip-address "" でパブリックIPを付けず、Load Balancer経由でのみアクセスを受け付ける構成にしています。

3台の作成が完了したら、ゾーン割り当てを確認します。

az vm list \ --resource-group rg-zone-demo \ --query "[].{VM:name, Zone:zones}" \ -o table

出力例(環境により異なります):

VM Zone -------- ------ vm-zone1 ['1'] vm-zone2 ['2'] vm-zone3 ['3']

5. VMのNICをバックエンドプールに追加する

作成したVMをLoad Balancerのバックエンドプールに追加します。VMのNIC名を取得してから、プールへの追加を実行します。

# vm-zone1 のNIC名を取得 NIC1=$(az vm nic list \ --resource-group rg-zone-demo \ --vm-name vm-zone1 \ --query "[0].id" -o tsv | awk -F/ '{print $NF}') # vm-zone1 をバックエンドプールへ追加 az network nic ip-config address-pool add \ --resource-group rg-zone-demo \ --nic-name $NIC1 \ --ip-config-name ipconfig1 \ --lb-name lb-zone-demo \ --address-pool be-pool # vm-zone2、vm-zone3 も同様に NIC 名を取得してから追加する

3台すべて追加後、バックエンドプールの状態を確認します。

az network lb address-pool show \ --resource-group rg-zone-demo \ --lb-name lb-zone-demo \ --name be-pool \ --query "backendIpConfigurations[].id" \ -o table

3件のIPコンフィグレーションIDが表示されれば、3台のVMがバックエンドプールに登録されています。

実運用Tips(可用性セット・VMSS・ゾーン冗長の使い分け)

Azureには似たような高可用性機能が複数あるため、整理しておきます。

・可用性セット(Availability Set):同一データセンター内で障害ドメインと更新ドメインを分散する。可用性ゾーン非対応リージョン向けの旧来の方法。SLAは99.95%。
・可用性ゾーン(Availability Zone):物理的に分離されたゾーン間でVMを分散する。99.99% SLA。本記事の構成。現在の推奨方法。
・VMSS(Virtual Machine Scale Set):VMを自動スケールする仕組み。ゾーン分散と組み合わせることも可能。可用性ゾーンと直交する概念なので併用できます。

本番ワークロードで高可用性を確保するなら、可用性ゾーン+Standard Load Balancerの組み合わせが現在の標準的な選択です。AzureのLinuxサーバー構築を体系的に学びたい方は Azure実践ハンズオン講座 もご覧ください。

よくあるエラーと対処法

「ResourceSkuNotAvailable」が出る場合

指定したVMサイズ(例: Standard_B1s)が、指定したゾーンで利用できない場合に発生します。

# 利用可能なVMサイズをゾーン付きで一覧表示 az vm list-skus \ --location japaneast \ --resource-type virtualMachines \ --query "[?locationInfo[0].zones != null].{name:name, zones:locationInfo[0].zones}" \ -o table | grep B1s

対応するゾーンで利用可能なSKUに変更してください。

「BasicLoadBalancerNotSupportedForAvailabilityZone」が出る場合

Basic SKUのLoad BalancerでゾーンピンのVMを追加しようとすると発生します。Load BalancerをStandard SKUで作り直す必要があります。

# Load Balancer の SKU を確認する az network lb show \ --resource-group rg-zone-demo \ --name lb-zone-demo \ --query "sku.name" -o tsv

出力が「Standard」であることを確認してください。「Basic」の場合は削除してStandard SKUで再作成します。

「PublicIPAddressCannotBeAssociatedWithLoadBalancerOfDifferentSku」が出る場合

パブリックIPとLoad BalancerのSKUが混在しています(例: Standard IP + Basic LB)。両方を同じSKUに統一してください。

# パブリックIPのSKUを確認する az network public-ip show \ --resource-group rg-zone-demo \ --name pip-lb-zone \ --query "sku.name" -o tsv

本記事のまとめ

AzureでゾーンリダンダントなVMとLoad Balancerを構築する主要コマンドをまとめます。
やりたいこと コマンド
リソースグループを作成する az group create --name 名前 --location japaneast
ゾーン冗長パブリックIPを作成する az network public-ip create --sku Standard --zone 1 2 3
Standard Load Balancerを作成する az network lb create --sku Standard
ヘルスプローブを作成する az network lb probe create --protocol Tcp --port 80
ゾーン指定でVMを作成する az vm create --zone 1
VMをバックエンドプールに追加する az network nic ip-config address-pool add
VMのゾーン割り当てを確認する az vm list --query "[].{VM:name, Zone:zones}"
ゾーン冗長構成のポイントは「Standard SKUのLoad Balancer + ゾーン冗長パブリックIP(--zone 1 2 3)+ --zone 指定のVM」の3点セットです。Basic SKUのリソースが1つでも混在するとエラーになるため、SKUの一貫性を必ず確認してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
Azureを使ったLinuxサーバー構築を基礎から体系的に学べるAzure実践ハンズオン講座をご活用ください。可用性ゾーンを含むAzureインフラの設計・構築手順を丁寧に解説しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。