新時代到来か！？Windows AzureでCentOSを使った時の勘所


#はじめに

巷ではAWSが流行っているが、Azureを使用してサービス構築をする機会があったので、その時に色々馴染みがない仕組みが多かったので勘所を書いてみる。

#Windows Azureの特徴
* Microsoftが提供しているがLinuxも使用できる
* CentOSもパッケージを提供されているが、なんとサポートがついてる
* [データ転送の料金](http://azure.microsoft.com/ja-jp/pricing/details/data-transfers/)についてAzureデータセンターに入ってくるデータは無料

#こんなかんじで作ってみた

例えば下記の様な構成で構築するときに必要だったことをあげてみる。
webが2台、DBが2台で冗長化構成にする。Userからはhttp(port 80)でアクセス出来るようにする。

**[図1]構成サンプル**
![azure3.png](https://qiita-image-store.s3.amazonaws.com/0/8726/7693a9df-cc7d-bef2-a9fc-ec80f1fe21f1.png "azure3.png")


**[表1]構成マトリックス**

|hostname|private ip|ssh port|affinity|vnet|subnet|availability|service name|strage|data strage|
|---|---|---|---|---|---|---|---|---|---|---|
|vmweb01|10.0.1.4|30101|vmAffinity01|vmNetwork01|vmSubWeb|vmAvaWeb|vmweb|vmStg01|stgWeb01|
|vmweb02|10.0.1.5|30102|||||||stgWeb02|
|vmdb01|10.0.2.4|30201|||vmSubDb|vmAvaDb|vmdb||stgDb01|
|vmdb02|10.0.2.5|30202|||||||stgDb02|

#1.構築のトピック

###1-1.ネーミングセンスが問われる!?

上記の図や表の通り、色々なところに名前を付けなければならないのではじめに決めておいたほうが手戻りが少ない。なぜなら、何も知らずに作り始めたら丸々3回全部作りなおすことにな(ry

###1-2.透明なロードバランサ！？

ナニ言ってんだと言われそうだが、Azureにロードバランサという名前で機能が見えない。Traffic Managerというのがあるがこれは **ロードバランサではない**。

じゃあどこにあるのかというと、クラウドサービス(上記vmweb部分)毎にロードバランサのような負荷分散をしてくれるものがある。エンドポイントを指定してあげると **ラウンドロビン** で振り分けてくれる

|クラウドサービス|負荷分散名|hostname|global port|private port|
|---|---|---|---|---|
|vmweb|vmHttpWeb|vmweb1|80|10080|
|||vmweb2|80|10080|

上記のような場合に、`http://vmweb.cloudapp.net`へアクセスするとvmweb1(またはvmweb2)の10080 portへラウンドロビンでアクセスすることになる。

###1-3.定期メンテに耐える構成を！

どんなタイミングで起きるかまだ良くわかっていないが定期メンテナンスでvmが再起動されるらしい。

全台停止等が起きないように対策が必要だが下記の方法を取ることである程度回避できる

* 可用性セット(avvalability set)に入れることで同時にvmは落ちない
* 可用性セットに沢山vmを入れ過ぎない。メンテは実施されるので確立が上がる。


#2.グローバルIPをコロコロ変えられないようにしたい！

**課題**
初期設定のままだとサーバを停止/起動するとグローバルIPが開放されてしまう。
また、定期メンテナンスなどで再起動されてしまうと予定外に設定変更されてしまう。

**対策**
可用性セット(availability set)を設定することで1つのグローバルIPに対して複数のサーバを存在させることで開放されないようにする。


1台目

```
azure vm create vmweb 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415 azuser
--ssh 30101
--ssh-cert ./key/myCert_azure.pem
--vm-name=vmweb1
--affinity-group=vmAffinity01
--virtual-network-name=vmNetwork01
--subnet-names=vmSubWeb
--availability-set=vmAvaWeb
--vm-size=small
```

2台目

```
azure vm create vmweb 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415 azuser
--ssh 30102
--ssh-cert ./key/myCert_azure.pem
--vm-name=vmweb2
--affinity-group=vmAffinity01
--virtual-network-name=vmNetwork01
--subnet-names=vmSubWeb
--availability-set=vmAvaWeb
--vm-size=small
--connect=vmweb   <---(追加)
```

**こんな方法もある**

2014/5/7に[Reserved IP Addresses](http://msdn.microsoft.com/en-us/library/azure/dn690120.aspx)がリリースされたのでWindows power shellを使うことで固定できるらしい(未検証)


#3.プライベートIPも固定したい！

**課題**
グローバルIPと同様に初期設定のままだとDHCPでの割り当てのため、サーバを停止/起動するとprivate IPも変更されてしまう。

**対策**
[azure power shell](http://www.microsoft.com/web/downloads/platform.aspx)を使用して固定する。

```
Set-AzureStaticVNetIP -VM (Get-AzureVM -ServiceName vmweb -Name vmweb2) -IPAddress 10.0.1.5 | Update-AzureVM
```

#4.DiskI/O分散するためデータストレージを追加するべし！

[azure cli](http://azure.microsoft.com/ja-jp/downloads/)を使用してOS用のストレージとは別にデータストレージを追加することでI/Oを分散させること出来る。

ただ、azure cliはLinuxやmacなどで使えるがWindows power shellに比べると対応が遅いのでmac使いの人とかには環境が統一できなくてちょっと不便なところも。

```
azure vm disk attach-new vmweb1 1000 http://vmweb.blob.core.windows.net/vhd-store/vmweb001.vhd
```

vmでディスクをマウントする

```
fdisk /dev/sdc
mkfs -t ext4 /dev/sdc1
mkdir /data
mount /dev/sdc1 /data
cp -p /etc/{fstab,fstab.`date +"%Y%m%d"`}
blkid
vi /etc/fstab
```

fstabに設定を追加する

```fstab
UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /data   ext4   defaults   1   2
```

#5.swap領域は自分で追加！！

初期設定時はswap領域がないので追加する

```
cp -p /etc/{waagent.conf,waagent.conf.`date +"%Y%m%d"`}
vi /etc/waagent.conf
```

```diff:waagent.conf
@@ -39,10 +39,10 @@
 ResourceDisk.MountPoint=/mnt/resource

 # Create and use swapfile on resource disk.
-ResourceDisk.EnableSwap=n
+ResourceDisk.EnableSwap=y

 # Size of the swapfile.
-ResourceDisk.SwapSizeMB=0
+ResourceDisk.SwapSizeMB=10000

 # Respond to load balancer probes if requested by Windows Azure.
 LBProbeResponder=y
```

```
vi /etc/fstab
```

```fstab
/mnt/resource/swapfile swap swap defaults 0 0
```

#6.大規模に作るならコア数に上限(クォータ制限)を解除！

**課題**
初期設定時はCPU Core数を全VMで20までしか使用できない。

**対策**
これを解除するのには、管理ポータルにてサポートへ連絡する。100コアまでは比較的容易にあげてくれるが、200コアとかになると審査が必要なため時間がかかるようだ。

![Windows_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/8726/42b933e5-bb73-b272-5d02-473602502aa3.png "Windows_Azure.png")

#7.その他

* [Azureでひっそりと動いてる割に重要なプロセスが見つかる！？](http://qiita.com/kuni-nakaji/items/fa609ce5d13c78c4d6d0)

#結局のところ...

**メリット**

* 性能はそれなりに担保されているので上り通信コストが抑えられることでサービスによっては恩恵を受けられる
* ベンチャー企業へのサポートプログラムがある
* 活発に機能拡張が行われている 
* まだ使っている人が少ないので技術的に先行できる可能性がある
* [見積もりツール](http://azure.microsoft.com/en-us/pricing/calculator/?scenario=web)が見やすい気がする


**デメリット**

* まだ発展途上な感じは否めない
* AWSと比べてしまうとまだ基本機能は不足している
* Windows Power shell、azure cli、管理ポータルの順に機能が追加されるのでコマンドを色々使わなければならないのが若干煩雑になる
* サポートに問い合わせて数日待ってからの対応だったりするものがあるので時間がかかるときがある

#まとめ

AWSでうまくいかない事があれば、Azureに乗り換えを検討してみるのもアリかもしれない。

#参考サイト

1. [Microsoft Azure 開発者向け技術情報](http://msdn.microsoft.com/ja-jp/windowsazure/cc947856.aspx)
1. [Microsoft Azure サポート チーム サイト](http://blogs.msdn.com/b/dsazurejp/)
1. [How to attach a data disk to the new virtual machine](http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-tutorial/)
1. [Load Balancing Virtual Machines](http://azure.microsoft.com/en-us/documentation/articles/load-balance-virtual-machines/?fb=ja-jp)
1. [linux スワップ（swap）領域の作成](http://kazmax.zpp.jp/linux_beginner/mkswap.html)
1. [あまりにも良くあるAzure問答集](http://d.hatena.ne.jp/k1hash/20111201/1322721044)
1. [請求書払いへの変更申し込みについて](http://blogs.msdn.com/b/dsazurejp/archive/2013/06/27/azure-invoicing-process.aspx)
1. [Azure サブスクリプション使用制限機能の設定変更について](http://blogs.msdn.com/b/dsazurejp/archive/2013/10/18/msdn-mpn-bizspark-azure.aspx)