Azure CLI 2.0 で仮想マシンの作成と削除と再構成
概要
2017/4に Azure CLI 2.0 がリリースされていたようで、 これを使って仮想マシンの作成と削除と再構成をしてみた。 管理ディスクを使っている場合と非管理ディスクを使っている場合の両方で試した。
今回はすべての部品を一つ一つ作ってから、最後に組み合わせることを行った。 簡単なチュートリアルだと az vm create ...
で一気に仮想マシンを作っているが、 ひとつひとつの部品の関係性を理解していないと仮想マシンの再構成は難しいと思う。 おそらくこの方が Azure を理解するのに役立つし、他の場面でも問題解決を行いやすくなるはず。
MacOS X El capitan(10.11)で行ったが、他でも Azure CLI 2.0 のインストール以外はほぼ同じ。
Azure CLI 2.0 のインストール
MacOS だと Homebrew を使うのが公式なやり方。
これで az
コマンドが使えるようになる。
ソースは↑の GitHub にある。
認証
↓を実行し、 https://aka.ms/devicelogin をブラウザで開いて XXXXXXX にあたる部分を入力すれば認証は終わり。
$ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code XXXXXXX to authenticate.
CloudName IsDefault Name State TenantId
----------- ----------- ---------- ------- ------------------------------------
AzureCloud True YYYYYYYYYY Enabled eec99bb3-5ff7-47d9-92e2-d8416d7de544
az コマンドの設定
configureサブコマンドでazコマンドの設定ができる。 引数なしで実行するとインタラクティブに設定ができる。
設定値は ~/.azure/config
に保存される。 直接編集しても良いと思う。 自分は出力形式の既定値を table にしておいた。
また、ほぼ全てのコマンドでリソースグループを指定しなければいけないが、 デフォルト値として設定しておくことも可能。 group00 をデフォルト値とするためには↓を行う。
↑を行うと ~/.azure/config
に↓の行が追加されたことが確認できる。
今回はデフォルト値を設定せずに行う。
リソースグループを作成する
テスト用のリソースグループ group00
を東日本に作成する。 これ以降に作成されるリソースはすべて group00
に所属させる。
作ったばかりなので、 group00
の中身↓はまだ空っぽ。
ルートテーブルを作成する
今回は特にルーティングの設定はしないが、複数のサブネットを作成し、 ルーティングを調整したい場合は必要になる。
$ az network route-table create -g group00 -n rt00
Location Name ProvisioningState ResourceGroup
---------- ------ ------------------- ---------------
japaneast rt00 Succeeded group00
ネットワークセキュリティグループを作成する
ネットワークセキュリティグループ nsg00
を作成する。 ネットワークセキュリティグループは後に作られるサブネットもしくはネットワークインターフェースへ関連付けることができるが、 今回はサブネットへ関連付けることにする。
$ az network nsg create -g group00 -n nsg00
$ az network nsg show -g group00 -n nsg00
Location Name ProvisioningState ResourceGroup ResourceGuid
---------- ------ ------------------- --------------- ------------------------------------
japaneast nsg00 Succeeded group00 7f85dd37-1625-4286-8de5-1cb7ece05c39
ssh を許可するルールを作成する
仮想マシンへ ssh でのログインを許可するために、 ネットワークセキュリティグループ nsg00
にインバウンドのルールを追加する。
$ az network nsg rule create -g group00 --nsg-name nsg00 -n ssh_allowed --description "allow ssh from any" --priority 100 --protocol Tcp --access Allow --direction Inbound --source-address-prefixes "*" --source-port-ranges "*" --destination-address-prefixes "*" --destination-port-ranges "22"
Access Description DestinationAddressPrefix DestinationPortRange Direction Name Priority Protocol ProvisioningState ResourceGroup SourceAddressPrefix SourcePortRange
-------- ------------------ -------------------------- ---------------------- ----------- ----------- ---------- ---------- ------------------- --------------- --------------------- -----------------
Allow allow ssh from any * 22 Inbound ssh_allowed 100 Tcp Succeeded group00 * *
仮想ネットワークを作成する
- https://docs.microsoft.com/ja-jp/cli/azure/network/vnet?view=azure-cli-latest#az_network_vnet_create
仮想ネットワークを作成する。 address-prefix を指定しない場合は 10.0.0.0/16
の空間が割り当てられる。
$ az network vnet show -g group00 --name vnet00
Location Name ProvisioningState ResourceGroup ResourceGuid
---------- ------ ------------------- --------------- ------------------------------------
japaneast vnet00 Succeeded group00 e3130e8d-af6c-48e2-ab22-f754e3b92868
サブネットを作成する
仮想ネットワーク vnet00(10.0.0.0/16)
に、サブネット subnet00(10.0.0.0/24)
を作る。 この時にルーティングテーブルやセキュリティグループも設定できる。
$ az network vnet subnet create -g group00 --vnet-name vnet00 -n subnet00 --address-prefix 10.0.0.0/24 --network-security-group nsg00 --route-table rt00
AddressPrefix Name ProvisioningState ResourceGroup
--------------- -------- ------------------- ---------------
10.0.0.0/24 subnet00 Succeeded group00
グローバルIPアドレスを取得する
$ az network public-ip list -g group00
Name ResourceGroup Location Zones AddressVersion AllocationMethod IdleTimeoutInMinutes ProvisioningState
------- --------------- ---------- ------- ---------------- ------------------ ---------------------- -------------------
pubip00 group00 japaneast IPv4 Static 4 Succeeded
取得されたIPアドレスは table 形式だと表示されないので、出力形式を json で表示する。 jq を使うと簡単にフィルタリングできる。
ネットワークインターフェースを作成する
仮想マシンには 10.0.0.11/24
のアドレスを付与することにする。 まずは 10.0.0.11
が使えるアドレスかチェックする。
$ az network vnet check-ip-address -g group00 -n vnet00 --ip-address 10.0.0.11
Available
-----------
True
10.0.0.11
は使用可能なので、↓でアドレスを指定してネットワークインターフェースを作成する。
$ az network nic create -g group00 --vnet-name vnet00 --subnet subnet00 -n nic00 --private-ip-address 10.0.0.11 --public-ip-address pubip00
$ az network nic show -g group00 -n nic00
Location Name ProvisioningState ResourceGroup ResourceGuid
---------- ------ ------------------- --------------- ------------------------------------
japaneast nic00 Succeeded group00 547df7e7-fcaf-4f2e-b9eb-9313f51f447a
nic00
が作成された。
ストレージアカウントを作成する(非管理ディスクの場合)
ストレージアカウントを作成する。 これは非管理ディスクを利用する場合に必要。 今回は検証用途なので、ローカル冗長ストレージ Standard_LRS で作成する。
$ az storage account create -g group00 -l japaneast -n group00sa00 --sku Standard_LRS
CreationTime Kind Location Name PrimaryLocation ProvisioningState ResourceGroup StatusOfPrimary
-------------------------------- ------- ---------- ----------- ----------------- ------------------- --------------- -----------------
2017-10-25T11:51:54.297224+00:00 Storage japaneast group00sa00 japaneast Succeeded group00 available
可用性セットを作成する
可用性セットは仮想マシン作成時に指定が可能。 仮想マシン作成後は変更が不可能。 また、管理ディスクと非管理ディスクを使う場合で可用性セットは明確に分けなければならない。 (障害ドメインの数は指定できるが、東日本の場合は実質2のみが意味を持つ値なので、デフォルトでよい。)
管理ディスクの場合は↓。
$ az vm availability-set create -g group00 -n as00
Name Location PlatformUpdateDomainCount PlatformFaultDomainCount ResourceGroup
------ ---------- --------------------------- -------------------------- ---------------
as00 japaneast 5 2 group00
非管理ディスクの場合は↓。
$ az vm availability-set create -g group00 -n as00-unmanaged --unmanaged
Name Location PlatformUpdateDomainCount PlatformFaultDomainCount ResourceGroup
-------------- ---------- --------------------------- -------------------------- ---------------
as00-unmanaged japaneast 5 2 group00
ssh鍵を作成する
仮想マシンに設定するsshの秘密鍵 user00
と公開鍵 user00.pub
を作成しておく。
イメージを選択する
今回は Ubuntu で作成する。 Ubuntu で検索すると↓が出てきたので Canonical:UbuntuServer:16.04-LTS:latest
というイメージを使う。
$ az vm image list -f ubuntu
You are viewing an offline list of images, use --all to retrieve an up-to-date list
Offer Publisher Sku Urn UrnAlias Version
------------ ----------- --------- --------------------------------------- ---------- ---------
UbuntuServer Canonical 16.04-LTS Canonical:UbuntuServer:16.04-LTS:latest UbuntuLTS latest
仮想マシンを作成する(管理ディスクの場合)
管理ディスクの場合はストレージの種類は Standard_LRS もしくは Premium_LRS の二つから選べる。
$ az vm create -g group00 -n vm00 --image "Canonical:UbuntuServer:16.04-LTS:latest" --size Standard_F1S --availability-set as00 --admin-username user00 --authentication-type ssh --ssh-key-value user00.pub --nics nic00 --os-disk-name vm00-os-disk --storage-sku Standard_LRS
ResourceGroup PowerState PublicIpAddress PrivateIpAddress MacAddress Location
--------------- ------------ ----------------- ------------------ ----------------- ----------
group00 VM running 40.115.248.150 10.0.0.11 00-0D-3A-50-E7-3D japaneast
仮想マシンを作成すると自動的に、管理ディスク vm00-os-disk
も作られていることがわかる。
$ az disk list
Name ResourceGroup Location Zones Sku OsType SizeGb ProvisioningState
------------ --------------- ---------- ------- ------------ -------- -------- -------------------
vm00-os-disk GROUP00 japaneast Standard_LRS Linux 30 Succeeded
仮想マシンの作成が終わったら↓のようにしてユーザ名と秘密鍵を指定するとsshできる。
この状態でリソースグループ group00
内にあるリソースは↓になる。
$ az resource list -g group00
Name ResourceGroup Location Type Status
-------------- --------------- ---------- --------------------------------------- --------
as00 group00 japaneast Microsoft.Compute/availabilitySets
vm00-os-disk GROUP00 japaneast Microsoft.Compute/disks
vm00 group00 japaneast Microsoft.Compute/virtualMachines
nic00 group00 japaneast Microsoft.Network/networkInterfaces
nsg00 group00 japaneast Microsoft.Network/networkSecurityGroups
pubip00 group00 japaneast Microsoft.Network/publicIPAddresses
rt00 group00 japaneast Microsoft.Network/routeTables
vnet00 group00 japaneast Microsoft.Network/virtualNetworks
仮想マシンを作成する(非管理ディスクの場合)
非管理ディスクを利用する場合は↓ストレージアカウントを指定する。
$ az vm create -g group00 -n vm00 --image "Canonical:UbuntuServer:16.04-LTS:latest" --size Standard_F1S --availability-set as00-unmanaged --admin-username user00 --authentication-type ssh --ssh-key-value user00.pub --nics nic00 --storage-account group00sa00 --use-unmanaged-disk --os-disk-name vm00-os-disk
ResourceGroup PowerState PublicIpAddress PrivateIpAddress MacAddress Location
--------------- ------------ ----------------- ------------------ ----------------- ----------
group00 VM running 40.115.248.150 10.0.0.11 00-0D-3A-50-E7-3D japaneast
仮想マシンを作成すると自動的に、コンテナ vhds
が作成され、 その中に非管理ディスク vm00-os-disk
も作られていることがわかる。
$ az storage container list --account-name group00sa00
Name Lease Status Last Modified
------ -------------- -------------------------
vhds unlocked 2017-10-25T13:06:32+00:00
$ az storage blob list --account-name group00sa00 --container-name vhds
Name Blob Type Blob Tier Length Content Type Last Modified
---------------- ----------- ----------- ----------- ------------------------ -------------------------
vm00-os-disk.vhd PageBlob 32212255232 application/octet-stream 2017-10-26T03:42:03+00:00
仮想マシンの作成が終わったら↓のようにしてユーザ名と秘密鍵を指定すると ssh できる。
この状態でリソースグループ group00
内にあるリソースは↓になる。
$ az resource list -g group00
Name ResourceGroup Location Type Status
-------------- --------------- ---------- --------------------------------------- --------
as00-unmanaged group00 japaneast Microsoft.Compute/availabilitySets
vm00 group00 japaneast Microsoft.Compute/virtualMachines
nic00 group00 japaneast Microsoft.Network/networkInterfaces
nsg00 group00 japaneast Microsoft.Network/networkSecurityGroups
pubip00 group00 japaneast Microsoft.Network/publicIPAddresses
rt00 group00 japaneast Microsoft.Network/routeTables
vnet00 group00 japaneast Microsoft.Network/virtualNetworks
group00sa00 group00 japaneast Microsoft.Storage/storageAccounts
仮想マシンを停止する
stop のみだと課金は継続されるので、deallocate する。
$ az vm deallocate -g group00 -n vm00
EndTime Name StartTime Status
-------------------------------- ------------------------------------ -------------------------------- ---------
2017-10-26T04:24:53.148491+00:00 a20052c6-62eb-4b34-b37f-e03441082c9d 2017-10-26T04:23:12.208304+00:00 Succeeded
仮想マシンを削除する
下記で仮想マシンが削除できる。
$ az vm delete -g group00 -n vm00
Are you sure you want to perform this operation? (y/n): y
EndTime Name StartTime Status
-------------------------------- ------------------------------------ -------------------------------- ---------
2017-10-26T04:28:21.607032+00:00 344f469b-2da0-45d0-80df-20479107b9c9 2017-10-26T04:28:11.122398+00:00 Succeeded
仮想マシンを削除しても、仮想マシン vm00
以外のリソースはそのまま残る。 (↓は管理ディスクの場合。)
$ az resource list -g group00
Name ResourceGroup Location Type Status
-------------- --------------- ---------- --------------------------------------- --------
as00 group00 japaneast Microsoft.Compute/availabilitySets
vm00-os-disk GROUP00 japaneast Microsoft.Compute/disks
nic00 group00 japaneast Microsoft.Network/networkInterfaces
nsg00 group00 japaneast Microsoft.Network/networkSecurityGroups
pubip00 group00 japaneast Microsoft.Network/publicIPAddresses
rt00 group00 japaneast Microsoft.Network/routeTables
vnet00 group00 japaneast Microsoft.Network/virtualNetworks
仮想マシンを再構成する(管理ディスクの場合)
可用性セットなどは仮想マシン作成時にのみ指定できるので、 仮想マシンを一旦削除してから仮想マシンの再構成が必要になる。 ↓のコマンドで作成した仮想マシンの再構成をしてみる。
$ az vm create -g group00 -n vm00 --image "Canonical:UbuntuServer:16.04-LTS:latest" --size Standard_F1S --availability-set as00 --admin-username user00 --authentication-type ssh --ssh-key-value user00.pub --nics nic00 --os-disk-name vm00-os-disk --storage-sku Standard_LRS
ResourceGroup PowerState PublicIpAddress PrivateIpAddress MacAddress Location
--------------- ------------ ----------------- ------------------ ----------------- ----------
group00 VM running 40.115.248.150 10.0.0.11 00-0D-3A-50-E7-3D japaneast
作成した仮想マシン vm00
を削除する。
$ az vm delete -g group00 -n vm00
Are you sure you want to perform this operation? (y/n): y
EndTime Name StartTime Status
-------------------------------- ------------------------------------ -------------------------------- ---------
2017-10-26T05:17:01.592463+00:00 69ec2363-57b5-4cd1-818d-1904f930708a 2017-10-26T05:15:00.651865+00:00 Succeeded
可用性セットとネットワークインターフェースとディスクとOSの種別を指定すれば再構成できる。 (すでにディスクは最初の仮想マシン作成時に初期化されているのでOSのイメージやユーザの情報は不要。)
$ az vm create -g group00 -n vm00 --size Standard_F1S --availability-set as00 --nics nic00 --attach-os-disk vm00-os-disk --os-type linux
ResourceGroup PowerState PublicIpAddress PrivateIpAddress MacAddress Location
--------------- ------------ ----------------- ------------------ ----------------- ----------
group00 VM running 40.115.248.150 10.0.0.11 00-0D-3A-50-E7-3D japaneast
仮想マシンを再構成する(非管理ディスクの場合)
↓のコマンドで作成した仮想マシン vm00
の再構成をしてみる。
$ az vm create -g group00 -n vm00 --image "Canonical:UbuntuServer:16.04-LTS:latest" --size Standard_F1S --availability-set as00-unmanaged --admin-username user00 --authentication-type ssh --ssh-key-value user00.pub --nics nic00 --storage-account group00sa00 --use-unmanaged-disk --os-disk-name vm00-os-disk
ResourceGroup PowerState PublicIpAddress PrivateIpAddress MacAddress Location
--------------- ------------ ----------------- ------------------ ----------------- ----------
group00 VM running 40.115.248.150 10.0.0.11 00-0D-3A-50-E7-3D japaneast
仮想マシン vm00
に接続されている起動ディスク vm00-os-disk
のURLは↓で取得できる。
$ az vm show -g group00 -n vm00 -o json | jq .storageProfile.osDisk.vhd.uri
"https://group00sa00.blob.core.windows.net/vhds/vm00-os-disk.vhd"
仮想マシンvm00を削除した後では↑では起動ディスク vm00-os-disk
のURLは取得不可能なため、↓で取得する。
$ az storage blob url --account-name group00sa00 --container-name vhds -n vm00-os-disk.vhd -o json
"https://group00sa00.blob.core.windows.net/vhds/vm00-os-disk.vhd"
仮想マシン vm00
を削除する。
$ az vm delete -g group00 -n vm00
Are you sure you want to perform this operation? (y/n): y
EndTime Name StartTime Status
-------------------------------- ------------------------------------ -------------------------------- ---------
2017-10-26T09:19:45.603882+00:00 36284781-296a-412e-bfcc-d857b597d360 2017-10-26T09:17:14.678153+00:00 Succeeded
管理ディスクのときと同様に可用性セットとネットワークインターフェースとディスクと OS の種別を指定すれば再構成できる。 (すでにディスクは最初の仮想マシン作成時に初期化されているので OS のイメージやユーザの情報は不要。)
$ az vm create -g group00 -n vm00 --size Standard_F1S --availability-set as00-unmanaged --nics nic00 --use-unmanaged-disk --attach-os-disk "https://group00sa00.blob.core.windows.net/vhds/vm00-os-disk.vhd" --os-type linux
ResourceGroup PowerState PublicIpAddress PrivateIpAddress MacAddress Location
--------------- ------------ ----------------- ------------------ ----------------- ----------
group00 VM running 40.115.248.150 10.0.0.11 00-0D-3A-50-E7-3D japaneast
リソースグループを削除する
リソースグループ group00
を削除すると、group00
に所属するすべてのリソースが削除される。
備考
仮想マシンのサイズやストレージの冗長性などの選択肢は↓で確認ができる。
$ az vm list-skus -l japaneast | head
ResourceType Locations Name Capabilities Tier Size Restrictions
---------------- ----------- ---------------------- --------------------------------- -------- ------------- ---------------------------
availabilitySets japaneast Classic MaximumPlatformFaultDomainCount=3
availabilitySets japaneast Aligned MaximumPlatformFaultDomainCount=2
disks japaneast Standard_LRS Standard
disks japaneast Premium_LRS Premium
snapshots japaneast Standard_LRS Standard
snapshots japaneast Premium_LRS Premium
virtualMachines japaneast Standard_A0 Standard A0 NotAvailableForSubscription
virtualMachines japaneast Standard_A1 Standard A1 NotAvailableForSubscription
※この記事で出てくるuuidなどは出力結果をそのまま貼っておらず、別のものを生成し置き換えています。