CPUSTRES.EXEを用いたAzure VMSSスケールアウト/スケールイン検証

MSのドキュメントにはポータルでのVMSS作成手順について記載がなかったため、動作確認も含めてまとめてみました。

#目次
検証手順
　1. VMSSの作成
　2. オートスケーリングの構成
　3. VMSSインスタンスに接続する
　4. オートスケールアウトを確認する
　5. オートスケールインを確認する
検証後の気づき
参考知識

#検証手順
##1. VMSSの作成
AzureポータルからVMSSを検索、サービス画面に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/26f71dce-cf84-c17e-4380-2a303634f1d5.png)
[＋追加]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/0bcfa2ef-909b-eed5-e90b-4694de0ac3e0.png)

スケールセットの作成画面“基本”で以下の情報を入力。

------------------------------------------------------------------
リソースグループ：VMSStest(任意)
スケールセットの名前：fukaVMSS(任意)
地域：東南アジア(任意)
イメージ：WindowsServer2012R2Datacenter(任意ですが、今回の手順はWindowsServer用です)
サイズ：D2s v3(任意)
認証の種類：パスワード
ユーザー名/パスワード：任意

------------------------------------------------------------------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/5464523e-67d3-39a7-ba63-162066d20f4b.png)

スケールセットの作成画面“ネットワーク”で以下の情報を選択。

------------------------------------------------------------------
仮想ネットワーク：VMSStest-vnet(任意)
“ネットワークインターフェイスの編集”を選択し、
以下情報を選択してインスタンスへのRDP接続を許可(後からでも設定可能)
NICネットワークセキュリティグループ：Basic
パブリック受信ポート：選択したポートを許可
受信ポートを選択：RDP

------------------------------------------------------------------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/d59c9b4b-66bb-0f06-b17b-bb8f8bb4b9ee.png)

スケールセットの作成画面“拡大縮小中”で右の情報を入力。

------------------------------------------------------------------
初期インスタンス数：1
スケーリングポリシー：手動(後手順で別途カスタムポリシーを作成)
“確認および作成”の検証で問題なければ[作成]をクリックする。(デプロイ完了まで数分かかります)

------------------------------------------------------------------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/53ba9e5d-299d-8a4e-4763-ec1d71f24bf4.png)


##2. オートスケーリングの構成
再度VMSSのサービス画面に移動し、スケールセットが作成されていることを確認する。
一覧から手順1で作成したスケールセットをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/df22aa7b-ec28-8d0e-e683-116c3cbecd24.png)

メニューから[拡大縮小中]を選択し、カスタム自動スケーリングの設定を行う。
“インスタンスの制限”は最小1、最大値3、既定1とする。
[スケーリング条件を追加する]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/e09cd99c-58b0-9ea3-c028-9f09fa755599.png)

[規則を追加する]をクリックし、“スケールルール”で以下の通りパラメーターを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/60b63497-ca9e-1ba7-ecc2-5668f76d3592.png)

再度[規則を追加する]をクリックし、“スケールルール”で以下の通りパラメーターを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/3a91abb8-1357-3180-40ac-131b26ac5829.png)

画面上部の[保存]をクリックする。

####これらの規則により、CPUの使用率が70％を超える状態が5分間続くとインスタンスが1つ増え（スケールアウト）、CPUの使用率が20％を下回る状態が5分間続くとインスタンスが1つ減ります（スケールイン）。


##3. VMSSインスタンスに接続する
VMSSのサービス画面から作成したスケールセットを選択し、メニューから“インスタンス”をクリックする。現在1つのインスタンスが実行中であることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/71106e40-b716-9aa4-2feb-0dcd57684ce7.png)

表示されているインスタンスをクリックし、[接続]から[RDPファイルをダウンロード]をクリックする。ファイルをクリックし、手順1で設定したユーザー名/パスワードを入力してサインインする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/8814edbb-9334-ddab-67ed-779883170e10.png)


##4. オートスケールアウトを確認する
接続先インスタンスでブラウザを開き、CPUSTRES.EXEをダウンロードする。
タスクバーを右クリックし、“Task Manager”をクリック、起動する。
画面下の[More details]をクリックし、[Performance]タブを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/f4e9ac77-2c2a-3b67-877a-aaa641b4f65b.png)

CPUSTRES.EXEをダブルクリックで起動し、4つのスレッドのパラメーターを次のように設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/b1c992a9-7174-591c-7d29-844b304d56d4.png)

“Task Manager”のグラフでCPU使用率がほぼ100％になっていることを確認する。
Azureポータルに戻り、VMSSのインスタンス数が3に増えることを確認する。(更新されるまでに5分かかります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/04b24c87-d98a-5728-bee7-2fb940d2c7ba.png)


##5. オートスケールインを確認する
CPUSTRESを閉じると“Task Manager”のグラフでCPU使用率が急激に落ちることを確認する。
Azureポータルに戻り、VMSSのインスタンス数が1に減ることを確認する。(更新されるまでに5分かかります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/0f38a9d2-bd07-2dcd-3879-34aa2de95b6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/9993b9ff-80a0-7fbf-c0b1-c4a5d14b846f.png)


#検証後の気づき・疑問
・今回は仮想マシンの数が負荷に応じて変化する水平方向のスケーリング（スケールアウト/スケールイン）を試したが、実際の運用では仮想マシンのサイズを増減させる垂直方向のスケーリング（スケールアップ/スケールダウン）も検討する必要がある。特にインスタンスの使用率が低い場合はスケールインだけでなくスケールダウンすることでよりコストパフォーマンスの高い構成が可能になるかもしれない。

・どれくらい急激な負荷の増減に対応できるのか
　→増加が急激な場合やインスタンスの起動に数分かかる場合はインスタンスの増減が間に合わなかったりするらしい。（具体的には未検証）AWS・Azure・GCPでどのくらい違うのかも気になる。
　　→これに対してAWSでは機械学習で負荷を予測して事前に備える[予測スケーリング機能](https://dev.classmethod.jp/articles/predictive-aws-autoscalling/)がある。
　　　Azureには現状同様の機能はないが、サービスの組み合わせ次第で実現できるのかも今後検証したい。

・負荷がある程度予測できるものなのか、突発的なものにも備える必要があるのかで構成や設定が変わるはず
【ある程度決まった時間の場合】
　時間とインスタンス数を指定する
【急激な負荷増に対応する場合】
　CPU使用率に応じてスケールアウトを設定する
【負荷が少ないときにインスタンス数を抑えてコスト削減】
　CPU使用率に応じてスケールインを設定する

・インスタンスに何らかのアップデートやスキャンが走る場合もCPU上がることも考慮する必要あるかも

・実際にインスタンスにトラフィックを通す場合はLBを経由して各インスタンスに分散させる構成にする必要がある

#参考知識
・VMSSインスタンスのWindowsライセンス料金について
　→Scale Sets使用に対する課金はなく、通常の仮想マシン料金のみ。
　　Azure仮想マシンで用意されているOSイメージは、いずれもAzureの利用料金に含まれており、別途ライセンス料は必要ない。

・スケーリングで特定インスタンスを停止可能か
【手動スケーリングの場合】
　ポータルから指定のインスタンスに対し、「割り当てを解除」することが可能
![割り当て解除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641192/d74ee89f-a5ff-edd3-4d10-c6d6b3f06d21.png)
　また、以下コマンドでも可能
[Stop-AzureRmVmss](https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/stop-azurermvmss?view=azurermps-6.13.0)

```
Stop-AzureRmVmss
    [-ResourceGroupName] <String>
    [-VMScaleSetName] <String>
    [[-InstanceId] <String[]>]
```


【オートスケーリングの場合】
　できなさそう…？（方法見つけたら更新します）