エフェメラル OS ディスクの Azure VM を作ってみた

## 背景と目的

エフェメラルディスクは、VM が起動する物理マシン上に割り当てたディスク領域で、VM に障害があって別の物理マシンに移動してしまったり VM を割り当て解除すると、物理マシン上に割り当てたディスク領域が使用出来なくなります。

エフェメラル OS ディスクは、OS がエフェメラルディスクという事で、ディスク利用料金がディスクを Azure Storage に保存しないので無料であったり、リモートの Azure Storage にアクセスしない分、ローカル物理マシン上にディスクがあるので高速、といったメリットがあります。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.0.1
BuildVersion:   21A559

$ az version
{
  "azure-cli": "2.29.1",
  "azure-cli-core": "2.29.1",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## エフェメラル OS ディスクの Azure VM を作る

```bash
# 環境変数をセットします
region=japaneast
prefix=mnredv

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# VNET を作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --address-prefixes 10.1.0.0/16 \
  --subnet-name default-subnet \
  --subnet-prefix 10.1.0.0/24

# NSG を作成します
az network nsg create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-nsg

# NSG に自身のパブリック IP から SSH 接続出来るようにします
az network nsg rule create \
    --resource-group ${prefix}-rg \
    --name Allow-SSH \
    --nsg-name ${prefix}-nsg \
    --priority 100 \
    --source-address-prefixes $(curl -s inet-ip.info) \
    --destination-port-ranges 22 \
    --access Allow \
    --protocol Tcp

# NSG をサブネットに登録します
az network vnet subnet update \
  --resource-group ${prefix}-rg \
  --vnet-name ${prefix}-vnet \
  --name default-subnet \
  --network-security-group ${prefix}-nsg

# VM のパスワードを生成します
vmpass=$(openssl rand -base64 8)
echo $vmpass

# VM を作成します
# --ephemeral-os-disk を true
# --os-disk-caching を ReadOnly
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --ephemeral-os-disk true \
  --os-disk-caching ReadOnly \
  --image CentOS \
  --size Standard_F2s_v2 \
  --admin-username azureuser \
  --admin-password $vmpass \
  --vnet-name ${prefix}-vnet \
  --subnet default-subnet \
  --nsg "" \
  --storage-sku Standard_LRS

# VM に SSH 接続します
ssh azureuser@$(az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-detail \
  --query publicIps \
  --output tsv)

# パーティションとサイズを確認します
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda2         30G  1.2G   29G    5% /
devtmpfs         2.0G     0  2.0G    0% /dev
tmpfs            2.0G     0  2.0G    0% /dev/shm
tmpfs            2.0G  9.0M  2.0G    1% /run
tmpfs            2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/sda1        497M   81M  417M   17% /boot
/dev/sdb1         16G   45M   15G    1% /mnt/resource
tmpfs            396M     0  396M    0% /run/user/1000

# sda2 と sdb1 のパーティションに書き込んでみる
$ date > date.txt
$ cat date.txt 
2021年 10月 31日 日曜日 01:38:50 UTC
$ date | sudo tee /mnt/resource/date.txt
$ cat /mnt/resource/date.txt 
2021年 10月 31日 日曜日 01:39:53 UTC

# VM から抜けます
$ exit
```

## VM の割り当て解除をやってみる

エフェメラル OS ディスクの VM は割り当て解除出来ない、とエラーメッセージが表示されました。

```bash
# VM を割り当て解除します
az vm deallocate \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm

(OperationNotAllowed) Operation 'deallocate' is not supported for VMs or VM Scale Set instances using an ephemeral OS disk.
```

## VM の停止と起動をやってみる

停止してもローカル物理マシン上のディスク領域は確保されていました。

```bash
# VM を停止します
az vm stop \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm

# VM を起動します
az vm start \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm

# VM に SSH 接続します
ssh azureuser@$(az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-detail \
  --query publicIps \
  --output tsv)

# 停止前に作成したファイルを確認します
$ cat date.txt 
2021年 10月 31日 日曜日 01:38:50 UTC
$ cat /mnt/resource/date.txt 
2021年 10月 31日 日曜日 01:39:53 UTC

# VM から抜けます
$ exit

# VM を削除します
az vm delete \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm
```

## 参考

作成したリソースを削除します。

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg
```

下記は、参考サイトです。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/ephemeral-os-disks

https://docs.microsoft.com/ja-jp/azure/virtual-machines/fsv2-series