AzureCLIで仮想マシンを作成する

Azure AzureCLI

AzureCLIを利用して仮想マシンを作成してみました。
仮想マシン一式を構築する機会が多いので簡単にAzureCLIのコマンドとしてまとめてみました。

広告

今回のAzureCLIで作成可能な構成

今回のコマンドでは仮想マシン含む以下のリソースをAzureCLIで一括作成します。

  • リソースグループ
  • 仮想ネットワーク(サブネット含む)
  • ネットワークセキュリティグループ(NSG)
  • パブリックIP
  • ネットワークインターフェース
  • 仮想マシン

今回のAzureCLIコマンドで作成する構成としては以下の通りです。

今回の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

タイトルとURLをコピーしました