AzureのVMSSとLoad Balancerで高可用性を実現する方法|スケールセット構築と自動スケーリングの実践ハンズオン

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのVMSSとLoad Balancerで高可用性を実現する方法|スケールセット構築と自動スケーリングの実践ハンズオン
「Azureで複数のVMを手動で管理するのが面倒になってきた」「急なアクセス増加でサーバーが落ちた時にどう対処すればいいか分からない」

オンプレのLinuxサーバー管理に慣れていると、クラウドでもつい「VMを1台ずつ立てて管理する」という発想になりがちです。ところがAzureには、複数のVMを束ねて自動でスケールアウト・スケールインしてくれる仕組みがあります。それが Virtual Machine Scale Sets(VMSS) です。

この記事では、AzureのVMSSとStandard Load Balancerを組み合わせた高可用性構成を、実際のCLIコマンドを交えながら解説します。「構築ハンズオン → 自動スケーリング設定 → 動作確認」の流れで進めるので、初めてVMSSを触る方でもゼロから手を動かせます。

この記事のポイント

・VMSSはVMの複製・スケーリングをAzureが自動で管理する仕組み
・Standard Load BalancerとVMSSを組み合わせると高可用性構成が完成する
・az vmss createコマンド一発で複数VM+LB構成を一括作成できる
・CPU使用率などのメトリクスに基づいた自動スケールルールを設定可能


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

Virtual Machine Scale Sets(VMSS)とは何か

AzureのVMSSは、同一構成のVM(仮想マシン)を複数台まとめて管理するためのサービスです。オンプレでいえば「同じスペック・同じOSイメージ・同じ設定のサーバーを何台も並べる」という場面に相当しますが、手作業でVMを1台ずつ立てる必要がありません。

VMSSが解決してくれる主な課題は次の3点です。

スケールアウト自動化:CPUやメモリの使用率が閾値を超えたら自動でVMを追加する
スケールイン自動化:負荷が下がったら不要なVMを自動で削除してコストを抑える
障害時の自動復旧:VMが異常終了した場合、新しいVMを自動で補充する

Linuxエンジニアが最初に「これは便利だ」と感じるポイントは、ゴールデンイメージ(マスターのVMイメージ)を決めておけば、何台追加されても同じ構成が保証されるという点です。オンプレでサーバーを増設するたびに手動でアプリをインストールしていた手間がなくなります。

VMSSとAWSの比較

AWSを使ったことがある方向けに対応サービスを整理しておきます。
Azure AWS 機能概要
Virtual Machine Scale Sets (VMSS) Auto Scaling Group (ASG) VMを自動で増減するスケーリングの仕組み
Standard Load Balancer Network Load Balancer (NLB) L4レベルの負荷分散。TCPトラフィックを各VMへ振り分け
Application Gateway Application Load Balancer (ALB) L7レベルの負荷分散。HTTPパスルーティング・SSL終端
Orchestration Mode(Flexible/Uniform) 混合インスタンスポリシー スポットインスタンスとオンデマンドの混在設定

事前準備|Azure CLIのインストールと認証

本記事の手順はすべて Azure CLI(az コマンド) を使ってLinuxのターミナルから実行します。Azure PortalのGUIでも同等の操作はできますが、CLIのほうが手順を再現しやすく、スクリプト化もできるため実務では必須スキルです。

1. Azure CLIのインストール(Ubuntu/Debian系)

# Microsoft GPGキーとリポジトリを追加 curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash # インストール確認 az version

RHEL/CentOS/Rocky Linux環境では以下を使います。

# RHEL/Rocky Linux向け(Azure CLIリポジトリ追加) sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo dnf install -y azure-cli

2. Azureへのログイン

# ブラウザが起動してMicrosoftアカウントでログイン az login # ログイン確認(サブスクリプション一覧が表示される) az account list --output table

サービスプリンシパルやマネージドIDを使う環境では `az login --service-principal` や `az login --identity` を使います。本記事では個人アカウントでのインタラクティブログインを前提とします。

3. リソースグループの作成

すべてのAzureリソースはリソースグループ(Resource Group)という論理コンテナに入れて管理します。

# リソースグループを東日本リージョン(japaneast)に作成 az group create \ --name rg-vmss-handson \ --location japaneast

VNetとサブネットの構築

VMSSを配置するための仮想ネットワーク(VNet)とサブネットを作成します。以下の構成を想定します。

VNet アドレス空間:10.0.0.0/16
フロントエンドサブネット:10.0.1.0/24(Load Balancerの受け口)
バックエンドサブネット:10.0.2.0/24(VMSSのVMを配置)

1. 仮想ネットワークとサブネットの作成

# VNetを作成(バックエンドサブネットも同時に定義) az network vnet create \ --resource-group rg-vmss-handson \ --name vnet-handson \ --address-prefix 10.0.0.0/16 \ --subnet-name subnet-backend \ --subnet-prefix 10.0.2.0/24 # フロントエンドサブネットを追加 az network vnet subnet create \ --resource-group rg-vmss-handson \ --vnet-name vnet-handson \ --name subnet-frontend \ --address-prefix 10.0.1.0/24

作成後、Azure PortalやCLIで確認できます。

# サブネット一覧の確認 az network vnet subnet list \ --resource-group rg-vmss-handson \ --vnet-name vnet-handson \ --output table # 出力例(実サーバーで確認): # Name AddressPrefix ProvisioningState # --------------- --------------- ----------------- # subnet-backend 10.0.2.0/24 Succeeded # subnet-frontend 10.0.1.0/24 Succeeded

Standard Load Balancerの作成

VMSSの前段にStandard Load Balancerを置き、インターネットからのトラフィックをVMSSの各VMへ均等に振り分けます。

1. パブリックIPアドレスの作成

# Standard SKUのパブリックIPを作成 az network public-ip create \ --resource-group rg-vmss-handson \ --name pip-lb-handson \ --sku Standard \ --allocation-method Static

2. Standard Load Balancerの作成とフロントエンドIP設定

# Load Balancerを作成(Standard SKU必須) az network lb create \ --resource-group rg-vmss-handson \ --name lb-handson \ --sku Standard \ --public-ip-address pip-lb-handson \ --frontend-ip-name lb-frontend \ --backend-pool-name lb-backend-pool

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

ヘルスプローブはLBがVMの死活を確認する仕組みです。ここではHTTPポート80への応答でVMの正常性を判定します。

# ヘルスプローブ(HTTP 80番ポートで5秒ごとに確認) az network lb probe create \ --resource-group rg-vmss-handson \ --lb-name lb-handson \ --name lb-health-probe \ --protocol Http \ --port 80 \ --path / \ --interval 5 \ --threshold 2 # ロードバランサールール(フロントエンド80→バックエンド80) az network lb rule create \ --resource-group rg-vmss-handson \ --lb-name lb-handson \ --name lb-rule-http \ --protocol Tcp \ --frontend-port 80 \ --backend-port 80 \ --frontend-ip-name lb-frontend \ --backend-pool-name lb-backend-pool \ --probe-name lb-health-probe \ --disable-outbound-snat true

--disable-outbound-snat true を付けることで、VMの送信トラフィックはNATゲートウェイや別のアウトバウンドルールで制御できるようになります。

---

VMSSの作成と初期設定

いよいよ本命のVMSSを作成します。az vmss create コマンドは一度の実行でVMを指定台数作成し、上で作ったLoad Balancerのバックエンドプールにも自動で接続してくれます。

1. VMSSの作成(az vmss create)

az vmss create \ --resource-group rg-vmss-handson \ --name vmss-handson \ --image Ubuntu2204 \ --vm-sku Standard_B1s \ --instance-count 2 \ --admin-username azureuser \ --generate-ssh-keys \ --vnet-name vnet-handson \ --subnet subnet-backend \ --lb lb-handson \ --backend-pool-name lb-backend-pool \ --upgrade-policy-mode automatic \ --orchestration-mode Flexible

主要なオプションを解説します。

--image Ubuntu2204:Ubuntu 22.04 LTSをベースイメージとして使用
--vm-sku Standard_B1s:バーストable VMの最小サイズ(ハンズオン向け低コスト)
--instance-count 2:最初に2台のVMを作成
--upgrade-policy-mode automatic:VMSSのイメージを更新したとき、各VMが自動で更新される
--orchestration-mode Flexible:AWSのASGに近い柔軟なオーケストレーションモード(可用性ゾーン分散が容易)

SSH鍵は自動生成されて `~/.ssh/id_rsa.pub` が使われます。作成完了まで2~3分程度かかります。

2. 作成確認

# VMSSの状態確認 az vmss show \ --resource-group rg-vmss-handson \ --name vmss-handson \ --output table # VMSS内のインスタンス(VM)一覧 az vmss list-instances \ --resource-group rg-vmss-handson \ --name vmss-handson \ --output table # 出力例: # InstanceId LatestModelApplied ProvisioningState VmId # ---------- ------------------ ----------------- ------------------------------------ # 0 True Succeeded xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # 1 True Succeeded yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy

2台のVMが「Succeeded」になっていれば正常です。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Azureの学習をもっと体系的に進めたいなら、Azure実践ハンズオン講座をご覧ください。現役エンジニアが教える実務直結カリキュラムで、VM構築からインフラ管理まで一気に習得できます。

自動スケーリングルールの設定

VMSSの真価は「負荷に応じてVMを自動で増減する」自動スケーリングにあります。以下ではCPU使用率をトリガーにしたスケールアウト・スケールインルールを設定します。

1. 自動スケーリングプロファイルの作成

# 自動スケーリングの設定(VMの最小1台、最大5台) az monitor autoscale create \ --resource-group rg-vmss-handson \ --resource vmss-handson \ --resource-type Microsoft.Compute/virtualMachineScaleSets \ --name autoscale-handson \ --min-count 1 \ --max-count 5 \ --count 2

2. スケールアウトルール(CPU 70%超でVM追加)

# スケールアウトルール: CPU平均が70%を5分間超えたら1台追加 az monitor autoscale rule create \ --resource-group rg-vmss-handson \ --autoscale-name autoscale-handson \ --condition "Percentage CPU > 70 avg 5m" \ --scale out 1

3. スケールインルール(CPU 20%未満でVM削除)

# スケールインルール: CPU平均が20%未満を5分間続いたら1台削除 az monitor autoscale rule create \ --resource-group rg-vmss-handson \ --autoscale-name autoscale-handson \ --condition "Percentage CPU < 20 avg 5m" \ --scale in 1

4. 設定の確認

# 自動スケーリング設定の確認 az monitor autoscale show \ --resource-group rg-vmss-handson \ --name autoscale-handson \ --output table # 出力例: # Name Enabled MinCount MaxCount DefaultCount # ------------------ --------- ---------- ---------- ------------- # autoscale-handson True 1 5 2

動作確認|Webサーバーのインストールとアクセステスト

VMSSの各VMにNginxをインストールして、Load Balancer経由でアクセスできることを確認します。

1. カスタムスクリプト拡張機能でNginxを一括インストール

VMSSでは各VMに個別SSHログインして設定するのではなく、VMSSの拡張機能(Extension)を使って一括でコマンドを実行します。

# カスタムスクリプト拡張機能でNginxインストール az vmss extension set \ --resource-group rg-vmss-handson \ --vmss-name vmss-handson \ --name customScript \ --publisher Microsoft.Azure.Extensions \ --version 2.1 \ --settings '{"commandToExecute": "apt-get update && apt-get install -y nginx && systemctl enable nginx && systemctl start nginx"}' # 全VMへ設定を即時反映 az vmss update-instances \ --resource-group rg-vmss-handson \ --name vmss-handson \ --instance-ids "*"

2. Load BalancerのIPアドレス確認とアクセステスト

# Load BalancerのパブリックIPを確認 az network public-ip show \ --resource-group rg-vmss-handson \ --name pip-lb-handson \ --query ipAddress \ --output tsv # 出力例: # 20.xxx.xxx.xxx # curlでWebサーバーへアクセス確認 curl -I http://20.xxx.xxx.xxx/ # HTTP/1.1 200 OK が返ればLoad Balancer経由の接続成功

3. VMSSインスタンスのスケールアウトを手動でテスト

自動スケーリングのトリガーを待たずに、手動でVMを追加・削除することもできます。

# 手動でインスタンス数を3台に増やす az vmss scale \ --resource-group rg-vmss-handson \ --name vmss-handson \ --new-capacity 3 # インスタンス一覧で3台に増えたことを確認 az vmss list-instances \ --resource-group rg-vmss-handson \ --name vmss-handson \ --output table

ネットワークセキュリティグループ(NSG)の設定

VMSSを本番環境で使う場合、NSG(Network Security Group)でインバウンド/アウトバウンドのトラフィックを制限するのが必須です。

1. バックエンドサブネット用NSGの作成

# NSGを作成 az network nsg create \ --resource-group rg-vmss-handson \ --name nsg-backend # Load BalancerからのHTTPアクセスを許可 az network nsg rule create \ --resource-group rg-vmss-handson \ --nsg-name nsg-backend \ --name allow-http-from-lb \ --priority 100 \ --protocol Tcp \ --destination-port-range 80 \ --source-address-prefix AzureLoadBalancer \ --access Allow # SSH(管理用)はAzure Bastionや踏み台VMからのみ許可 az network nsg rule create \ --resource-group rg-vmss-handson \ --nsg-name nsg-backend \ --name allow-ssh-from-bastion \ --priority 200 \ --protocol Tcp \ --destination-port-range 22 \ --source-address-prefix 10.0.1.0/24 \ --access Allow # インターネットからの直接アクセスをすべて拒否 az network nsg rule create \ --resource-group rg-vmss-handson \ --nsg-name nsg-backend \ --name deny-all-inbound \ --priority 4000 \ --protocol "*" \ --destination-port-range "*" \ --source-address-prefix Internet \ --access Deny # NSGをバックエンドサブネットに関連付け az network vnet subnet update \ --resource-group rg-vmss-handson \ --vnet-name vnet-handson \ --name subnet-backend \ --network-security-group nsg-backend

これで「インターネット → Load Balancer → VMSSのVM」という流れ以外のアクセスをブロックできます。

VMSSのイメージ更新とローリングアップグレード

本番運用でよく発生するのが「OSアップデートや新しいアプリバージョンを無停止で適用したい」という場面です。VMSSはローリングアップグレードをサポートしており、全VMを一度に更新せず、少しずつ切り替えることでサービスを止めずに更新できます。

1. ローリングアップグレードポリシーの設定

# ローリングアップグレードポリシーを設定 az vmss update \ --resource-group rg-vmss-handson \ --name vmss-handson \ --set upgradePolicy.mode=Rolling \ --set upgradePolicy.rollingUpgradePolicy.maxBatchInstancePercent=20 \ --set upgradePolicy.rollingUpgradePolicy.maxUnhealthyInstancePercent=20 \ --set upgradePolicy.rollingUpgradePolicy.maxUnhealthyUpgradedInstancePercent=20 \ --set upgradePolicy.rollingUpgradePolicy.pauseTimeBetweenBatches=PT0S

maxBatchInstancePercent=20 は「全VMの20%ずつ順番に更新する」という意味です。5台のVMSSであれば1台ずつ更新するので、残り4台でサービスを継続しながら更新できます。

トラブルシューティング

VMSSのインスタンスが「Creating」から変わらない

# VMSSの詳細ステータスを確認 az vmss list-instances \ --resource-group rg-vmss-handson \ --name vmss-handson \ --expand instanceView \ --query "[*].{ID:instanceId, State:instanceView.statuses[1].displayStatus}" \ --output table

「Failed」と表示される場合は、ディスクサイズの上限超過やVNet/サブネットの設定ミスが多い原因です。

Load Balancerのヘルスプローブが失敗する

# Load Balancerのバックエンドプール状態を確認 az network lb show \ --resource-group rg-vmss-handson \ --name lb-handson \ --query "backendAddressPools[*].backendIPConfigurations[*].id" \ --output tsv

バックエンドプールが空の場合、VMSSとLoad Balancerの紐付けが失敗しています。`az vmss update` でNICとLBを再関連付けしてください。

スケールアウトが発動しない

自動スケーリングの状態をActivity Logで確認します。

# 自動スケーリングの活動ログを確認 az monitor activity-log list \ --resource-group rg-vmss-handson \ --query "[?category.value=='Autoscale']" \ --output table

スケールアウトが発動しない原因の多くは「CPUの計測ウィンドウが短すぎる」「閾値が高すぎる」「クールダウン期間が長い」のいずれかです。閾値を一時的に低くしてテストするのが最速の確認方法です。

後片付け(リソース削除)

ハンズオン後は不要なリソースを削除してコストを止めます。リソースグループごと削除するのが確実です。

# リソースグループ全体を削除(確認プロンプトあり) az group delete \ --name rg-vmss-handson \ --yes

本記事のまとめ

やりたいこと コマンド
VMSSを作成してLBに接続 az vmss create --lb lb-handson --backend-pool-name lb-backend-pool
インスタンス一覧を確認 az vmss list-instances --resource-group ... --name ...
手動でインスタンス数を変更 az vmss scale --new-capacity 3
自動スケーリングを設定 az monitor autoscale create --min-count 1 --max-count 5
スケールアウトルールを追加 az monitor autoscale rule create --condition "Percentage CPU > 70 avg 5m" --scale out 1
全VMに拡張スクリプトを実行 az vmss extension set --name customScript ...
ローリングアップグレードを設定 az vmss update --set upgradePolicy.mode=Rolling ...
VMSSとStandard Load Balancerを組み合わせると、「障害時に自動でVM補充」「負荷増加時に自動でスケールアウト」「無停止でOSアップデート」という、オンプレでは実現コストが高かった高可用性構成をAzureでは比較的シンプルに実現できます。

次のステップとして、Application Gatewayを使ったL7負荷分散や、可用性ゾーンをまたいだ冗長配置を試してみると、さらに実務に近い構成を学べます。

Azureの学習をもっと体系的に進めたいなら、Azure実践ハンズオン講座をご覧ください。現役エンジニアが教える実務直結カリキュラムで、VM構築からインフラ管理まで一気に習得できます。

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

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

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

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

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

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

登録10秒/合わなければ解除3秒 / 詳細はこちら

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

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。