Azure VMのDiskを取り換える方法（非管理ディスク間)

タイトルの通り、AzureVMを使用してDiskの取り換え方法を記載します。
管理ディスクだと簡単にできますが、非管理ディスク通しは[Powershell]で行います。

---
###<font color="Red">■環境</font>

| 1 | 2 | 3 |
|:-:|:-:|:-:|
| リソースグループ  | wsrg  | wsrg-2  |
| 仮想マシン   | Source-nomanage  | target-nomanage  |
| ディスクタイプ  | 非管理ディスク  | 非管理ディスク  |
| ストレージアカウント  | wsrgwstoacc2  | wsrg2disks149  |
| OSdisk  | sorce-nomanage<...>.vhd  | target-nomanage<...>.vhd  |

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/2c870570-33b6-1f4d-febb-7ff448e3171a.png" width=60%>

###<font color="Red">■今回やること</font>
　[ストレージアカウント:wsrgwstoacc2]内の[Source-nomanageのOSDISK]を[Target-nomage-nomanageのOSDISK]に取り換える
　元々存在しているOSDiskは破棄する

###<font color="Red">■今回の使用する物</font>
・AzurePowershell　：　AzureのPowershell（作業マシンにMSIをインストール）
・azcopy : OSディスクを取り換える際に使用する。Azureコマンド（作業マシンにMSIをインストール）
・ストレージアカウント　：　非管理ディスクが内蔵されているストレージ（ほかにも用途はある）
・OSdisk　：　マシン作成時に作成されるディスク領域（WindowsでいうCドライブ）

###<font color="Red">■ざっくりしたやり方</font>
１．作業マシンにAzurePowerShellとazcopyをインストール
２．AzurePowershellからコマンド操作しストレージアカウント内のVHDをコピー
３．ターゲットマシンのVHDをコピーしたVHDに置き換える
４．VMの構成情報を更新しVHDを置き換える

---

###<font color="Red">【■１．作業マシンにAzurePowerShellとazcopyをインストール】</font>

１－１．作業マシンでPowerShell起動（外部につながることが条件です）
１－２．以下コマンドを実行し[Azure PowerShell]をインストール

◆使用コマンド◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

<font color="Maroon">**Get-Module powershellget -List | select-object Name,Version,path**</font>
 ⇒[PowerShellGet]のモジュールが導入されているか確認する

<font color="Maroon">**install-module AzureRM**</font>
 ⇒[AzurePowershell]のモジュールを導入

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

```ruby:実行結果
PS C:\Users\hoge> Get-Module powershellget -List | select-object Name,Version,path

Name          Version Path
----          ------- ----
PowerShellGet 1.0.0.1 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PowerShellGet.psd1


PS C:\Users\hoge> Install-Module AzureRM

続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\hoge\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): A
PS C:\Users\hoge>
```

１－３．以下コマンドを実行し[Azure PowerShell]のインストール確認とログインする

◆使用コマンド◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<font color="Maroon">**Login-AzAccount**</font>
⇒[Azure Portal]へのログイン
　※以下の画面よりAzureへログインする。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/92346962-61c2-5202-2ca6-db6361a897a9.png" width=60%>

```ruby:実行結果
PS C:\Users\hoge> Login-AzAccount

Account          : <Azure Account>
SubscriptionName : <サブスクリプション>
SubscriptionId   : <サブスクリプション>
TenantId         : <テナントID>
Environment      : <Environment>

PS C:\Users\hoge>

```

###<font color="Red">【■２．AzurePowershellからコマンド操作しストレージアカウント内のVHDをコピー】</font>

２－１．以下の情報をそれぞれのストレージアカウントから取得

| No | 情報項目 | 内容 |
|:-:|:-:|:-:|
| 1  | ソースコンテナ  | ソースVHDが存在しているコンテナのURL  |
| 2  | コピー先コンテナ  | コピー先のコンテナのURL  |
| 3  | ソースコンテナアクセスキー  | コンテナにアクセスするためのキー  |
| 4  | コピー先コンテナアクセスキー  | コンテナにアクセスするためのキー  |
| 5  | ソースVHD  | ソースVHDの名前  |

---

上記の表に記載されたそれぞれの情報の取得方法を記載。

<font color="Blue">---------コンテナ情報の取得方法---------</font>

1.[Azure Portal]からソースのストレージアカウントを選択
※ソースストレージアカウント　：　wsrgwstoacc2
※コピー先ストレージアカウント：　wsrg2disks149

2.[blob]タイルをクリック

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/ed025042-5a20-3aaf-32d9-639a8f8c8a42.png" width=60%>

3.[vhds] <コンテナ>を右クリックし[コンテナのプロパティ]を選択
4.[URL]をコピーする
※テキストなどに貼り付けとく

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/b53e0cd8-3c08-c34f-02f4-a82211affae5.png" width=60%>

<font color="Blue">---------コンテナアクセスキーの取得方法---------</font>

1.[Azure Portal]からソースのストレージアカウントを選択
※ソースストレージアカウント　：　wsrgwstoacc2
※コピー先ストレージアカウント：　wsrg2disks149

2.[アクセスキー]をクリック
3.[Key1]をコピーする
※テキストなどに貼り付けとく

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/f7ec7920-6666-afdc-91b1-7afb1492cde3.png" width=60%>

<font color="Blue">---------VHDファイルの取得方法---------</font>

1.[Azure Portal]からソースのストレージアカウントを選択
※ソースストレージアカウント　：　wsrgwstoacc2
※コピー先ストレージアカウント：　wsrg2disks149

2.[blob]タイルをクリック
3.[vhds] <コンテナ>をクリック
※VHDが存在しているコンテナをクリックする。
（ストレージアカウントの使用状況によりコンテナの配置も変わります）
4.表示されたコンテナよりソースVHDを右クリックし[BLOBのプロパティ]を選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/329fdb19-e44b-5aef-d894-2003f37dd7ef.png" width=60%>

5.表示された画面より名前をコピー

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/7590800d-a6fb-7922-21f9-825e77fb18b6.png" width=60%>

---

２－２.以下のURL より[MicrosoftAzureStorageTools.msi]をダウンロードしインストール
ダウンロード先　：　http://aka.ms/downloadazcopy
※デフォルト設定でインストールする

２－３.ソースの仮想マシン(sorce-nomanage)を仮想マシンごと停止する（Diskの割り当てを解除）

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/0c86e633-f239-e77d-7cd0-ac872854e8d0.png" width=60%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/f2782432-3c2e-a29c-3045-2a21e197a92b.png" width=60%>


２－４.以下コマンドを実行し、VHDコピーを開始する

◆使用コマンド◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

<font color="Maroon">**>cd** **"C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy"**</font>
<font color="Maroon">**>AzCopy.exe source:****｢ソースコンテナ｣** **dest:｢コピー先コンテナ｣** **/SourceKey:｢ソースコンテナアクセスキー｣** **/destKey:｢コピー先コンテナアクセスキー｣** **/pattern:"｢ソースVHD｣"**</font>
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

```ruby:実行結果
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy> .\AzCopy.exe /source:https://wsrgwstoacc2.blob.core.windows.net/v
hds /dest:https://wsrg2disks149.blob.core.windows.net/vhds /SourceKey:<Key>
SL9PeAB8BNNhtO4eofnKKDCETLgItu4XdoPg== /destKey:<Key> /pattern:"sorce-nomanage20180207132237.vhd"
Finished 1 of total 1 file(s).
[2018/02/07 07:19:38] Transfer summary:
-----------------
Total files transferred: 1
Transfer successfully:   1
Transfer skipped:        0
Transfer failed:         0
Elapsed time:            00.00:09:01
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy>

```

###<font color="Red">【■３．ターゲットマシンのVHDをコピーしたVHDに置き換える】</font>

３－１．ターゲットマシンのストレージアカウントのコンテナ（wsrg2disks149/vhds/）に前手順でコピーした[VHD]が存在しているか確認する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/0b53dbf8-ea5c-1fcd-03d2-7338eddb2876.png" width=60%>

３－２．コピーした｢ソースVHD｣を右クリックし｢blobのプロパティ｣を選択
３－３．｢URL｣をコピーする
※テキスト等にコピー

<img src="https://qiita-image-store.s3.amazonaws.com/0/150678/f8d864b4-9db4-0b17-7902-4788ff4d3878.png" width=60%>

３－４．｢PowerShell｣で以下のコマンドを実行。
※本手順にて｢target-nomanage｣のOSDisk情報を書き換えますが、現時点ではまだ設定は反映されていません。

◆使用コマンド◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

<font color="Maroon">**>$RG** **=** **<ターゲットマシンのリソースグループ(wsrg-2)>**</font>
<font color="Maroon">**>$VMN** **=** **<ターゲットの仮想マシン名(target-nomanage)>**</font>
⇒ターゲットマシンの情報を変数に格納。この手順で格納した変数情報は以後も使用するのでPowerShellは閉じないこと

<font color="Maroon">**>$VM** **=** **Get-AzureRmVM** **-Name** **$VMN** **-ResourceGroupName** **$RG**</font>
 ⇒指定したVMの情報を読み込み変数＄VMに格納する

<font color="Maroon">**>$VM.StorageProfile.OsDisk.Vhd.Uri** **=** **'<入れ替えるVHDのURL(手順｢３－３｣でコピーした情報)>'**</font>
⇒変数＄VM情報のOSDISK情報を入れ替えるVHDのURLに置き換える

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

```ruby:実行結果
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy> $RG = "wsrg-2"
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy> $VMN = "target-nomanage"
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy> $VM = Get-AzureRmVM -Name $VMN -ResourceGroupName $RG
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy> $VM.StorageProfile.OsDisk.Vhd.Uri = 'https://wsrg2disks149.blob.c
ore.windows.net/vhds/sorce-nomanage20180207132237.vhd'
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy>
```

【４．VMの構成情報を更新しVHDを置き換える】

４－１．ターゲットの仮想マシン(target-nomanage)のDisk情報（事前）を確認する（現時点では構成情報は変更前の状態）
　　　・仮想マシンを選択し[ディスク]を選択
　　　・表示されている｢OSdisk｣をクリック

![DC10.png](https://qiita-image-store.s3.amazonaws.com/0/150678/6d402164-13d1-123b-e78c-0d532d8d22d1.png)

４－２．以下のコマンドを実行し、VM情報を更新する

◆使用コマンド◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

<font color="Maroon">**>Update-AzureRmVM** **-VM** **$VM** **-ResourceGroupName** **$rg**</font>
⇒VMの構成情報を更新し設定を変更する。
⇒コマンド終了まで５～１０分程度はかかる。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

```ruby:実行結果
PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy> Update-AzureRmVM -VM $VM -ResourceGroupName $RG

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK


PS C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy>
```

４－３．｢４－１｣をもう一度実行し設定情報が変更されていることを確認し、VMを起動させる。

![DC11.png](https://qiita-image-store.s3.amazonaws.com/0/150678/3158a13e-9365-b152-456e-5c2c3d5ee9d9.png)

---

###<font color="Red">■変更後注意事項</font>
・ホストネームに関して[source-nomage]になっているので適宜変更する。
・IP等に関するところは確認しておく。（ソースマシンの状態になっている為）

---

###<font color="Red">■はまった点</font>
　躓いたのはコピー前にVMを停止していない場合、azcopy実行時にエラーが出ます。その場合VMを停止し再実行になるのですが、以下のパスに処理情報が残っているため停止してもコマンドは失敗します。
　[azcopy]実行時以下のエラーが出た場合はファイルの削除が必要です。（なんかオプションがあるみたいですが、筆者は強引にファイル削除して再実行しました。）

エラー： Copy status: Failed; Description: 409 SystemInUse "Copy failed when reading the source.".

確認ポイント１
　・ソースマシンの停止（Diskの割り当てが解除されているか）

確認ポイント２
　・｢AzCopy.jnl｣､｢AzCopyCheckpoint.jnl｣の削除
　パス　：　<実行ユーザホームディレクトリ>AppData\Local\Microsoft\Azure\AzCopy

---

###<font color="Red">■最後</font>
 筆者環境では｢Azure Site Recovery｣を使用するため｢非管理ディスク｣で運用しています。なので今回｢非管理ディスク｣でのディスクとっかえをやりました。やり方を調べてた時に一連の通しが乗ったサイトがなかったので記事にしました！

---