オンプレの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使用率などのメトリクスに基づいた自動スケールルールを設定可能
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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/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
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
# サブネット一覧の確認 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
現場で通用する安全な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
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
Load Balancerのヘルスプローブが失敗する
# Load Balancerのバックエンドプール状態を確認 az network lb show \ --resource-group rg-vmss-handson \ --name lb-handson \ --query "backendAddressPools[*].backendIPConfigurations[*].id" \ --output tsv
スケールアウトが発動しない
自動スケーリングの状態をActivity Logで確認します。# 自動スケーリングの活動ログを確認 az monitor activity-log list \ --resource-group rg-vmss-handson \ --query "[?category.value=='Autoscale']" \ --output table
後片付け(リソース削除)
ハンズオン後は不要なリソースを削除してコストを止めます。リソースグループごと削除するのが確実です。# リソースグループ全体を削除(確認プロンプトあり) 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 ... |
次のステップとして、Application Gatewayを使ったL7負荷分散や、可用性ゾーンをまたいだ冗長配置を試してみると、さらに実務に近い構成を学べます。
Azureの学習をもっと体系的に進めたいなら、Azure実践ハンズオン講座をご覧ください。現役エンジニアが教える実務直結カリキュラムで、VM構築からインフラ管理まで一気に習得できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:AzureのNSGとSSH公開鍵認証でLinux VMを安全に保護する方法|ネットワークセキュリティグループの設定と実践例
- 前のページへ:AzureでNATゲートウェイとプライベートサブネットを構築する方法
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます