リリース前の Ubuntu 22.04 イメージを Azure に持ち込み VM 作成までやってみた

## 背景と目的

Azure のイメージギャラリーで提供されていない OS イメージや、提供されていても有料だったり、オンプレで動かしているアプリ込みの OS を丸ごとカスタムイメージにしたい場合など、何かしら Azure に OS イメージを持ち込みたいケースがあると思います。今回は、リリース前の Ubuntu 22.04 を検証する目的で、Canonical が用意しているデイリービルドの Azure 用 VHD を利用して、Azure VM 作成まで試してみました。

## 前提条件

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

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.2.1
BuildVersion:   21D62

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

## Ubuntu 22.04 の OS イメージをダウンロード

<https://cloud-images.ubuntu.com/jammy/20220204/>

```bash:bash
wget https://cloud-images.ubuntu.com/jammy/20220204/jammy-server-cloudimg-amd64-azure.vhd.zip

unzip jammy-server-cloudimg-amd64-azure.vhd.zip

ls -lh livecd.ubuntu-cpc.azure.vhd
```

## ストレージアカウントに VHD をアップロード

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

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

# ストレージアカウントを作成します
az storage account create \
  --name ${prefix} \
  --resource-group ${prefix}-rg \
  --sku Standard_LRS

# ストレージアカウントにストレージ BLOB データ共同作成者ロールを自分自身に割り当てます
az ad signed-in-user show \
  --query objectId \
  --output tsv \
  | az role assignment create \
  --role "Storage Blob Data Contributor" \
  --assignee @- \
  --scope $(az storage account show \
  --name ${prefix} \
  --resource-group ${prefix}-rg \
  --query id \
  --output tsv)

# コンテナを作成します
az storage container create \
  --account-name ${prefix} \
  --name disks \
  --auth-mode login

# VHD をアップロードします
az storage blob upload \
  --account-name ${prefix} \
  --container-name disks \
  --name livecd.ubuntu-cpc.azure.vhd \
  --file livecd.ubuntu-cpc.azure.vhd \
  --auth-mode login
```

## 検証用の仮想マシンを作る

```bash:bash
# ストレージアカウントにアップロードした VHD から管理ディスクを作成します
az disk create \
  --resource-group ${prefix}-rg \
  --name ubuntu2202-0204 \
  --sku Standard_LRS \
  --source https://${prefix}.blob.core.windows.net/disks/livecd.ubuntu-cpc.azure.vhd

# 管理ディスクから OS イメージを作成します
az image create \
  --resource-group ${prefix}-rg \
  --name ubuntu2202-0204 \
  --os-type Linux \
  --source ubuntu2202-0204

# SSH キーペアをファイル名を指定して作成します
ssh-keygen -m PEM -t rsa -b 4096 \
  -f ${prefix}

# 検証用の仮想マシンを作成します
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image ubuntu2202-0204 \
  --size Standard_B1ls \
  --admin-username azureuser \
  --ssh-key-value ${prefix}.pub \
  --nsg-rule NONE \
  --public-ip-address-dns-name ${prefix}

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

# 仮想マシンに SSH 接続します
ssh -i ${prefix} azureuser@${prefix}.$region.cloudapp.azure.com

# OS 情報を表示します
$ cat /etc/os-release 
PRETTY_NAME="Ubuntu Jammy Jellyfish (development branch)"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

## 参考

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

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

# 作成した SSH キーペアを削除します
rm -f ${prefix}*

# ダウンロードした Ubuntu を削除します
rm -f jammy-server-cloudimg-amd64-azure.vhd.zip livecd.ubuntu-cpc.azure.vhd
```

<https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/create-upload-ubuntu>

<https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-cli>