Azure を使ってみたメモ。

ユーザー登録

https://azure.microsoft.com/ja-jp/free/
以下のものが必要です。最初に ¥20,500 の体験枠がもらえます。アカウントをアップグレードしないと請求されることはないとのこと。

  • クレジットカード
  • 電話番号

Azure CLI のインストールとログイン

Azure CLI をドキュメントのとおりにインストールします。Mac ならこんな感じ。

$ brew update && brew install azure-cli

Azure CLI でログインします。

$ az login
Note, we have launched a browser for you to login. For old experience with device code, use "az login --use-device-code"
You have logged in. Now let us find all the subscriptions to which you have access...

OAuth を使ってブラウザ経由でログインできます。

ログインに成功すると、ログイン情報が吐かれてログインできたことが分かります。

$ az login
Note, we have launched a browser for you to login. For old experience with device code, use "az login --use-device-code"
You have logged in. Now let us find all the subscriptions to which you have access...
[
  {
    "cloudName": "AzureCloud",
    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "isDefault": true,
    "name": "無料試用版",
    "state": "Enabled",
    "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "user": {
      "name": "user@example.com",
      "type": "user"
    }
  }
]

ロケーション

Azure ではロケーションと呼ばれる地域を指定してリソースを作成するようです。まずロケーションの一覧を取得してみます。緯度経度も表示されてなんか嬉しいですね。

$ az account list-locations
[
  ...
  {
    "displayName": "Japan West",
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/locations/japanwest",
    "latitude": "34.6939",
    "longitude": "135.5022",
    "name": "japanwest",
    "subscriptionId": null
  },
  {
    "displayName": "Japan East",
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/locations/japaneast",
    "latitude": "35.68",
    "longitude": "139.77",
    "name": "japaneast",
    "subscriptionId": null
  },
  ...
]

全部の地域のリストはこちら。

$ az account list-locations | npx jqf 'locations =>
     locations.reduce((prev, { name, displayName }) => ({ ...prev, [name]: displayName }), {})
> '
{
  "eastasia": "East Asia",
  "southeastasia": "Southeast Asia",
  "centralus": "Central US",
  "eastus": "East US",
  "eastus2": "East US 2",
  "westus": "West US",
  "northcentralus": "North Central US",
  "southcentralus": "South Central US",
  "northeurope": "North Europe",
  "westeurope": "West Europe",
  "japanwest": "Japan West",
  "japaneast": "Japan East",
  "brazilsouth": "Brazil South",
  "australiaeast": "Australia East",
  "australiasoutheast": "Australia Southeast",
  "southindia": "South India",
  "centralindia": "Central India",
  "westindia": "West India",
  "canadacentral": "Canada Central",
  "canadaeast": "Canada East",
  "uksouth": "UK South",
  "ukwest": "UK West",
  "westcentralus": "West Central US",
  "westus2": "West US 2",
  "koreacentral": "Korea Central",
  "koreasouth": "Korea South",
  "francecentral": "France Central",
  "francesouth": "France South",
  "australiacentral": "Australia Central",
  "australiacentral2": "Australia Central 2"
}

リソースグループ

ロケーションを指定してリソースグループを作成します。これから作成する仮想マシンなどは、このリソースグループに属するようです。

$ az group create --name azure-tutorial --location japanwest
{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/azure-tutorial",
  "location": "japanwest",
  "managedBy": null,
  "name": "azure-tutorial",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

作ったらリストするコマンドで取得できるか確認してみます。

$ az group list
[
  {
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/azure-tutorial",
    "location": "japanwest",
    "managedBy": null,
    "name": "azure-tutorial",
    "properties": {
      "provisioningState": "Succeeded"
    },
    "tags": null
  }
]

ついでに削除のコマンドも確認してみます。削除には数十秒かかるようです。

$ az group delete --name azure-tutorial --yes
# やや時間がかかる。 - Running.. と表示される
$ az group list
[]

仮想マシンを作成する

リソースグループなどを指定して仮想マシンを作成します。まずは指定可能な仮想マシンのイメージのリストを確認してみます。

$ az vm image list
You are viewing an offline list of images, use --all to retrieve an up-to-date list
[
  ...
  {
    "offer": "UbuntuServer",
    "publisher": "Canonical",
    "sku": "16.04-LTS",
    "urn": "Canonical:UbuntuServer:16.04-LTS:latest",
    "urnAlias": "UbuntuLTS",
    "version": "latest"
  },
  ...
]

ちなみにローカルで取得できる仮想マシンのリストはこんな感じ。 –all オプションで全部のイメージの情報を取得するのはリクエスト時間が長すぎて諦めました。

$ az vm image list | npx jqf 'x => x.map(y => y.offer + " " +  y.sku)'
You are viewing an offline list of images, use --all to retrieve an up-to-date list
[
  "CentOS 7.5",
  "CoreOS Stable",
  "Debian 8",
  "openSUSE-Leap 42.3",
  "RHEL 7-RAW",
  "SLES 12-SP2",
  "UbuntuServer 16.04-LTS",
  "WindowsServer 2019-Datacenter",
  "WindowsServer 2016-Datacenter",
  "WindowsServer 2012-R2-Datacenter",
  "WindowsServer 2012-Datacenter",
  "WindowsServer 2008-R2-SP1"
]

仮想マシンを作成します。SSH 公開鍵についてはここにドキュメントがあります。–generate-ssh-keys オプションを指定すると、 ~/.ssh/id_rsa がない場合は鍵ペアを作るようです。

$ az vm create --resource-group azure-tutorial \
    --name azure-turorial-vm-1 \
    --image UbuntuLTS \
    --generate-ssh-keys \
    --output json \
    --verbose
SSH key files '/Users/kamataryo/.ssh/id_rsa' and '/Users/kamataryo/.ssh/id_rsa.pub' have been generated under ~/.ssh to allow SSH access to the VM. If using machines without permanent storage, back up your keys to a safe location.
Accepted: vm_deploy_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Microsoft.Resources/deployments)
Succeeded: azure-turorial-vm-1PublicIP (Microsoft.Network/publicIPAddresses)
Succeeded: azure-turorial-vm-1VMNic (Microsoft.Network/networkInterfaces)
Succeeded: azure-turorial-vm-1NSG (Microsoft.Network/networkSecurityGroups)
Accepted: azure-turorial-vm-1 (Microsoft.Compute/virtualMachines)
Accepted: azure-turorial-vm-1_OsDisk_1_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Microsoft.Compute/disks)
Accepted: azure-turorial-vm-1 (Microsoft.Compute/virtualMachines)
{
  "fqdns": "",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/azure-tutorial/providers/Microsoft.Compute/virtualMachines/azure-turorial-vm-1",
  "location": "japanwest",
  "macAddress": "xx-xx-xx-xx-xx-xx",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "xx.xx.xx.xx",
  "resourceGroup": "azure-tutorial",
  "zones": ""
}
Suppress exception No module named 'azure.cli.telemetry'

ちなみに SSH キーの形式は RSA しかサポートされていないそうです。

$ az vm create --resource-group azure-tutorial \
    --name azure-turorial-vm-1 \
    --image UbuntuLTS \
    --ssh-key-value "$(cat ~/.ssh/id_ecdsa.pub)" \
    --output json \
    --verbose
Succeeded: azure-turorial-vm-1NSG (Microsoft.Network/networkSecurityGroups)
Accepted: vm_deploy_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Microsoft.Resources/deployments)
Succeeded: azure-turorial-vm-1PublicIP (Microsoft.Network/publicIPAddresses)
Succeeded: azure-turorial-vm-1VMNic (Microsoft.Network/networkInterfaces)
Failed: vm_deploy_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Microsoft.Resources/deployments)
Failed: azure-turorial-vm-1 (Microsoft.Compute/virtualMachines)
Deployment failed. Correlation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. {
  "error": {
    "code": "InvalidParameter",
    "message": "The value of parameter linuxConfiguration.ssh.publicKeys.keyData is invalid.",
    "target": "linuxConfiguration.ssh.publicKeys.keyData"
  }
}
Suppress exception No module named 'azure.cli.telemetry'

publicIpAddress の値を使って SSH してみます。

$ ssh xx.xx.xx.xx
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-1036-azure x86_64)

kamataryo@azure-turorial-vm-1:~$

できました!ユーザーも自分の名前で勝手に作成してくれるようですね。SSH が楽なのでいい感じです!

仮想マシンを削除する

仮想マシンをリストコマンドで確認してから、削除します。

$ az vm list | npx jqf 'x => x.map(y => y.name + ": " + y.id)'
[
  "azure-turorial-vm-1: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/AZURE-TUTORIAL/providers/Microsoft.Compute/virtualMachines/azure-turorial-vm-1"
]
$ az vm delete --resource-group azure-tutorial --name azure-turorial-vm-1 --yes

$ az vm list
[]

まとめ

一度もコンソールを表示させずに、仮想マシンを立ち上げてログインし、削除することができました。やったね!