Azure Resource Manager を使ってCLIで、仮想マシンを作って、消して、また作る

# 概要

Azure Resource　Mager の JSON と、CLIで、
仮想マシンを作って、消して、また作る

# 結論

できた、仮想マシンの削除とディスクの削除を別に行う必要があることがわかった。

## 感想

仮想マシンの削除で即ディスク削除でないのは、それは助かることが多いとおもう
消し忘れは問題であるが、残っているのは、それはそれでよいと思った。

# やったこと

## azure-quickstart-templates

今回は、 azure-quickstart-templates を使うので

[Azure/azure-quickstart-templates: Azure Quickstart Templates](https://github.com/Azure/azure-quickstart-templates)

```
git clone https://github.com/Azure/azure-quickstart-templates.git
```

## docker で microsoft/azure-cli:0.10.6 を起動

[microsoft/azure-cli - Docker Hub](https://hub.docker.com/r/microsoft/azure-cli/)

```
docker run --rm -ti -v $PWD/azure-quickstart-templates:/work microsoft/azure-cli:0.10.6 /bin/bash
```

## azure login

```
azure login
```

このあとで、なにがしかの認証をする

## azure config mode arm

arm モードにする。

```
root@f3c98cd904aa:/# azure config mode arm
info:    Executing command config mode
info:    New mode is arm
info:    config mode command OK
```

## quicktemplates のディレクトリへ移動

docker 起動時に指定したディレクトリへ移動

```
cd /work
```

## 必要なディレクトリの確認

今回はsshでログインできる簡単な簡単なVMを作るので `101-vm-sshkey` の中を確認
[azure-quickstart-templates/101-vm-sshkey at master · Azure/azure-quickstart-templates](https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-sshkey)

## 必要なパラメータの設定

必要なパラメータを設定する

```
vi 101-vm-sshkey/azuredeploy.parameters.json
```

今回は、のレシピでは

```adminUserName``` と ```sshKeyData```  が設定できる。

### adminUserName について

2017-01-24 現在の、レポジトリの状況では、

```adminUserName``` は、 ```adminUsername``` となっていて、
うまくマシンが作れなかった

一応 PullRequest は、送ってみた

* [UpperCase adminUsername to adminUserName by manabuishii · Pull Request #2987 · Azure/azure-quickstart-templates](https://github.com/Azure/azure-quickstart-templates/pull/2987)

### sshKeyData

``id_rsa.pub``` など、公開鍵の内容を記述する。
これが、作成されたマシンの ```adminUserName``` で指定したユーザのところに配置される

## リソースグループの確認

以下のコマンドで確認

```
azure group list
```

今回は何もない

```
root@f3c98cd904aa:/# azure group list
info:    Executing command group list
+ Listing resource groups                                                      
info:    No matched resource groups were found
info:    group list command OK
root@f3c98cd904aa:/#
```

## マシンを作る

```
./azure-group-deploy.sh -a '101-vm-sshkey' -l japaneast -g TESTAZUREGROUP -v
```

しばしまつとできあがる
このときに、接続先のアドレスなどもでてくるので、必要があれば、メモをする

```
info:    group deployment create command OK
root@f3c98cd904aa:/work# echo $?
0
```

### ssh で、ログインしてみる

マシンを作ったときの最後にでてくる指示通りにする。
必要がある人は、鍵を指定する。

####  仮想マシンの中からマシンを停止する

仮想マシンの中で、

```
sudo shutdown -h now
```

### 停止したことを確認する

PowerState のところが、 `VM stopped` になっていることが確認できる

```
root@f3c98cd904aa:/work# azure vm list
info:    Executing command vm list
+ Getting virtual machines                                                     
data:    ResourceGroupName  Name   ProvisioningState  PowerState  Location   Size        
data:    -----------------  -----  -----------------  ----------  ---------  ------------
data:    TESTAZUREGROUP     sshvm  Succeeded          VM stopped  japaneast  Standard_DS2
info:    vm list command OK
root@f3c98cd904aa:/work#
```

## 停止したマシンを起動する

```
azure vm start TESTAZUREGROUP sshvm
```
### 起動したことの確認

PowerState のところが、 `VM running` となっていることがわかる。

```
root@f3c98cd904aa:/work# azure vm list
info:    Executing command vm list
+ Getting virtual machines                                                     
data:    ResourceGroupName  Name   ProvisioningState  PowerState  Location   Size        
data:    -----------------  -----  -----------------  ----------  ---------  ------------
data:    TESTAZUREGROUP     sshvm  Succeeded          VM running  japaneast  Standard_DS2
info:    vm list command OK
root@f3c98cd904aa:/work#
```

### azure vm start のオプション

```
azure vm start -h
```

実行結果

```
root@f3c98cd904aa:/work# azure vm start -h  
help:    Start a virtual machine in a resource group
help:    
help:    Usage: vm start [options] <resource-group> <name>
help:    
help:    Options:
help:      -h, --help                             output usage information
help:      -v, --verbose                          use verbose output
help:      -vv                                    more verbose with debug output
help:      --json                                 use json output
help:      -g, --resource-group <resource-group>  the resource group name
help:      -n, --name <name>                      the virtual machine name
help:      -s, --subscription <subscription>      the subscription identifier
help:    
help:    Current Mode: arm (Azure Resource Management)
root@f3c98cd904aa:/work# 
```

## VMを削除する

```
azure vm delete TESTAZUREGROUP sshvm
```

実行結果

```
root@f3c98cd904aa:/work# azure vm delete TESTAZUREGROUP sshvm
info:    Executing command vm delete
+ Looking up the VM "sshvm"                                                    
Delete the virtual machine "sshvm"? [y/n]  y
+ Deleting the virtual machine "sshvm"                                         
info:    vm delete command OK
root@f3c98cd904aa:/work#
```

### 削除できたことの確認

```
root@f3c98cd904aa:/work# azure vm list
info:    Executing command vm list
+ Getting virtual machines                                                     
info:    No VMs found
info:    vm list command OK
root@f3c98cd904aa:/work#
```

### azure vm delete のオプション

```
root@f3c98cd904aa:/work# azure vm delete -h
help:    Delete a virtual machine in a resource group
help:    
help:    Usage: vm delete [options] <resource-group> <name>
help:    
help:    Options:
help:      -h, --help                             output usage information
help:      -v, --verbose                          use verbose output
help:      -vv                                    more verbose with debug output
help:      --json                                 use json output
help:      -g, --resource-group <resource-group>  the resource group name
help:      -n, --name <name>                      the virtual machine name
help:      -q, --quiet                            quiet mode, do not ask for delete confirmation
help:      -s, --subscription <subscription>      the subscription identifier
help:    
help:    Current Mode: arm (Azure Resource Management)
root@f3c98cd904aa:/work#
```

## また作る

一度消えたので、また作る

最初に作ったときと同じコマンドを再び実行する

```
./azure-group-deploy.sh -a '101-vm-sshkey' -l japaneast -g TESTAZUREGROUP -v
```

### エラーになる

同じコマンドを実行したが、エラーになった

```
error:   Deployment provisioning state was not successful.
error:   Error information has been recorded to /root/.azure/azure.err
verbose: Error: Deployment provisioning state was not successful.
    at __$__1 (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/group.deployment.js:122:28)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at /usr/lib/node_modules/azure-cli/lib/util/interaction.js:185:16
    at ___ (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/group.deployment.js:109:44)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at ___ (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/groupUtils.js:515:16)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at __$getFailedNestedOperations (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/groupUtils.js:532:14)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at __$value__1 (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/builtins.js:134:129)
error:   group deployment create command failed

```

### ログを見て何が起こったか確認する

```
2017-01-24T08:00:47.137Z:
[Error: Deployment provisioning state was not successful.]
Error: Deployment provisioning state was not successful.
    at __$__1 (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/group.deployment.js:122:28)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at /usr/lib/node_modules/azure-cli/lib/util/interaction.js:185:16
    at ___ (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/group.deployment.js:109:44)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at ___ (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/groupUtils.js:515:16)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at __$getFailedNestedOperations (/usr/lib/node_modules/azure-cli/lib/commands/arm/group/groupUtils.js:532:14)
    at ___ (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/runtime.js:111:13)
    at __$value__1 (/usr/lib/node_modules/azure-cli/node_modules/streamline/lib/callbacks/builtins.js:134:129)
```

## 詳細に何が起こったか確認する

* [DocumentDB Automation - リソース マネージャー - CLI | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/documentdb/documentdb-automation-resource-manager-cli)

このなかの、 `トラブルシューティング` のところに

```
azure group log show <resourcegroupname> --last-deployment
```

と、あるので、リソースグループを今使っているものにする

```
azure group log show TESTAZUREGROUP --last-deployment
```

json 形式も扱える

```
azure group log show TESTAZUREGROUP --last-deployment --json
```

### 実際に起こったこと

ディスクがすでにあうということのようだ 

```
data:    Properties:           statusCode:    Conflict
                               statusMessage: {"status":"Failed","error":{"code":"ResourceDeploymentFailure","message":"The resource operation completed with terminal provisioning state 'Failed'.","details":[{"code":"TargetDiskBlobAlreadyExists","message":"Blob http://*****************.blob.core.windows.net/vhds/
                               osDisk1.vhd already
                               exists. Please provide a different blob URI as target for disk 'osdisk'."}]}}
```

## ディスクを消す

ディスクを消すのは

```
azure storage blob delete -a YOURSTORAGEACCOUNT -k key1 vhds osDisk1.vhd

```

なのだが、アカウントキーなどが必要なのでまずはそれを確認する

- アカウント名
- アカウントキー
- コンテナの名前
- blob の名前

### ストレージアカウントの確認

これでアカウント名を確認する

```
azure storage account list
```

### ストレージアカウントのキーなどを確認

```
azure storage account keys list YOURSTORAGEACCOUNTNAME -g TESTAZUREGROUP --json
```

手入力するとかならず、`key`と単数にしてしまうが、`keys` と複数形なんだなぁというのは、出力をみるとわかる


## コンテナリストの確認

実際のディスクはコンテナというのに入っているようなので、まずは、containerのリストを確認する

```
root@f3c98cd904aa:/work# azure storage container list -a YOURSTORAGEACCOUNTNAME -k YOURKEY
info:    Executing command storage container list
+ Getting storage containers                                                   
data:    Name  Public Access  Last Modified                
data:    ----  -------------  -----------------------------
data:    vhds  Off            Tue, 24 Jan 2017 06:56:02 GMT
info:    storage container list command OK
root@f3c98cd904aa:/work# 
```

コンテナ名が `vhds` であることがわかる。


### コンテナリストのオプション

```
root@f3c98cd904aa:/work# azure storage container list -h
help:    List storage containers with wildcard
help:    
help:    Usage: storage container list [options] [prefix]
help:    
help:    Options:
help:      -h, --help                                  output usage information
help:      -v, --verbose                               use verbose output
help:      --json                                      use json output
help:      -p, --prefix <prefix>                       the storage container name prefix
help:      -a, --account-name <accountName>            the storage account name or omit it to use environment variable [AZURE_STORAGE_ACCOUNT]
help:      -k, --account-key <accountKey>              the storage account key or omit it to use environment variable [AZURE_STORAGE_ACCESS_KEY]
help:      -c, --connection-string <connectionString>  the storage connection string or omit it to use environment variable [AZURE_STORAGE_CONNECTION_STRING]
help:      -vv                                         run storage command in debug mode
help:    
help:    Current Mode: arm (Azure Resource Management)
```

### blobを確認する

vhdsというコンテナなので、以下のようになる

```
root@f3c98cd904aa:/work# azure storage blob list -a YOURSTORAGEACCOUNTNAME -k YOURKEY1 vhds
info:    Executing command storage blob list
+ Getting blobs in container vhds                                              
data:    Name         Blob Type  Length       Content Type              Last Modified                  Snapshot Time
data:    -----------  ---------  -----------  ------------------------  -----------------------------  -------------
data:    osDisk1.vhd  PageBlob   31457280512  application/octet-stream  Tue, 24 Jan 2017 07:55:54 GMT               
info:    storage blob list command OK
```

### blob list のオプションの確認

```
root@f3c98cd904aa:/work# azure storage blob list -h
help:    List storage blob in the specified storage container use wildcard and blob name prefix
help:    
help:    Usage: storage blob list [options] [container] [prefix]
help:    
help:    Options:
help:      -h, --help                                  output usage information
help:      -v, --verbose                               use verbose output
help:      --json                                      use json output
help:      --container <container>                     the storage container name
help:      -p, --prefix <prefix>                       the blob name prefix
help:      --sas <sas>                                 the shared access signature
help:      -a, --account-name <accountName>            the storage account name or omit it to use environment variable [AZURE_STORAGE_ACCOUNT]
help:      -k, --account-key <accountKey>              the storage account key or omit it to use environment variable [AZURE_STORAGE_ACCESS_KEY]
help:      -c, --connection-string <connectionString>  the storage connection string or omit it to use environment variable [AZURE_STORAGE_CONNECTION_STRING]
help:      -vv                                         run storage command in debug mode
help:    
help:    Current Mode: arm (Azure Resource Management)
root@f3c98cd904aa:/work#
```

## blobを削除する

```
root@f3c98cd904aa:/work# azure storage blob delete -a YOURSTORAGEACCOUNTNAME -k YOURKEY1 vhds osDisk1.vhd
info:    Executing command storage blob delete
Do you want to remove the storage blob osDisk1.vhd and all of its snapshots?  Y
+ Deleting Blob osDisk1.vhd in container vhds                                  
info:    Blob osDisk1.vhd deleted successfully
info:    storage blob delete command OK
root@f3c98cd904aa:/work#
```

## blobが削除できたことの確認

```
azure storage blob list -a YOURSTORAGEACCOUNTNAME -k YOURKEY1 vhds
```

結果

```
root@f3c98cd904aa:/work# azure storage blob list -a YOURSTORAGEACCOUNTNAME -k YOURKEY1 vhds
info:    Executing command storage blob list
+ Getting blobs in container vhds                                              
info:    No blobs found
info:    storage blob list command OK
root@f3c98cd904aa:/work#
```

## 再度VMを作る

```
./azure-group-deploy.sh -a '101-vm-sshkey' -l japaneast -g TESTAZUREGROUP -v
```

## 完成したらログインしてみる

# 必要がなければ消す

必要がなければササッと消す。
ディスクも要らなければ一緒に