AzureCLIを利用して仮想マシンを作成してみました。
仮想マシン一式を構築する機会が多いので簡単にAzureCLIのコマンドとしてまとめてみました。
今回のAzureCLIで作成可能な構成
今回のコマンドでは仮想マシン含む以下のリソースをAzureCLIで一括作成します。
- リソースグループ
- 仮想ネットワーク(サブネット含む)
- ネットワークセキュリティグループ(NSG)
- パブリックIP
- ネットワークインターフェース
- 仮想マシン
今回のAzureCLIコマンドで作成する構成としては以下の通りです。
AzureCLIコマンド(仮想マシン1台を作成)
以下のコマンドで仮想マシン一式を作成可能です。
リソースグループやNSGなどのリソースもまとめて作成します。
※複数VMを作成したい場合は下部の [参考] 複数VMを作成したい場合のコマンド に記載のコマンドを利用してください。
今回は、OSとして [Ubuntu 22.04 LTS] を利用していますが、指定する値を変えればWindowsOSも利用可能です。
NSGで許可するIPと仮想マシンログイン時のユーザ名は任意の値に置き換えてください。
#任意のパラメータを定義
$rg_name = "RG-test-proxy"
$location = "japaneast"
$vnet_name = "Vnet-test-proxy"
$vnet_address = "10.8.0.0/24"
$subnet_name = "Subnet-test-proxy"
$subnet_address = "10.8.0.0/26"
$nsg_name = "NSG-test-proxy"
$nsgrule_name = "SSH"
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
$nsgrule_sourceip = $my_gip + "/32"
$nsgrule_port = 22
$nsgrule_priority = 200
$pip_name = "PIP-VM-test-proxy"
$nic_name = "NIC-VM-test-proxy"
$vm_name = "VM-test-proxy"
$vm_image = "Ubuntu2204" #Windowsは「Win2022Datacenter」
$vm_size = "Standard_B2ms"
$vm_authtype = "password"
$vm_adminname = "xxxxxxx"
#リソースグループの作成
az group create `
-l $location `
-g $rg_name
#仮想ネットワークの作成
az network vnet create `
-n $vnet_name `
-g $rg_name `
-l $location `
--address-prefix $vnet_address `
--subnet-name $subnet_name `
--subnet-prefix $subnet_address
#NSGの作成
az network nsg create `
-n $nsg_name `
-g $rg_name
#NSGのルール追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n $nsgrule_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule_port `
--priority $nsgrule_priority
#NSGをサブネットに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet_name `
--vnet-name $vnet_name `
--network-security-group $nsg_name
#パブリックIPの作成
az network public-ip create `
-n $pip_name `
-g $rg_name
#ネットワークインターフェースの作成
az network nic create `
-n $nic_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet_name `
--public-ip-address $pip_name
#仮想マシンの作成
az vm create `
-n $vm_name `
-g $rg_name `
--image $vm_image `
--size $vm_size `
--nics $nic_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
上記ではインターフェースとしてPowershellを利用しているので、改行する際には ` を利用していますが、コマンドプロンプトを利用する場合には、^ を利用する必要がありますのでその点は注意してください。
ログイン確認
今回作成した仮想マシンはUbuntuなので、以下のコマンドでssh接続可能かを試します。
#パブリックIPリソースからIP情報を取得
$pip = az network public-ip show `
-n $pip_name `
-g $rg_name `
| ConvertFrom-Json
#ssh接続
ssh $pip.ipAddress
・実行結果
PS C:\> ssh $pip.ipAddress
~~中略~~
xxxxxx@VM-test-proxy:~$
ssh接続可能であることが確認できます。
作成リソースの一括削除
以下のコマンドでリソースグループ自体を削除して、今回作成したリソース全てを一括削除することが可能です。
az group delete `
-g $rg_name
[参考] AzureCLIで仮想マシンイメージ情報を取得
仮想マシンのイメージ情報を取得するAzureCLIコマンドです。
ますはよく利用されるイメージを出力してイメージを確認するのがいいかと思います。
よく利用されるイメージを出力
az vm image list --output table
・コマンド実行結果
PS C:\> az vm image list --output table
You are viewing an offline list of images, use --all to retrieve an up-to-date list
Architecture Offer Publisher Sku Urn UrnAlias Version
-------------- ---------------------------- ---------------------- ---------------------------------- ------------------------------------------------------------------------------ ----------------------- ---------
x64 CentOS OpenLogic 8_5-gen2 OpenLogic:CentOS:8_5-gen2:latest CentOS85Gen2 latest
x64 debian-11 Debian 11-backports-gen2 Debian:debian-11:11-backports-gen2:latest Debian11 latest
x64 openSUSE-leap-15-4 SUSE gen2 SUSE:openSUSE-leap-15-4:gen2:latest OpenSuseLeap154Gen2 latest
x64 RHEL RedHat 8-lvm-gen2 RedHat:RHEL:8-lvm-gen2:latest RHELRaw8LVMGen2 latest
x64 sles-15-sp5 SUSE gen2 SUSE:sles-15-sp5:gen2:latest SuseSles15SP5 latest
x64 0001-com-ubuntu-server-jammy Canonical 22_04-lts-gen2 Canonical:0001-com-ubuntu-server-jammy:22_04-lts-gen2:latest Ubuntu2204 latest
x64 ubuntu-24_04-lts Canonical server Canonical:ubuntu-24_04-lts:server:latest Ubuntu2404 latest
x64 ubuntu-24_04-lts Canonical ubuntu-pro Canonical:ubuntu-24_04-lts:ubuntu-pro:latest Ubuntu2404Pro latest
x64 flatcar-container-linux-free kinvolk stable-gen2 kinvolk:flatcar-container-linux-free:stable-gen2:latest FlatcarLinuxFreeGen2 latest
x64 WindowsServer MicrosoftWindowsServer 2022-datacenter-g2 MicrosoftWindowsServer:WindowsServer:2022-datacenter-g2:latest Win2022Datacenter latest
x64 WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition-core MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition-core:latest Win2022AzureEditionCore latest
x64 WindowsServer MicrosoftWindowsServer 2019-datacenter-gensecond MicrosoftWindowsServer:WindowsServer:2019-datacenter-gensecond:latest Win2019Datacenter latest
x64 WindowsServer MicrosoftWindowsServer 2016-datacenter-gensecond MicrosoftWindowsServer:WindowsServer:2016-datacenter-gensecond:latest Win2016Datacenter latest
x64 WindowsServer MicrosoftWindowsServer 2012-R2-Datacenter MicrosoftWindowsServer:WindowsServer:2012-R2-Datacenter:latest Win2012R2Datacenter latest
x64 WindowsServer MicrosoftWindowsServer 2012-Datacenter MicrosoftWindowsServer:WindowsServer:2012-Datacenter:latest Win2012Datacenter latest
PS C:\>
今回パラメータに利用していたのは [UrnAlias] の値を利用してイメージを選択していました。
その他の出力方法について
[–all] オプションを利用すると使用可能なすべてのイメージを一覧表示することが可能です。
az vm image list --all
ただし、この [–all] オプションだけを利用すると膨大な量のイメージを出力しようとするため、結果が出力されるまでにかなり時間がかかります。
なので [–all] オプションだけの利用は推奨しません。
なので、[–offer] オプションでオファー名(OSの種類など)や、[-sku] オプションでイメージSKU名(windowsだと2012、ubuntuだと18.04など)を指定して表示させるのが良いかと思います。
また、[–all] を利用していない場合にはオフラインで持っているイメージ一覧が表示されます。
オフラインでキャッシュされたwindows2012のイメージを表示
az vm image list --offer windows --sku 2012
・コマンド実行結果
PS C:\> az vm image list --offer windows --sku 2012
You are viewing an offline list of images, use --all to retrieve an up-to-date list
[
{
"architecture": "x64",
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2012-R2-Datacenter",
"urn": "MicrosoftWindowsServer:WindowsServer:2012-R2-Datacenter:latest",
"urnAlias": "Win2012R2Datacenter",
"version": "latest"
},
{
"architecture": "x64",
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2012-Datacenter",
"urn": "MicrosoftWindowsServer:WindowsServer:2012-Datacenter:latest",
"urnAlias": "Win2012Datacenter",
"version": "latest"
}
]
PS C:\>
仮想マシンの作成などでイメージを指定する場合には「urn」もしくは「urnAlias」の値を利用することが可能です。
また、オファー名と [–all] オプションの組み合わせも可能です。
ただこの場合も表示までに少し時間がかかります。
・centosの利用可能なイメージをすべて表示
az vm image list -f centos --all
[参考] AzureCLIで仮想マシンサイズ情報を取得
以下のコマンドで仮想マシンサイズ情報を取得可能です。
[-l] は場所の指定で、必須のパラメータになります。
・東日本リージョンで利用可能な仮想マシンサイズを取得
az vm list-sizes -l japaneast
・実行結果
S C:\> az vm list-sizes -l japaneast
[
{
"maxDataDiskCount": 24,
"memoryInMb": 57344,
"name": "Standard_NV6",
"numberOfCores": 6,
"osDiskSizeInMb": 1047552,
"resourceDiskSizeInMb": 389120
},
~~中略~~
{
"maxDataDiskCount": 32,
"memoryInMb": 458752,
"name": "Standard_NC24s_v3",
"numberOfCores": 24,
"osDiskSizeInMb": 1047552,
"resourceDiskSizeInMb": 1376256
}
]
PS C:\>
これだとディスクサイズなどの細かい情報まで取得されるので見づらいです。
なので以下のように加工すると利用可能なサイズ情報だけを確認しやすくなります。
※CLIとしてPowershellを利用している場合に限ります。
・加工したコマンド(サイズ情報のみ取得)
$result = az vm list-sizes -l japaneast | ConvertFrom-Json
$result.name
・実行結果(加工したコマンド)
PS C:\> $result = az vm list-sizes -l japaneast | ConvertFrom-Json
PS C:\> $result.name
Standard_NV6
Standard_NV12
Standard_NV24
Standard_NV6_Promo
Standard_NV12_Promo
Standard_NV24_Promo
Standard_D2a_v4
Standard_D4a_v4
Standard_D8a_v4
~~中略~~
Standard_NV36ads_A10_v5
Standard_NV72ads_A10_v5
Standard_NC24ads_A100_v4
Standard_NC48ads_A100_v4
Standard_NC96ads_A100_v4
Standard_NC6s_v3
Standard_NC12s_v3
Standard_NC24rs_v3
Standard_NC24s_v3
PS C:\>
[参考] 複数VMを作成したい場合のコマンド
複数VMを作成したい場合のコマンドは以下となります。
今回は1つ目はWindowsで、もう1つはLinux(Ubuntu)で作成しています。
#任意のパラメータを定義
$rg_name = "RG-Test-VM"
$location = "japaneast"
$vnet_name = "Vnet-Test-VM"
$vnet_address = "10.6.0.0/24"
$subnet1_name = "Subnet-Client"
$subnet1_address = "10.6.0.0/26"
$subnet2_name = "Subnet-VM"
$subnet2_address = "10.6.0.64/26"
$nsg1_name = "NSG-Test-Windows"
$nsg2_name = "NSG-Test-Ubuntu"
$nsgrule_name = "AllowRDP"
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
$nsgrule_sourceip = $my_gip + "/32"
$nsgrule_port = 3389
$nsgrule_priority = 200
$pip1_name = "PIP-VM-Test-Windows"
$nic1_name = "NIC-VM-Test-Windows"
$pip2_name = "PIP-VM-Test-Ubuntu"
$nic2_name = "NIC-VM-Test-Ubuntu"
$vm1_name = "VM-Test-Windows"
$vm2_name = "VM-Test-Ubuntu"
$vm1_image = "Win2022Datacenter"
$vm2_image = "Ubuntu2204"
$vm_size = "Standard_B2ms"
$vm_authtype = "password"
$vm_adminname = "xxxxxxxx"
#リソースグループの作成
az group create `
-l $location `
-g $rg_name
#仮想ネットワークの作成とクライアント用サブネットの追加
az network vnet create `
-n $vnet_name `
-g $rg_name `
-l $location `
--address-prefix $vnet_address `
--subnet-name $subnet1_name `
--subnet-prefix $subnet1_address
#web用サブネットの追加
az network vnet subnet create `
-g $rg_name `
--vnet-name $vnet_name `
-n $subnet2_name `
--address-prefixes $subnet2_address
#NSGの作成
az network nsg create `
-n $nsg1_name `
-g $rg_name
az network nsg create `
-n $nsg2_name `
-g $rg_name
#NSGのルール追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg1_name `
-n $nsgrule_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule_port `
--priority $nsgrule_priority
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg2_name `
-n $nsgrule_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule_port `
--priority $nsgrule_priority
#NSGをサブネットに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet1_name `
--vnet-name $vnet_name `
--network-security-group $nsg1_name
az network vnet subnet update `
-g $rg_name `
-n $subnet2_name `
--vnet-name $vnet_name `
--network-security-group $nsg2_name
#パブリックIPの作成
az network public-ip create `
-n $pip1_name `
-g $rg_name
az network public-ip create `
-n $pip2_name `
-g $rg_name
#ネットワークインターフェースの作成
az network nic create `
-n $nic1_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet1_name `
--public-ip-address $pip1_name
az network nic create `
-n $nic2_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet2_name `
--public-ip-address $pip2_name
#仮想マシンの作成
az vm create `
-n $vm1_name `
-g $rg_name `
--image $vm1_image `
--size $vm_size `
--nics $nic1_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
az vm create `
-n $vm2_name `
-g $rg_name `
--image $vm2_image `
--size $vm_size `
--nics $nic2_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname