blog.monophile.net

コンピュータのこととかのメモ。

山本 一彰 | Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を2016年に受賞。 現在はインフラエンジニアとして生計をたててている。

技術

各種システムの設計/構築/運用を承ります。

Configuration Management Ansible, Terraform, cloud-init
Cloud Platform AWS, Azure, GCP, Openstack
Openstack Keystone, Glance, Cinder(Ceph), Neutron(VLAN), Nova(QEMU), Horizon
Virtualization QEMU+KVM, LXD/LXC, Docker
OS Ubuntu, Debian GNU/Linux, CentOS, ...
Storage Ceph, GlusterFS, ZFS, btrfs, ...
Networks Tunnel(IPSec, L2TP, VXLAN, GRE), WirelessAP, ...
DB MySQL, MariaDB(Galera Cluster), MongoDB
Mail postfix, dovecot
WebApps WordPress, GitLab, MatterMost, Redmine, RainLoop, ...
Monitoring Nagios, Munin
Misc certbot, dnsmasq, ...

技術(習得中)

Orchestration Kubernetes
Openstack swift, manila, trove
OS CoreOS(Container Linux), Vyatta(VyOS), ...
Networks IPv6, BGP(quagga, calico), flannel, fan, ...
DB/KVS Redis, etcd
Monitoring Prometheus, Zabbix
DNS CoreDNS, PowerDNS
Misc MAAS, Blockchain

投稿

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 のインストール

MacだとHomebrewを使うのが公式なやり方。

$ brew update
$ brew install azure-cli

これで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コマンドの設定ができる。 引数なしで実行するとインタラクティブに設定ができる。

$ az configure

設定値は ~/.azure/config に保存される。 直接編集しても良いと思う。 自分は出力形式の既定値をtableにしておいた。

また、ほぼ全てのコマンドでリソースグループを指定しなければいけないが、 デフォルト値として設定しておくことも可能。 group00をデフォルト値とするためには↓を行う。

$ az configure -d group="group00"

↑を行うと ~/.azure/config に↓の行が追加されたことが確認できる。

[defaults]
group = group00

今回はデフォルト値を設定せずに行う。

リソースグループを作成する

テスト用のリソースグループgroup00を東日本に作成する。 これ以降に作成されるリソースはすべてgroup00に所属させる。

$ az group create -n group00 -l japaneast
Location    Name
----------  -------
japaneast   group00

作ったばかりなので、group00の中身↓はまだ空っぽ。

$ az resource list -g 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          *                      *

仮想ネットワークを作成する

仮想ネットワークを作成する。 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を使うと簡単にフィルタリングできる。

$ $ az network public-ip show -g group00 -n pubip00 -o json | jq .ipAddress
"40.115.248.150"

ネットワークインターフェースを作成する

仮想マシンには 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)を作成しておく。

$ ssh-keygen -f user00 -N "" -C "user00"

イメージを選択する

今回は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できる。

$ ssh 40.115.248.150 -i user00 -l user00

この状態でリソースグループ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できる。

$ ssh 40.115.248.150 -i user00 -l user00

この状態でリソースグループ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 group delete -n group00
Are you sure you want to perform this operation? (y/n): y

備考

仮想マシンのサイズやストレージの冗長性などの選択肢は↓で確認ができる。

$ 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などは出力結果をそのまま貼っておらず、別のものを生成し置き換えています。

参考