Azure CliでVM作った時の備忘録


ポータルぽちぽちはめんどくさいと思って、
公式見ながらcliでやったらもっと面倒くさかった時の備忘録。

# 前提知識
デプロイモデルは２種類ある
クラシック（クラウドサービス）とリソースマネージャー
今回はデプロイモデルはモダンなリソースマネージャーを使う

VM作成には、以下のようにレイヤー毎にいくつかのコンポーネントが必要
![image](https://qiita-image-store.s3.amazonaws.com/0/94686/1872267b-7900-ade0-6907-63155d55beca.png)


流れは以下になる
0. Azure Cliの設定
1. リソースグループの作成
2. コンポーネントの作成
3. VMの作成など


#0. Azure Cliの設定

### Azure cliのインスコ
Nodeを入れて、npmからインスコ

```sh:
$ node -v
v0.12.0
$ npm install -g azure
$ azure -v 
0.9.13
```


### セットアップ

定義ファイル

```sh:var.sh
#!/bin/sh
export USERNAME=hoge
export RGNAME=hogersg # リソースグループ名
export LOCNAME=japanwest # リージョン名
export SANAME=hogesa # ストレージアカウント名
export VNETNAME=hogevnet # VNet名
export SUBID=0fc5e # サブスクリプションID
export SNETNAME=hogesnet # サブネット名
export PIPNAME=hogepip # パブリックIP名
export DNLABEL=hoge # DNSラベル(FQDNのホスト)
export NSGNAME=hogensg # NSG名
export NSGRULENAME=hogensgrule # NSGルール名
export NICNAME=hogenic # NIC名
export URN=CoreOS:CoreOS:Stable:835.9.0 # image名
export VMNAME=hogevm # vm名
export ADDRSPACE= 192.168.0.0/16 # アドレス空間
export SNETADDR=192.168.1.0/24 # サブネットアドレス
export LIPADDR=192.168.1.5 # ローカルIPアドレス
```

先にMSのアカウントを作成し、Azureに登録してサブスクリプションを手に入れる。

```
$ source var.sh 
$ azure login # ログイン処理
$ azure account list # サブスクリプション一覧
$ azure account show # 自分のサブスクリプションの情報の確認
$ azure account set <RGNAME> true # サブスクリプションIDの切り替え
```

# 1. リソースグループの作成

### デプロイモデルの選択
```sh
$ azure config mode arm # アジュールリソースマネージャーモードを選択
$ azure config list # 確認
$ azure group create -n <RGNAME> -l <LOCNAME>
$ azure group list # 確認
```
デプロイモデルについては
https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-azure-resource-manager/

# 2. コンポーネントの作成

### ストレージアカウントの作成
```sh
$ azure storage account create <SANAME> --type LRS -g <RGNAME> \
 -l <LOCNAME> -s <SUBID>
$ azure storage account show <SANAME> -g <RGNAME> --json # storage accountの作成確認
$ azure storage account keys list <SANAME> -g <RGNAME> # access key のキーの確認
$ azure storage account connectionstring show <SANAME> -g <RGNAME> # connection string の確認
```
※ storage accountのリソース作成などにはaccess keyまたはconnection stringを使った接続方法がある


### 仮想ネットワークの作成

```sh
$ azure network vnet create -g <RGNAME> -n <VNETNAME> -a <ADDRSPACE> \
 -l <LOCNAME>
$ azure network vnet list -g <RGNAME> --json # VNETの確認
```

VNETの設定の詳細はここ
https://msdn.microsoft.com/en-us/library/azure/jj157100.aspx

### サブネットの作成
```sh
$ azure network vnet subnet create -g <RGNAME> --vnet-name <VNETNAME> \
-n <SNETNAME> -a <SNETADDR>
$ azure network vnet subnet list -g <RGNAME> --vnet-name <VNETNAME> # サブネットの確認
```
ちなみに、サブネットの通信には仮想アプライアンスがあり、仮想のルーターがIPフォワーディングしていると思う。

### パブリックIPの作成
```sh
$ azure network public-ip create -g <RGNAME> -n <PIPNAME> \
 -l <LOCNAME> --allocation-method Static --domain-name-label <DNLABEL>
$ azure network public-ip list -g <RGNAME> # パブリックIPの確認(NICなのでまだPIPはない)
```

ドメイン・ネームラベルは、\<LABEL\>.\<REGION\>.cloudapp.azure.comとなる

### ネットワークセキュリティグループの作成
```sh
$ azure network nsg create -g <RGNAME> -n <NSGNAME> -l <LOCNAME>
$ azure network nsg list -g <RGNAME> --json # NSG作成の確認
```

### ネットワークセキュリティグループのルール(SSH Port Allow)の追加
```sh
$ azure network nsg rule create -g <RGNAME> -a <NSGNAME> \
-n <NSGRULENAME>  --source-port-range '*' \
 --destination-port-range 22 --access Allow
$ azure network nsg rule list -g <RGNAME> -n <NSGNAME> # firewallのruleの確認
```


### ネットワークインターフェイスの作成
```sh
$ azure network nic create -g <RGNAME> -n <NICNAME> \
-l <LOCNAME> --network-security-group-name <NSGNAME> \
-a <LIPADDR> --subnet-name <SNETNAME> --subnet-vnet-name <VNETNAME>
$ azure network nic list -g <RGNAME> --json # 確認
```
※VNETとNICは同一リージョンの必要がある


# 3. 仮想マシンの作成

### VM image(URN)を探す

```sh
$ azure location list　# location名を調べる
$ azure vm image list-publishers <LOCNAME> # これでPublisherとlocationが分かる。例えばCoreOS, japanwestなど
$ azure vm image list-offers <LOCNAME> CoreOS # location, publisherからOfferを調べる
$ azure vm image list <LOCNAME> CoreOS CoreOS # location, offer, publisherからUrnを調べる
```

### SSLログインキーを作成
```sh
$ ssh-keygen -t rsa -b 2048 -f ./kagi
$ chmod 600 kagi
```

### VMの作成
```sh
$ azure vm create -g <RGNAME> -n <VMNAME> \
--location <LOCNAME> --nic-name <NICNAME> \
--os-type Linux --image-urn <URN> --admin-username <USERNAME> \
--vm-size Standard_A1 --ssh-publickey-file ./kagi.pub \
--public-ip-name <PIPNAME> --vnet-name <VNETNAME> \
--vnet-subnet-name <SNETNAME> --storage-account-name <SANAME>
$ # azure vm quick-create -s <SUBID>
```

--availset-name
--vnet-subnet-address-prefix
--storage-account-container-name
--os-disk-vhd
--custom-data
--disable-boot-diagnostics

※仕様は以下になってる
・もしなかったらNICは自動生成
・NICはVMに複数参照可能
・もしなかったらPIPは自動生成

VMのサイズは以下
https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-size-specs/

### 接続テスト
```sh
$ azure vm list # 確認
$ ssh -i ./kagi -l <USERNAME> <USERNAME>.<LOCNAME>.cloudapp.azure.com # sshログイン
```

### リソースグループ削除
```
$ azure group list # 確認
$ azure group delete <RGNAME>
```
# 参考文献

https://azure.microsoft.com/en-gb/documentation/articles/load-balancer-get-started-ilb-arm-cli/
http://qiita.com/adeonhy/items/21f06b489c958f7678a5
https://lazure2.wordpress.com/2015/07/11/microsoft-cloud-state-of-the-art-hyper-scale-azure-with-host-sdn-iaas-2-0-hybrid-flexibility-and-freedom/
https://github.com/Azure/azure-content/blob/master/articles/virtual-network/virtual-networks-static-private-ip-arm-cli.md
https://azure.microsoft.com/en-us/blog/announcing-reverse-dns-for-azure-cloud-services/