逆引きAzure CLI

# はじめに
Microsoftのクラウドプラットフォーム[Microsoft Azure](https://azure.microsoft.com/ja-jp/)の操作をCLIで行うために提供されているコマンドラインツール[Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/overview?view=azure-cli-latest)についてのメモ。

- Microsof Azure自体の解説は他に譲る。
- 本記事で扱う対象は[Azure CLI 2.0](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)とする。
    - Azure CLI 2.0の実行コマンドは`az`
    - Web上などで`azure`コマンドが紹介されているケースが散見されるが、これは[すでに廃止されている](https://docs.microsoft.com/ja-jp/azure/cli-install-nodejs)Azure CLI 1.0での実行コマンドなので本記事では扱わない。
- 本記事作成時はCentOS7で動作を確認している。


# 導入・設定

## Azure CLIの導入
- 導入方法については下記を参照  
    https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest  
-  Azure CLI 2.0は活発に開発が行われているので、yumやapt等アップデートが容易なパッケージ管理ソフト経由での導入がおすすめ。
- リリースノートは下記URLで公開されている。  
https://docs.microsoft.com/ja-jp/cli/azure/release-notes-azure-cli?view=azure-cli-latest


## コマンドの実行結果の表示形式について
- デフォルトの表示形式はJSON
    - 多くのサブコマンドでは`--output`オプションで`table`、`tsv`、`json`、`jsonc`が選択可能になっている。
    - CLIでヒューマンリーダブルなのは`table`、スクリプトなどで処理するときに便利なのは`json`か`tsv`といったところ。
    - 本記事では基本的に`--output table`を指定している。

|オプション|形式|
|---------|----|
|`--output table`|表形式|
|`--output tsv`|TSV(タブ区切りフォーマット)|
|`--output json`|JSON|
|`--output jsonc`|色付きJSON|
|`--output yaml`|YAML|
|`--output yamlc`|色付きYAML|
|`--output none`|エラーと警告以外は出力しない|

- `table`や`tsv`で表示する際には`json`で表示されるものと比べて表示項目が少ないことがある。
    - `--output table`や`--output tsv`で表示する際に省略される項目については`--query`オプションで明示的に指定することで、それぞれの表示形式でも出力出来る。
    - `--query`オプションに指定するのはJMESPath形式
        - JMESPathについては下記が参考になる。  
        http://jmespath.org/  
        https://qiita.com/futoase/items/320f408ae1cfff6dd6da

## プロキシー環境下での利用
- Azure CLIは各種APIと通信するため、プロキシー環境下では環境変数`HTTPS_PROXY`等でプロキシーを適切に設定したうえで`az`コマンドを実行する必要がある。


## ログイン
```shell-session
az login
```
上記のコマンドを実行するとURLとコード文字列が表示される。
ブラウザでURLにアクセスしコード文字列を入力した後、有効なサブスクリプションを持つユーザーを選択もしくはログインする。

## ログアウト
```shell-session
az logout
``` 

## ログイン済みアカウントの確認
``` shell-session
az account show
```

# VM(VirtualMachine)

## VM一覧を表示
```shell-session
az vm list --output table
```

- デフォルトの表示形式はJSONなので、jqコマンドで処理することもできる

```shell-session
az vm list | jq '.[] | .resourceGroup,.name'
```


## VMに割り当てられたIPアドレスを調べる
### `--output table`でのデフォルトの表示
```shell-session
az vm list-ip-addresses --output table
```

### `--query`を使用した表示項目の選択
- ResourceGroupを同時に表示する。

```shell-session
az vm list-ip-addresses --query "[].virtualMachine.{resourceGroup:resourceGroup,VirtualMachine:name,PublicIPAddresses:network.publicIpAddresses[0].ipAddress,PrivateIPAddresses:network.privateIpAddresses[0]}" --output table
```

### `jq`コマンドを利用した表示項目の選択とCSV出力
```shell-session
az vm list-ip-addresses |jq -r '["resource group","VM","private IP address","public IP address"] , ( .[].virtualMachine | [ .resourceGroup,.name,.network.privateIpAddresses[],.network.publicIpAddresses[].ipAddress ] ) |@csv'
``` 

## (Linuxの)VM上でコマンドを実行する
```shell-session
az vm run-command invoke --resource-group MyResourceGroup --name MyVm  --command-id RunShellScript --scripts "echo hello"
``` 

## VMを再起動する
```shell-session
az vm restart --resource-group MyResourceGroup --name MyVm
```

## VMを停止する(コンピューティングの料金は引き続き発生)
```shell-session
az vm stop --resource-group MyResourceGroup --name MyVm
```

## VMを停止する(割り当て解除)
```shell-session
az vm deallocate --resource-group MyResourceGroup --name MyVm
```

## VMの利用可能なリソース量を一覧で表示
```shell-session
az vm list-usage --location <location> --output table
```
- MS Azureでは各種リソースに[利用可能な上限が定められており](https://docs.microsoft.com/ja-jp/azure/azure-subscription-service-limits)、例えばCPUコア数の合計が一定数を超えるようなリソースの作成が制限される。
- 上記コマンドでは、VMに対して設定されている上限や利用済みの容量を表示する。


# リソース
## リソース一覧を表示
```shell-session
az resource list --output table
``` 

# リソースグループ
## リソースグループ一覧を表示
```shell-session
az group list  --output table
```

## すべてのリソースグループに対して、それぞれのリソースグループに属するリソースを丸ごと削除
- 実行ユーザーの権限で削除可能なリソースグループとそれに紐づいたリソースがすべて削除されるので要注意。
- `--no-wait`を指定しているので削除の終了を待たずにコマンドは終了する。

```shell-session
az group list |jq -r '.[].name' |while read RG; do az group delete --name "${RG}" --yes --no-wait; done
```

# その他

- 最新機能が気になる場合は[GitHub上のリポジトリ](https://github.com/Azure/azure-cli)をウォッチするのもおすすめです。


# 参考
- [Microsoft Azure Cloud Computing Platform & Services](https://azure.microsoft.com/ja-jp/)
- [Azure CLI 2.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/cli/azure/index?view=azure-cli-latest)
- [Azure CLI 2.0 あれこれ　入門編 – Japan Azure Technical Support Engineers' Blog](https://blogs.technet.microsoft.com/jpaztech/2017/04/28/azure-cli-2-0-helloworld/)


# 最後に
- 誤りや更に便利な使い方があったら追記します。
- Microsoftが公開しているドキュメントだけでなくコマンド自体にもヘルプや補完が充実してるので、色々試しているうちに理解が深まってくると思います。