Arm ベースのプロセッサを搭載した新しい Azure 仮想マシンを試してみた

## 背景と目的

Arm ベースのプロセッサを搭載した新しい Azure 仮想マシンが GA したので、早速試してみました。最初に展開された 10 リージョンに日本のリージョンは含まれていないようです。また、価格に関しては East US で同じようなスペックの Intel の Standard_D2_v5 と Arm の Standard_D2ps_v5 を比較してみたところ、前者が約 70 ドル、後者が約 56 ドルなので、Arm は Inetl と比較して約 20% 安い計算になるようです。

## 検証用の Arm ベース仮想マシンを作成

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

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

# VM イメージを探します
az vm image list \
  --offer ubuntu \
  --architecture arm64 \
  --publisher canonical \
  --sku 22_04-lts-arm64 \
  --all \
  --output table

Architecture    Offer                         Publisher    Sku              Urn                                                                     Version
--------------  ----------------------------  -----------  ---------------  ----------------------------------------------------------------------  ---------------
Arm64           0001-com-ubuntu-server-jammy  Canonical    22_04-lts-arm64  Canonical:0001-com-ubuntu-server-jammy:22_04-lts-arm64:22.04.202206220  22.04.202206220
Arm64           0001-com-ubuntu-server-jammy  Canonical    22_04-lts-arm64  Canonical:0001-com-ubuntu-server-jammy:22_04-lts-arm64:22.04.202207060  22.04.202207060
Arm64           0001-com-ubuntu-server-jammy  Canonical    22_04-lts-arm64  Canonical:0001-com-ubuntu-server-jammy:22_04-lts-arm64:22.04.202207121  22.04.202207121
Arm64           0001-com-ubuntu-server-jammy  Canonical    22_04-lts-arm64  Canonical:0001-com-ubuntu-server-jammy:22_04-lts-arm64:22.04.202208100  22.04.202208100

# 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 Canonical:0001-com-ubuntu-server-jammy:22_04-lts-arm64:22.04.202208100 \
  --size Standard_D2ps_v5 \
  --admin-username azureuser \
  --ssh-key-value ${prefix}.pub \
  --nsg-rule NONE \
  --public-ip-address-dns-name ${prefix} \
  --storage-sku Standard_LRS

# 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
```

## Arm ベースの Ubuntu を触ってみる

```bash:bash
# OS 情報を確認します
$ uname -a
Linux mnrarmvm-vm 5.15.0-1017-azure #20-Ubuntu SMP Fri Aug 5 12:03:57 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

# Azure Linux エージェント（waagent）を確認します
$ ps aux | grep waagent
root         721  0.0  0.2  32032 23696 ?        Ss   23:04   0:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
azureus+    1651  0.0  0.0   6420  1844 pts/0    S+   23:11   0:00 grep --color=auto waagent

# .NET 6 SDK をインストールしてみます（そんなパッケージは無いようです）
$ sudo apt-get update && \
  sudo apt-get install -y dotnet6

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package dotnet6

# 手動で .NET 6 SDK をインストールします
wget https://download.visualstudio.microsoft.com/download/pr/901f7928-5479-4d32-a9e5-ba66162ca0e4/d00b935ec4dc79a27f5bde00712ed3d7/dotnet-sdk-6.0.400-linux-arm64.tar.gz
mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-6.0.400-linux-arm64.tar.gz -C $HOME/dotnet
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

# .NET 6 の情報を表示します
$ dotnet --info
.NET SDK (reflecting any global.json):
 Version:   6.0.400
 Commit:    7771abd614

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  22.04
 OS Platform: Linux
 RID:         ubuntu.22.04-arm64
 Base Path:   /home/azureuser/dotnet/sdk/6.0.400/

global.json file:
  Not found

Host:
  Version:      6.0.8
  Architecture: arm64
  Commit:       55fb7ef977

.NET SDKs installed:
  6.0.400 [/home/azureuser/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.8 [/home/azureuser/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.8 [/home/azureuser/dotnet/shared/Microsoft.NETCore.App]

Download .NET:
  https://aka.ms/dotnet-download

Learn about .NET Runtimes and SDKs:
  https://aka.ms/dotnet/runtimes-sdk-info

# 仮想マシンから抜けます
exit
```

## 検証環境を削除

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

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

## 参考

https://azure.microsoft.com/ja-jp/updates/generally-available-new-azure-virtual-machines-with-ampere-altra-armbased-processors/

https://azure.microsoft.com/en-us/blog/azure-virtual-machines-with-ampere-altra-arm-based-processors-generally-available/

https://docs.microsoft.com/ja-jp/cli/azure/vm/image?view=azure-cli-latest#az-vm-image-list

https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0