Azure Cliのメモ


MacからMicrosoft Azureを制御するためのコマンドラインインターフェースの使い方メモ（使ったものから随時更新）

##インストール

###前提条件

npmを利用するのでnodeをインストールしておく必要がある。

###インストール

```bash
sudo npm install -g azure-cli
```

###update

```bash
sudo npm update -g azure-cli
```

##Azureへのログイン

Azureにログインするにはいくつかのタイプがある。いわゆるマイクロソフトアカウントを利用する場合は、

```bash
azure login
```

と打つと、http://aka.ms/devicelogin にアクセスしてコンソールに表示される認証コードを入力しろ！と言われるのでそれに従います。
その他のログイン方法は[ここ](https://docs.microsoft.com/ja-jp/azure/xplat-cli-connect)をご覧ください。

##ASMモードとARMモード

コマンドにはASMモードとARMモードのものがあり、Webでいうと旧ポータル系と新ポータル系に別れる。各モードで作ったリソースは原則として各モードでしか制御できないため、新旧入り乱れてのリソースを使ってる人はモードを意識して操作をする必要がある。また、リースによってはどちらかで強制的に作られるものもあるため注意が必要です。両者のちがいについては[こちら](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-manager-deployment-model)。

###モードの確認

現在のモードを確認するにはazure config listのmodeを確認する。下記ではarmモードになっています。

```bash
azure config list

info:    Executing command config list
info:    Getting config settings
data:    Setting  Value
data:    -------  -----
data:    mode     arm
```

###モードの変更

下記はasmへの変更。現在がasmならarmとする。

```bash
azure config mode asm
```

##リソースの制御

何はなくてもとりあえず一覧。VMやStorageやらとりあえず区別せずに表示。

###一覧

```bash
azure resource list
```

リソースグループを指定した一覧。

```bash
azure resource list testRG
```

###削除

リソースコマンド？で削除するのは少々難儀です（いろいろ指定しないといけない）。
一番簡単な（引数が少ない）のはresouce listで得られるリソースIDとapiVersionを指定するもの。

```bash
azure resource -i RESOURCE_ID -o "2015-08-01"
```

正直、最新のapiVersionをどう確認するかなどよくわかっていない。おそらくは[ここ](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-supported-services)のSchemaのところを-oで与えるのかなと。
vm deleteとか、専用のコマンドを利用するほうがスッキリする。

##リソースグループの制御

テスト環境を作っていると無意識のうちにリソースグループが作られてしまう。UIで消すのは手間なのでコマンドで消したい。

###一覧表示

まずは一覧。

```bash
azure group list

info:    Executing command group list
+ Listing resource groups
data:    Name                                Location   Provisioning State  Tags:
data:    ----------------------------------  ---------  ------------------  -----
data:    AzureCloudService1                  eastus     Succeeded           null
data:    Default-ApplicationInsights-EastUS  eastus     Succeeded           null
data:    Default-Storage-JapanEast           japaneast  Succeeded           null
```

###削除

そして削除。

```bash
azure group delete AzureCloudService1

info:    Executing command group delete
```

>リソースグループを削除すると、所属する全てのリソースが削除されます。

###作成

あまり使いませんが。。。ロケーション名の一覧取得は下記参照。

```bash
azure group create GROUP_NAME japneast
```

##ロケーション

VM作成時等にオプションで必要なのでとりあえず一覧の取得だけ覚えておく。

###一覧

```bash
azure location list
```

japaneastとjapanwestくらいは覚えておけますが。。。まあ、一応。

```bash
~
data:    Location    :  japanwest
data:    DisplayName :  Japan West
data:    Providers   :  Microsoft.ApiManagement, Microsoft.Batch, Microsoft.ClassicCompute, Microsoft.ClassicNetwork...
data:
data:    Location    :  japaneast
data:    DisplayName :  Japan East
data:    Providers   :  Microsoft.ApiManagement, Microsoft.Batch, Microsoft.ClassicCompute, Microsoft.ClassicNetwork...
~
```

##VMを制御する

利用するのはもっぱらCentOSなのでその方法。

###利用できるVM一覧を見る

LocationとPublisherという概念があるらしく、それを指定する。単にazure vm image listとすると対話的に聞いてきてくれる。

```bash
azure vm image list japaneast OpenLogic
```

下記のような感じ（抜粋）で一覧が表示される。このうち生成時に必要な情報はUrnというやつらしいのでメモしておく。

```bash
+ Getting virtual machine image offers (Publisher: "OpenLogic" Location:"japaneast")
data:    Publisher  Offer       Sku   OS     Version       Location   Urn
data:    ---------  ----------  ----  -----  ------------  ---------  -------------------------------------
data:    OpenLogic  CentOS      6.5   Linux  6.5.201501    japaneast  OpenLogic:CentOS:6.5:6.5.201501
data:    OpenLogic  CentOS      6.5   Linux  6.5.201503    japaneast  OpenLogic:CentOS:6.5:6.5.201503
data:    OpenLogic  CentOS      6.5   Linux  6.5.201506    japaneast  OpenLogic:CentOS:6.5:6.5.201506
data:    OpenLogic  CentOS      6.5   Linux  6.5.20150904  japaneast  OpenLogic:CentOS:6.5:6.5.20150904
data:    OpenLogic  CentOS      6.5   Linux  6.5.20160309  japaneast  OpenLogic:CentOS:6.5:6.5.20160309
```

###VMを作る

VMをコマンドラインで作るのはいろいろと準備が必要で少々手間がかかります。開発や運用でスクリプト化して自動化したい！などのニーズがない限りはWebポータル使う方がいいでしょう。

少なくとも作成に際しては事前に下記項目の名称を決めたり、作成しておく必要があるようです。

* リソースグループ
* VM名
* ロケーション
* OSのタイプ
* 利用するVMのバージョン(Urn)
* VMのサイズ
* NICの名前
* VNETの名前（それと、prefix 192.168.0.0/16など）
* VNETのサブネットの名前（それと、prefix 192.168.1.0/24など）
* adminユーザー名
* sshの公開鍵

さらにインターネットへの公開のためには、

* グローバルIP
* セキュリティーグループとルールの設定

も必要です（実際は必須かと思います）。

私の場合、生成と削除くらいを自動化できればいいので下記のようなコマンドを利用します（上記、必須部分のみ生成）。
VMを生成した後、WebポータルでIPやセキュリティーグループの割当を（NICに対して）行います。

VM生成に必要な全てのリソースをコマンドで生成する方法については[こちら](http://qiita.com/mgoldchild/items/6c8aa625311482dfdc96)の記事が参考になります。

```bash
  azure vm create \
  -g RESOUCE_GROUP \
  -n VM_ANME \
  --location japaneast \
  --os-type Linux \
  --image-urn OpenLogic:CentOS:6.8:6.8.20161026 \
  --vm-size Standard_A0 \
  --nic-name NIC_NAME \
  --vnet-name VNET_NAME \
  --vnet-subnet-name VSUBNET_NAME \
  --admin-username ADMIN_NAME \
  --ssh-publickey-file ~/.ssh/id_rsa.pub
```

このコマンドを実行すると、VNETとSUBNETのprefixを聞いてきますので例えば下記のように答えます。

```bash
Enter vnet address prefix:  192.168.0.0/16
Enter vnet subnet address prefix:  192.168.1.0/24
```

完全自動化するためには予め作成したVNET等を指定するほうが無難でしょう。

###VMの一覧

```bash
azure vm list
```

###VMの削除

```bash
azure vm delete RESOURCE_GROUP VM_NAME
```

##Storageを制御する

###ストレージ（アカウント）の一覧

```bash
azure storage account list
```

###ストレージ（アカウント）の削除

```bash
azure storage account delete SACCOUNT_NAME
```

対話的にリソースグループ名を聞いてくるようです。