Windows Server のインプレースアップグレードで使う「メディアディスク(Upgrade メディア)」を既存の Azure VM に追加しようとしたら、サブスクリプションには見えるのに VM の属する windowsserverupgrades リソースグループでは候補に出ずアタッチできない――そんな場面で迷わないための実践ガイドです。根本原因の見分け方から、Portal/PowerShell/CLI それぞれの操作、権限やゾーンの落とし穴、運用のベストプラクティスまでまとめました。
問題の全体像と原因の整理
インプレースアップグレード用のメディアディスクは「既存のマネージドディスク」を VM に追加するだけに見えますが、リージョン/リソースグループ/ゾーン/RBAC 権限のいずれかが噛み合わないと候補に現れません。最も多いのは次の3点です。
- リージョン不一致:ディスクと VM の Location が違う(例:disk=Japan East, VM=Japan West)。
- リソースグループ不一致:ディスクが windowsserverupgrades 以外にあり、VM 画面からの「既存ディスクの追加」候補に並ばない。
- ゾーン不一致(Zonal VM/Zonal Disk):可用性ゾーンが異なる、またはディスクが Zonal だが VM は Regional などで整合が取れていない。
このほか、管理ロック(移動ロック)、暗号化(Disk Encryption Set/CMK)参照権限、ロール不足(例:Virtual Machine Contributor ではディスクの移動権限がない)も実務では頻出です。
最短ルートの結論(忙しい人向け)
- 現在地を確認(リージョン/RG/ゾーン)。
Get-AzDisk -Name "<ディスク名>" | Select Name,Location,ResourceGroupName,Zones
Get-AzVM -Name "<VM名>" | Select Name,Location,ResourceGroupName,Zones
- ディスクが windowsserverupgrades に無ければ移動(Portal または PowerShell/CLI)。
Move-AzResource `
-DestinationResourceGroupName "windowsserverupgrades" `
-ResourceId "/subscriptions/<サブスクリプションID>/resourceGroups/<現在のRG>/providers/Microsoft.Compute/disks/<ディスク名>"
az resource move \
--destination-group windowsserverupgrades \
--ids $(az disk show -g <現在のRG> -n <ディスク名> --query id -o tsv)
- VM にアタッチ(Portal で「既存ディスクの追加」または PowerShell/CLI)。
# PowerShell(LUN=1 の例)
$disk = Get-AzDisk -Name "<ディスク名>" -ResourceGroupName "windowsserverupgrades"
$vm = Get-AzVM -Name "<VM名>" -ResourceGroupName "windowsserverupgrades"
$vm = Add-AzVMDataDisk -VM $vm -Name $disk.Name -ManagedDiskId $disk.Id -Lun 1 -Caching ReadOnly -CreateOption Attach
Update-AzVM -VM $vm -ResourceGroupName "windowsserverupgrades"
# Azure CLI
az vm disk attach \
--resource-group windowsserverupgrades \
--vm-name <VM名> \
--name <ディスク名> \
--lun 1
実行前チェックリスト(原因切り分けの地図)
| 観点 | 確認ポイント | OK 条件 | NG 時の対策 |
|---|---|---|---|
| リージョン | Disk.Location と VM.Location を照合 | 完全一致(例:Japan East) | ディスクを適正リージョンの RG へ移動/再作成 |
| リソースグループ | Disk.ResourceGroupName を確認 | windowsserverupgrades | Move-AzResource または az resource move |
| 可用性ゾーン | Disk.Zones と VM.Zones | 同一ゾーン、または両方とも Regional | ゾーン整合化(Zonal Disk 作り直し/VM 側整合) |
| 暗号化 | DiskEncryptionSet / CMK 参照権限 | VM RG から DES/KV にアクセス可能 | ロール割当/アクセス ポリシー調整 |
| RBAC | 操作ユーザーのロール | Contributor または Managed Disk Contributor 等 | 元/先 RG の両方に適切なロールを付与 |
| ロック | 管理ロック(移動/削除)有無 | ロックなし | 一時的にロック解除 |
| ディスク種別 | Managed Disk か(VHD ではない) | Managed Disk | VHD なら MD へインポート作成 |
確認:リージョン/RG/ゾーンを正しく把握する
PowerShell で一括確認
$disk = Get-AzDisk -Name "<ディスク名>" -ResourceGroupName "<現在のRG>"
$vm = Get-AzVM -Name "<VM名>" -ResourceGroupName "windowsserverupgrades"
$disk | Select Name,Location,ResourceGroupName,DiskSizeGB,Sku,Zones
$vm | Select Name,Location,ResourceGroupName,HardwareProfile,Zones
Location が一致しない場合は、そのままではアタッチ不可です。
さらに Zones がディスク=1/VM=2 のようにズレていると、候補に出てもアタッチ時に失敗します。Regional(ゾーン未割り当て)同士は互換です。
Azure CLI で一括確認
az disk show -g <現在のRG> -n <ディスク名> --query "{name:name,location:location,rg:resourceGroup,sku:sku.name,zones:zones}"
az vm show -g windowsserverupgrades -n <VM名> --query "{name:name,location:location,rg:resourceGroup,zones:zones}"
操作:ディスクを windowsserverupgrades へ移動する
Azure Portal
- ディスクのブレードを開き、概要 > 移動 > 他のリソースグループへ を選択。
- 移動先に windowsserverupgrades を指定。
- リージョンが VM と同一であることを確認し、移動を実行。
PowerShell
Move-AzResource `
-DestinationResourceGroupName "windowsserverupgrades" `
-ResourceId "/subscriptions/<サブスクリプションID>/resourceGroups/<現在のRG>/providers/Microsoft.Compute/disks/<ディスク名>"
- 同一サブスクリプション内の RG 間移動はサポートされています。
- ディスクに管理ロックがある場合は 一時解除 が必要です。
Azure CLI
az resource move \
--destination-group windowsserverupgrades \
--ids $(az disk show -g <現在のRG> -n <ディスク名> --query id -o tsv)
操作:ディスクを VM にアタッチする
Portal(推奨)
- 対象 VM > ディスク > 既存ディスクの追加 を選択。
- 一覧から移動済みディスクを選択し、必要に応じて LUN 番号 と キャッシュ を設定。
- 保存 をクリックして反映。
PowerShell
$rg = "windowsserverupgrades"
$vm = Get-AzVM -Name "<VM名>" -ResourceGroupName $rg
$disk = Get-AzDisk -Name "<ディスク名>" -ResourceGroupName $rg
$vm = Add-AzVMDataDisk ` -VM $vm`
-Name $disk.Name ` -ManagedDiskId $disk.Id`
-Lun 1 ` -Caching ReadOnly`
-CreateOption Attach
Update-AzVM -VM $vm -ResourceGroupName $rg
Azure CLI
az vm disk attach \
--resource-group windowsserverupgrades \
--vm-name <VM名> \
--name <ディスク名> \
--lun 1
よくあるエラーと対処法
| メッセージ/症状 | 原因 | 対応 |
|---|---|---|
| The disk is not located in the same region as the VM | リージョン不一致 | 同一リージョンの RG へ移動する/同リージョンに作り直す |
| Resource ‘<disk>’ was not found in resource group ‘windowsserverupgrades’ | RG 不一致 | Move-AzResource / az resource move で移動 |
| OperationNotAllowed: Another operation is in progress | 同一リソースに対する並行操作 | 数分待ってリトライ/実行履歴を確認 |
| AuthorizationFailed / Insufficient privileges | RBAC 権限不足 | 移動元・先 RG の両方に Contributor または Managed Disk Contributor を付与 |
| ScopeLocked / Cannot move because of a lock | 管理ロック(移動・削除) | ロックを一時解除してから移動 |
| Disk uses a Disk Encryption Set you do not have access to | DES / Key Vault 参照権限不足 | VM から DES/KV へアクセスできるようロール/ポリシー設定 |
| Attach failed due to zone mismatch | ゾーン不一致(Zonal) | ゾーンを合わせたディスクを用意/VM 構成を見直し |
RBAC と暗号化の注意点(実務でハマりやすい)
- 必要権限:ディスク移動には 元/先 RG の両方でディスクの書き込み権限が必要です。一般的には Contributor、最小権限なら Managed Disk Contributor を付与します。
- VM だけの権限では不十分:Virtual Machine Contributor はディスクの RG 間移動をカバーしません。
- 暗号化:ディスクが Disk Encryption Set(DES) を参照している場合、VM 側から DES(および背後の Key Vault)へのアクセス権が必要です。RG を移動しても参照先は変わらないため、権限の伝播を確認してください。
インプレースアップグレード固有の注意
- メディアディスクは読み取り専用が基本:パフォーマンス/整合性の観点から Caching=ReadOnly を推奨します。
- アップグレード後のクリーンアップ:メディアディスクは役目を終えたら デタッチ & 必要なら削除。コスト最適化に効きます。
- バックアップ:作業前に VM のスナップショット/バックアップを取得。失敗時のロールバック手段を確保します。
- メンテナンス計画:OS アップグレードは再起動を伴うため、業務影響の少ないスロットで実施。
実運用で使えるフル自動スクリプト(PowerShell)
# 変数
$subId = "<サブスクリプションID>"
$vmName = "<VM名>"
$rgDest = "windowsserverupgrades"
$diskName = "<ディスク名>"
$rgSrc = "<現在のRG>" # 既知なら指定。未知なら検索で補完可
Select-AzSubscription -SubscriptionId $subId
# 現在地の確認(未指定なら検索)
if (-not $rgSrc) {
$d = Get-AzDisk | Where-Object { $_.Name -eq $diskName }
if (-not $d) { throw "ディスクが見つかりません: $diskName" }
$rgSrc = $d.ResourceGroupName
}
$disk = Get-AzDisk -Name $diskName -ResourceGroupName $rgSrc
$vm = Get-AzVM -Name $vmName -ResourceGroupName $rgDest
# リージョン&ゾーン検証
if ($disk.Location -ne $vm.Location) {
throw "リージョン不一致です。Disk=$($disk.Location) VM=$($vm.Location)"
}
if (($disk.Zones -and -not $vm.Zones) -or ($vm.Zones -and -not $disk.Zones)) {
Write-Warning "片方のみ Zonal です。整合性を確認してください。"
}
if ($disk.Zones -and $vm.Zones -and ($disk.Zones[0] -ne $vm.Zones[0])) {
throw "ゾーン不一致です。DiskZone=$($disk.Zones[0]) VMZone=$($vm.Zones[0])"
}
# RG の移動(必要時)
if ($rgSrc -ne $rgDest) {
Write-Host "ディスクを $rgSrc から $rgDest に移動します..."
Move-AzResource ` -DestinationResourceGroupName $rgDest`
-ResourceId "/subscriptions/$subId/resourceGroups/$rgSrc/providers/Microsoft.Compute/disks/$diskName"
# 再取得
$disk = Get-AzDisk -Name $diskName -ResourceGroupName $rgDest
}
# アタッチ
$vm = Add-AzVMDataDisk -VM $vm -Name $disk.Name -ManagedDiskId $disk.Id -Lun 1 -Caching ReadOnly -CreateOption Attach
Update-AzVM -VM $vm -ResourceGroupName $rgDest
Write-Host "アタッチ完了: $($disk.Name) -> VM $vmName"
フル自動スクリプト(Azure CLI/Bash)
SUB_ID="<サブスクリプションID>"
VM="<VM名>"
RG_DEST="windowsserverupgrades"
DISK="<ディスク名>"
RG_SRC="<現在のRG>" # 未知なら検索も可
az account set --subscription "$SUB_ID"
# 情報取得
DISK_LOC=$(az disk show -g "$RG_SRC" -n "$DISK" --query location -o tsv)
VM_LOC=$(az vm show -g "$RG_DEST" -n "$VM" --query location -o tsv)
DISK_ZONES=$(az disk show -g "$RG_SRC" -n "$DISK" --query "zones[0]" -o tsv)
VM_ZONES=$(az vm show -g "$RG_DEST" -n "$VM" --query "zones[0]" -o tsv)
if [ "$DISK_LOC" != "$VM_LOC" ]; then
echo "リージョン不一致: Disk=$DISK_LOC VM=$VM_LOC" >&2
exit 1
fi
# RG 移動
if [ "$RG_SRC" != "$RG_DEST" ]; then
az resource move
--destination-group "$RG_DEST"
--ids $(az disk show -g "$RG_SRC" -n "$DISK" --query id -o tsv)
fi
# アタッチ
az vm disk attach
--resource-group "$RG_DEST"
--vm-name "$VM"
--name "$DISK"
--lun 1
echo "アタッチ完了: $DISK -> $VM"
Portal 派のための画面遷移メモ
- ディスク移動:ディスク > 概要 > 移動 > 他のリソースグループへ > windowsserverupgrades を選択 > 確認して実行。
- アタッチ:VM > ディスク > 既存ディスクの追加 > 対象ディスクを選択 > LUN/キャッシュ設定 > 保存。
補足:VHD を持っているだけのとき
ストレージ アカウント上の .vhd を直接 VM に付けることはできません。いったん Managed Disk として作成したうえで本記事の手順を実施します。
# PowerShell: VHD から Managed Disk を作成(例)
$diskConfig = New-AzDiskConfig -Location "Japan East" -CreateOption Import -StorageAccountId "<SAリソースID>" -SourceUri "<SAS URL>"
New-AzDisk -DiskName "<新規ディスク名>" -Disk $diskConfig -ResourceGroupName "windowsserverupgrades"
補足:Premium SSD v2 / Ultra Disk などの互換性
- Premium SSD v2 は一部制約(ゾーン/スケール、機能のサポート対象)があるため、対象 VM サイズが当該 SKU をサポートしているかを確認。
- Ultra Disk は専用の有効化が必要な場合があるため、要件を満たす VM サイズ/可用性ゾーンで利用してください。
- アップグレード用メディアは性能要件が低いことが多く、StandardSSD_LRS or Premium_LRS で十分です。
検証と後片付けのチェックリスト
| 項目 | 確認方法 | 合格基準 |
|---|---|---|
| ディスクの認識 | ゲスト OS のディスク管理/Get-Disk | 新規ディスクがオフライン/未初期化または ISO として見える |
| LUN の重複 | VM のデータディスク一覧 | 既存と重複なし |
| アップグレード実行 | セットアップ開始~完了 | 再起動後も正常起動 |
| クリーンアップ | メディアディスクのデタッチ/削除 | コスト最適化が完了 |
| バックアップ | スナップショット/バックアップの健全性 | 必要に応じて保持ポリシーを適用 |
FAQ(よくある質問)
Q. 別サブスクリプションのディスクを使えますか?
A. サブスクリプションをまたぐ直接アタッチはできません。まずは 移動(リソース移動がサポートされる場合)または同一サブスクリプション側にディスクを再作成(スナップショット移行等)してください。
Q. Availability Set の VM でも同じ手順ですか?
A. はい。可用性セット自体は影響しませんが、ゾーン指定が絡むと互換性に注意してください。
Q. ディスクが一覧に出るのにアタッチに失敗します。
A. ゾーン不一致、暗号化の参照権、ロック、進行中の別操作が疑われます。本文の表をもとに切り分けてください。
Q. LUN 番号は何でも良いですか?
A. 既存と重複しない範囲であれば任意ですが、規律を保つため「メディアは高い LUN 番号(例:63)」などの運用ルールを決めるのが有効です。
まとめ
インプレースアップグレード用ディスクが VM から見えない/追加できない時は、リージョン → リソースグループ → ゾーン → RBAC/ロック → 暗号化の順でチェックすれば最短で原因に到達できます。ディスクを windowsserverupgrades へ移動し、整合が取れた状態でアタッチすれば問題は解消します。今回の手順とスクリプトを自社の標準運用に組み込めば、以後のアップグレード作業を安定・高速に回せるようになります。
参考コマンド(再掲)
現在地の確認
Get-AzDisk -Name "<ディスク名>" | Select Name,Location,ResourceGroupName
Get-AzVM -Name "<VM名>" | Select Name,Location,ResourceGroupName
リソース移動(PowerShell / CLI)
Move-AzResource `
-DestinationResourceGroupName "windowsserverupgrades" `
-ResourceId "/subscriptions/<サブスクリプションID>/resourceGroups/<現在のRG>/providers/Microsoft.Compute/disks/<ディスク名>"
az resource move \
--destination-group windowsserverupgrades \
--ids $(az disk show -g <現在のRG> -n <ディスク名> --query id -o tsv)
アタッチ(Portal / PowerShell / CLI)
# Portal: VM > ディスク > 既存ディスクの追加
# PowerShell:
$disk = Get-AzDisk -Name "<ディスク名>" -ResourceGroupName "windowsserverupgrades"
$vm = Get-AzVM -Name "<VM名>" -ResourceGroupName "windowsserverupgrades"
$vm = Add-AzVMDataDisk -VM $vm -Name $disk.Name -ManagedDiskId $disk.Id -Lun 1 -Caching ReadOnly -CreateOption Attach
Update-AzVM -VM $vm -ResourceGroupName "windowsserverupgrades"
# Azure CLI:
az vm disk attach --resource-group windowsserverupgrades --vm-name --name <ディスク名> --lun 1

コメント