Azure上のVMをHyper-V上でOSインプレースアップグレードした話

Azure上のWS2012のVMをHyper-V上に持ちこんでOSインプレースアップグレードしました。
またやることがあるのかは分からないけど、とりあえず備忘録。


# はじめに
### Hyper-V上でOSインプレースアップグレードを実施した経緯
少し前からAzure上のVMのOSインプレースアップグレードはサポートされるようになったので、
ただ単にAzure上で作ったVMのOSインプレースアップグレードを実施するのであれば、以下URLに記載されている手順でインプレースアップグレード用のメディア（ディスク）を作成して、<br>Azure VMにアタッチしてあげればAzure上でOSインプレースアップグレードが実施できるので、わざわざHyper-V上にVMを持ちこむ必要はありません。

[Azure で Windows Server を実行している VM のインプレース アップグレード](https://learn.microsoft.com/ja-jp/azure/virtual-machines/windows-in-place-upgrade)
<br>
しかし！！！！！
上記方法では**英語版のインプレースアップグレード用のメディア**しか作成できません。
Azureのマーケットプレイス経由でVMを作成した場合、日本語で使う場合でも英語版VMに日本語パックを適用して使うことがほとんどなので、<br>通常であれば、英語版のOSインプレースアップグレード用メディアがあれば問題ないのですが、

今回インプレースアップグレードを実施したVMは、元々オンプレミスで日本語版のWindowsメディアを利用して作成されたVM（後にAzure MigrateでAzure上に移行）だったため、<br>OSインプレースアップグレードには日本語版のインプレースアップグレード用メディアが必要になり、上記の方法ではできないという事態に。。。orz。。。

というわけで、最初から日本語で作られたAzure VMのインプレースアップグレードを実施したいって場合は注意が必要です！

### 事前準備
* アップグレード対象のVM（今回はWindows Server 2012の仮想マシン）
    * VMにアタッチしているディスクをそのままHyper-Vにアップロードする場合、アップロード中はVMを停止する必要があるので、<br>VMを停止できない場合は、事前にAzure Backup等のバックアップデータからデータをリストアするなどでHyper-Vに持ち込む用のディスクを用意しておく必要があります。
 * Hyepr-V環境の構築
    * 今回はAzure上にDシリーズのWS2019のVMを1台立てて、Hyper-Vをインストールしました。
    * アップグレードするVMのディスクが格納できるサイズのディスクをアタッチしておく（もしくはCドライブを拡張しておく）必要があります。
 * アップグレードに利用するOSメディア
    * 今回はWS2012→2019へのアップグレードだったため、WS2012→2016→2019の2段階でアップグレードが必要でした。この場合は、WS2016と2019の両方のメディアが必要です。
* Azure PowerShellのインストール（Hyper-Vが構築されている環境に）
    * Hyper-V上がインストールされているVMとAzure間でディスクのダウンロード/アップロードをする際に使いました。
    * Azure PowerShellのインストール手順は[こちら](https://learn.microsoft.com/ja-jp/powershell/azure/install-azps-windows?view=azps-10.4.1&tabs=powershell&pivots=windows-psgallery)。

# 実施手順
## Hyper-V上にアップグレード対象のVMの作成
1. Hyper-Vに持ち込むディスクの準備。<br>今回はAzure Backupで取得したバックアップデータからディスクリストアしてアップグレード作業を実施するディスクを作成しました。<br>既存VMのディスクを直接Hyper-V上にアップロードしてアップグレードすることもできますが、その場合はVMの停止が必要です。<br>（何かあったときにやり直しができないので、個人的には直接アップロードはおすすめしません。）
   <br>　
1. Hyper-Vにディスクのアップロード。<br>Hyper-Vを構築したVMからAzure PowerShellを起動し、1.のディスクのダウンロードを実施します。　
    ```powershell
    # Hyper-V用のVMからAzure環境への接続
    Connect-AzAccount

    # SASの作成
    $diskSas = Grant-AzDiskAccess -ResourceGroupName "<1.のディスクが存在しているリソースグループ名>" -DiskName "<1.のディスク名>" -DurationInSecond 86400 -Access 'Read'

    # ダウンロード先を指定してダウンロード実行
    $localFolder = "<ダウンロード先>"
    $blob = Get-AzStorageBlobContent -Uri $diskSas.AccessSAS -Destination $localFolder -Force

    # ダウンロード完了後、指定したダウンロード先にvhdファイルがダウンロードされることを確認（"abcd"というファイル名になるため、拡張子「vhd」をつけて任意の名前に変更する）
    # 元ディスクのサイズにも依存しますが、256GBのディスクのダウンロード完了までの所要時間は1~2時間程度。

    # SASの削除
    Revoke-AzDiskAccess -ResourceGroupName "<1.のディスクが存在しているリソースグループ名>" - DiskName "<1.のディスク名>"
    ```
    アップロード完了後は、指定したダウンロード先に「abcd」というファイルが作成されるので、<br>任意の名前に変更してください。（拡張子に「.vhd」をつけるのを忘れずに。）
    ![SnapCrab_No-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/7af9c141-7b0d-0da1-daae-d4268c5f85fb.jpeg)
    <br>
    
    ちなみにHyper-VがインストールされているVMからAzure Portalにログインして、Azure Portalの画面でダウンロードすることも可能ですが、<br>こちらはダウンロード先が指定できないので、C:¥配下のダウンロードフォルダにアップロードされます。　
![SnapCrab_No-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/ab580f2c-2cf3-ea62-4977-e105a5ae450e.jpeg)

    <br>

 3. アップロードしたVHDファイルからHyper-V上にVMを作成。
   Hyper-Vを起動して[新規]-[仮想マシン]からVMを構築します。
   VM構築のウィザードは、基本的にはデフォルト値で問題ないです。
   仮想ハードディスクの接続のみ、2.でアップロードしたVHDファイルを指定してください。
   ![SnapCrab_No-0013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/76a55398-a0b8-2ef1-0e28-661cffef4080.jpeg)

   作成したVMが起動できれば準備完了！
![SnapCrab_No-0004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/d1716db7-40f7-3135-5092-98ee5d80b4ea.jpeg)


## OSインプレースアップグレードの実施
Hyper-V上に持ちこんだディスクでOSインプレースアップグレードを実施します。
メディアのマウントができれば、後はウィザードに沿って進めれば良いです。
<br>
アップグレード前後のバージョンによって必要な手順が違うので、詳細は[こちら](https://learn.microsoft.com/ja-jp/windows-server/get-started/upgrade-overview#which-version-of-windows-server-should-i-upgrade-to)参照。
（今回はWS2012→2019へのアップグレードだったので2012→2016→2019の2段階でアップグレードを実施）
<br>
Hyper-V上へのメディアのマウントは、画面上部の「メディア」から「DVDドライブ」-「ディスクの挿入」の順番で可能です。
（Hyper-V操作するの久々過ぎて無駄に時間を費やした。。。）
![SnapCrab_No-0005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/3e3a9d66-0980-e6c7-e803-41b18df26eef.jpeg)

<br>
「更新プログラムをダウンロードしてインストールする（推奨）」を選択。

![SnapCrab_No-0008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/9a53d4de-2b45-bacd-ece1-27403768aea1.jpeg)

<br>
「Windows Server 2016 DataCenter（デスクトップエクスペリエンス）」を選択。

![SnapCrab_No-0009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/d940c3d3-f167-68be-e32e-722f0c6b2007.jpeg)

<br>
「個人用ファイルとアプリを引き継ぐ」を選択。

![SnapCrab_No-0010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/84e918dd-aa2a-961c-79ca-6c09ccb102f1.jpeg)

<br>
「確認」をクリック。

![SnapCrab_No-0011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/cabe9752-41f1-5bd6-a2a3-3cd3a35b77a4.jpeg)

ここで警告が出力された場合は、指示に従ってください。
実際に警告が出力された際は、WS2016には存在してない役割があるからアンインストールしてください。という内容だったので役割をアンインストールしました。
<br>
上記以外にもウィザード画面はありますが、選択肢ないものがほとんどなので、読んで進めます。
<br>
ウィザードが終わったらインプレースアップグレードが開始されるので、後は待つだけ。
（所要時間は1~2時間程度）
<br>
複数回再起動されて、アップグレード後のバージョンでログイン画面が表示されれば完了です！
![SnapCrab_No-0012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/ff1688c3-b13a-e489-fc85-261f4b8f10d3.jpeg)

<br>
※2回アップグレードが必要な場合（WS2012→2016→2019など）は、メディアを変えて同手順でアップグレード作業を実施します。

## アップグレードしたディスクをAzure上にアップロード 
Hyper-V上でアップグレードしたディスクをAzure上に戻します。
Hyper-V上にアップロードしたときと同様、Hyper-VがインストールされているVMからAzure Powershellに接続。

``` powershell
# Hyper-V用のVMからAzure環境への接続
Connect-AzAccount
# 情報の指定
$path = "<アップロードしたディスク(vhd）のフルパス>"
$resourceGroup = "<アップロード先のリソースグループ名>"
$location = "japaneast"  # リージョンの指定
$name = "<アップロード後のマネージドディスク名>"
$sku = "StandardSSD_LRS" # 作成するマネージドディスクのSKU

# VHDのアップロード＋マネージドディスク作成実行
Add-AzVhd -LocalFilePath $path -ResourceGroupName $resourceGroup -Location $location -DiskName $name -DiskSKU $sku
```

コマンド実行後、指定したリソースグループに指定した名前のマネージドディスクが作成されていればOKです。
※所要時間は256GBのディスクで2時間程度。
![SnapCrab_No-0007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/c75b3699-bdd4-71eb-ea46-4fd6113925cb.jpeg)


## アップグレード済みのディスクからVM作成
アップロードしたディスクからVMを作成します。
前手順完了時点でマネージドディスクが作成されているので、新規VMを作るでも良いし、
既存VMのディスクを置換すれば、既存VMのインプレースアップグレードを実施したことにもなります。
（既存VMのディスクを置換する場合は、最初にHyper-V上にアップロードした時点に戻ってしまうのでご注意を。）

***
以上です。
OSインプレースアップグレード後、アップグレード前に反映されていた設定が一部反映されていなかったり、<br>不明なイベントログが出力されていたりしますが、特に大きな問題は発生していない模様。。。
（WS2012と2019だと、使えるサービスや設定箇所も一部違っていたりするのであるあるなのかな。）
<br>
とりあえず無事に終わって良かったー！！！！
（OSインプレースアップグレード自体が初だったので、作業終わるまでずっとドキドキしてましたｗ）