Managed Diskを暗号化しているVMが起動できなくなった話

# 背景
- 仕事で使っているVMで、平日朝8時に自動起動するようにしている
- 普段通りRDP接続を試みるも接続できない
    - セッションを張ろうとしてタイムアウトする
- PortalからVMの状態を確認 -> Status: Failed
- どうやらEncrypted Data Diskのマウントに失敗している模様
    - 前の週の金曜日まではマウントできていた
- **[Ignite](https://www.microsoft.com/en-us/ignite) 開催中**

MSさん、なんかUpdateしましたね？

# 環境
- Target
    - Azure VM
        - Windows Server 2016 (1607)
        - Managed Disk (OS/Data)
        - Azure Disk Encryption: Enable (OS/Data)
- Client
    - Windows 10 Enterprise (1703)
        - Azure PowerShell (5.6.0)

# トラブルシューティング開始
## ひとまずData DiskをDetach
- Portalにてポチポチ
- もしくはPowerShell

```powershell
$vm = Get-AzureRmVM -ResourceGroupName hogeRG -Name win01
$vm = Remove-AzureRmVMDataDisk -VM $vm -DataDiskNames win01-data
Update-AzureRmVM -ResourceGroupName hogeRG -VM $vm
```

## VMが起動できることを確認
- Portalにてポチポチ
- もしくはPowerShell

```powershell
Start-AzureRmVM -ResourceGroupName hogeRG -Name win01
# $vm | Start-AzureRmVM
# でもできると思う (Portalを開いていたのでPortalから起動した)
```

無事に起動。

## なにも考えずにAttachしてみる
- Portalにてポチポチ
- もしくはPowerShell

```powershell
$disk = Get-AzureRmDisk -ResourceGroupName hogeRG -DiskName win01-data
$vm = Get-AzureRmVM -ResourceGroupName hogeRG -Name win01
$vm = Add-AzureRmVMDataDisk -VM $vm -Caching None -Lun 0 -CreateOption Attach -ManagedDiskId $disk.Id
Update-AzureRmVM -ResourceGroupName hogeRG -VM $vm
```

エラーが返ってくる。

> Disk '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/hogeRG/providers/Microsoft.Compute/disks/win01-data' contains encryption settings and cannot be used as a data disk. In order to use it as a data disk, remove the encryption settings and ensure that the virtual machine’s OS disk has the applicable encryption settings defined.

## Data DiskをAttachできる状態にしてAttachする
正直わけわからん状態だったがPortalをよく見てみると、暗号化が無効のディスクとしてAttachしようとしている様子。

ワークアラウンドとしては以下が思いつく。

1. 暗号化が有効になっているディスクとしてAttachする
2. Diskの暗号化を解除してAttachする

### 1. 暗号化が有効になっているディスクとしてAttachしてみる
MSさん謹製のドキュメントにこんなものがあったので、Data Diskでもできるんじゃね？ってことでやってみた。

> [Azure Disk Encryption に関する付録 - OS ディスクをアタッチするときにシークレット URL を指定する](https://docs.microsoft.com/ja-jp/azure/security/azure-security-disk-encryption-appendix#bkmk_SecretURL)

ここで上げているCmdletが`Set-AzureRmVMOSDisk`なので`Set-AzureRmVMDataDisk`に置き換えてみる。

```powershell
PS > Set-AzureRmVMDataDisk -VM
VM                   DiskSizeInGB         Verbose              InformationAction    OutVariable
Name                 StorageAccountType   Debug                ErrorVariable        OutBuffer
Lun                  WriteAccelerator     ErrorAction          WarningVariable      PipelineVariable
Caching              DefaultProfile       WarningAction        InformationVariable
```

`Set-AzureRmVMOSDisk`にあった`DiskEncryptionKeyVaultId`オプションや`DiskEncryptionKeyUrl`オプションがない。

つまりこのCmdletではできない。

`Add-AzureRmVMDataDisk`を見てもそれらしいオプションは存在しない。

よってこの方法ではAttachできない。

### 2. Diskの暗号化を解除してAttachする
Diskの暗号化をしたときはVMにAttachした状態でやったので、Disk単体で解除なんてできるのか？と不安だったができた。

PortalではできないのでPowerShellにて。
使うCmdletは以下。

> [New-AzureRmDiskUpdateConfig](https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/new-azurermdiskupdateconfig?view=azurermps-6.9.0)

Exampleでは、`EncryptionSettingsEnabled`オプションを有効にしているが、ここでは無効にする。

```powershell
$diskupdateconfig = New-AzureRmDiskUpdateConfig -EncryptionSettingsEnabled $false
Update-AzureRmDisk -ResourceGroupName hogeRG -DiskName win01-data -DiskUpdate $diskupdateconfig
```

無効になっていることを確認する。

```powershell
(Get-AzureRmDisk -ResourceGroupName hogeRG -DiskName win01-data).EncryptionSettings

Enabled DiskEncryptionKey KeyEncryptionKey
------- ----------------- ----------------
  False
```

やったぜ。
早速Attachしてみる。

```powershell
$vm = Get-AzureRmVM -ResourceGroupName hogeRG -Name win01
$vm = Add-AzureRmVMDataDisk -VM $vm -Caching None -Lun 0 -CreateOption Attach -ManagedDiskId $disk.Id
Update-AzureRmVM -ResourceGroupName hogeRG -VM $vm

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

ぱんぱかぱーん！
OSからも認識していることを確認！

# まとめ
AzureはやっぱりPowerShellに限る。
あとMSさん、"さいれんとあっぷでーと"は勘弁して...。

また同じことが起こったら面倒だから、暗号化解除しておこうかしら...。
Security Centerで怒られるけど...。