Start/Stop VMs v2 -  VMの自動起動／停止でコスト削減

# はじめに
<a href="https://qiita.com/advent-calendar/2021/microsoft-azure-tech">Microsoft Azure Tech | Advent Calendar 2021</a> 16 日目の記事です。

最近 v1 から v2 にバージョンアップした **Start/Stop VMs v2** についてご紹介します。
Start/Stop VMs v2 の基本的な使い方については、<a href="https://docs.microsoft.com/ja-jp/azure/azure-functions/start-stop-vms/overview">公式ドキュメント</a>や、Japan Azure PaaS Support Team の<a href="https://jpazpaas.github.io/blog/2021/11/29/introduce-Start-Stop-VMs-v2.html">チームブログ</a> 等ですでに紹介されていますので、本記事では Start/Stop VMs v2 を導入した場合のコスト削減効果に焦点を当てて考察した内容を述べようと思います。
なお、本記事の執筆時点では Start/Stop VMs v2 はプレビュー段階の機能であり、通常のサービスレベル契約は適用されませんので、ご注意ください。

# Start/Stop VMs v2 とは
**Start/Stop VMs v2** は、ユーザー定義のスケジュールで Azure 仮想マシン (VM) を起動または停止させることのできるソリューションです。VM の起動／停止 は 予め用意された 5 つの ロジック アプリ によって実現されます。
VM の起動／停止を制御するためのトリガーには以下の 3 種類があり、ユーザーは要件に応じて最適なものを選択できます。

| トリガー種類 | 機能 |
|:--|:--|
| Scheduled | 指定したスケジュールに基づいて、 VM を起動/停止します。 |
| Sequenced | 事前に定義されたシーケンス処理タグの付いた VM に対して順番に起動/停止を行います。 |
| AutoStop |  CPU 使用率に基づき、 VM の停止を行います。 |
<img width="680" alt="image01" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/6a5e4836-6d01-02ed-ecba-b959e579af68.png">

導入方法と基本的な設定については、**Japan Azure PaaS Support Teams** が以下のブログ記事で分かりやすく解説していますので、ご参照ください。

* [Start/Stop VMs v2 のご紹介 - Japan PaaS Support Team Blog](https://jpazpaas.github.io/blog/2021/11/29/introduce-Start-Stop-VMs-v2.html)

# 仮想マシン (VM) の稼働コスト
Azure 仮想マシン (VM) への課金は インスタンスの電源の状態に応じて発生します。VM の電源が完全に切られた状態（「**割り当て解除済み**」と称されます）を除き、VM の実行時間に対して課金されます。誰も VM を使用していない時間帯でも VM の電源が切られていない限りは課金対象となるため、VM を 24 時間 365 日実行している場合、不要なコストが発生している可能性があるのです。
Start/Stop VMs v2 による自動停止では VM は割り当て解除済みの状態となります。

| 電源状態 | 課金 |
|:--|:--|
| 開始中 ～ 実行中 | 課金されます |
| 停止中 ～ 停止済み | 課金されます |
| 割り当て解除中 ～ 割り当て解除済み | 課金されません |
詳しくは以下をご参照ください。

* [Azure Virtual Machines の状態と課金状態](https://docs.microsoft.com/ja-jp/azure/virtual-machines/states-billing)

# コスト削減のシナリオ
Start/Stop VMs v2 の機能を使って必要な時間帯だけ VM を起動させることによって、VM のコストを最適化させることが可能になります。以下のシナリオに沿って検証してみます。

### シナリオ
A社では、複数のプロジェクトの開発環境として合計 5 つの Azure VM を運用しています。5 つの VM は同一のリソース グループに属しており、構成はすべて共通です。

| 構成の項目 | 設定値 |
|:--|:--|
| リージョン | 東日本 |
| イメージ | Linux (Ubuntu Server LTS) |
| サイズ | Standard D4s v3 (4 vcpu、16.0 GiB メモリ) |
| データ ディスク | 追加なし |

開発コスト見直しの目的で VM の使用状況を調査したところ、平日夜間や休日など、VM へのアクセスが発生しない時間帯を特定できたため、以下のスケジュールで 自動起動／停止を行うことにしました。

* 自動起動　：　月、火、水、木、金　AM 9:00
* 自動停止　：　月、火、水、木、金　PM 9:00

<img width="680" alt="image02" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/2c18a041-eb36-0c27-cc00-707dfa09bb09.png">

# VM の計画停止による削減コストを調べる

アクセスがない時間帯に VM を計画停止させることで、課金にはどれほどの影響があるでしょうか。Azure の **料金計算ツール** を使って、このシナリオで VM を計画停止させた場合の 1か月あたりの削減コストを見積もることが可能です。
当シナリオでは、料金プランは従量課金制で、予約による割引オプションはないものとします。
<font color="red">※ 後述の見積もり結果はすべて、本記事の執筆時点のものとなります。料金は変動する可能性がありますのでご注意ください。</font>

* [料金計算ツール | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/calculator/)

### 1. VM を 24 時間起動させた場合
`5 台`の VM を 1 日 24 時間、1 か月（30 日間とします）起動させた場合の料金を計算します。
VM 1 台につき、起動時間の合計は `24 時間　×　30 日間 = 720 時間` です。
当シナリオの構成による VM の 1 時間あたりの料金は 本記事の執筆時点で `$0.258` ですので、1 か月あたりの見積もり料金は以下となります。
`720 時間/月　×　5 台　×　$0.258 /時　=　$928.85 /月`
<img width="680" alt="image03" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/3ff9b221-d965-12c4-d78a-b4efc47decc3.png">

### 2. VM を 計画停止させた場合
`5 台`の VM を 平日夜間と休日に計画停止させた場合の料金を計算します。
AM 9:00 - PM 9:00 のみ起動させた場合、1 日の起動時間は 12 時間です。30 日のうち、平日が 22 日、土日が 8 日である月を想定すると、VM 1 台あたりの起動時間の合計は `12 時間　×　22 日間 =　264 時間` です。 
当シナリオの構成による VM の 1 時間あたりの料金は 本記事の執筆時点で `$0.258` ですので、1 か月あたりの見積もり料金は以下となります。
`264 時間/月　×　5 台　×　$0.258 時　=　$340.61 /月`
<img width="680" alt="image04" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/db13965a-40da-c18e-f14c-e6aa6890785f.png">

### 3. コストの差分
5 台の VM を 24 時間起動させた場合と、使われない時間帯に計画停止した場合とのコストを比べてみます。
コスト差分（月間）： `$928.85 /月　-　$340.61 /月　=　$588.24 /月`
月間で `$588.24` のコスト削減が予想されます。年間では `$7,058.88` にもなり、かなりの効果が期待されます。
OS の種類やインスタンスのサイズによってコスト差分は変動します。以下の表は一例です。
<font color="red">※ 料金は本記事執筆時点のものです。</font>
<img width="680" alt="image05" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/259bc77d-6a1e-1d40-23da-7a5a24ba5de4.png">

# Start/Stop VMs v2 自体にかかるコストを調べる

Start/Stop VMs v2 によるコスト削減効果はこれまでに説明した通りですが、Start/Stop VMs v2 の利用自体にはどれほどのコストが発生するのでしょうか？

### Start/Stop VMs v2 の使用リソース
Start/Stop VMs v2 をデプロイすると、ロジック アプリやダッシュボード、ストレージなど、10 個のリソースが作成されます。
このうち、**ストレージ** と **Application Insights** （**Azure Monitor** の機能です）に対しては Start/Stop VMs v2 のデプロイ時点から継続して課金が発生します。対して、VM の起動／停止に関わる **ロジック アプリ** と **関数アプリ** は実際に実行された回数に応じて課金が発生します。
<img width="500" alt="image06" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/7f5ffc96-950b-5cce-1d47-3038168624ad.png">

### 1 日あたりのコストと内訳

Azure ポータルで Start/Stop VMs v2 のリソース グループ画面に遷移し、**コスト分析** を選択します。日ごとのコストや指定した期間の累積コスト、コストの内訳などをグラフで視覚的に確認することができます。
<img width="680" alt="image07" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/8cc95cef-305b-0cae-e645-f0a704a2f604.png">
ある日の 1 日あたりのコストは `$0.15` でした。サービス別のコスト内訳を確認します。
<img width="680" alt="image08" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323437/f408017a-8a1b-2e94-be2f-cd8996697a55.png">

| サービス名 | 内容 | コスト |
|:--|:--|:--|
| log analytics | Azure Monitor（ログ分析） | $0.06 |
| azure monitor | Azure Monitor（VM 監視） | $0.05 |
| storage | ストレージ | $0.04 |
| functions | 関数アプリ | $0.01 未満 |
| logic apps | ロジック アプリ | $0.01 未満 |
| bandwidth | 帯域 | $0.01 未満 |

内訳のトップは **Azure Monitor** のサービス合計 `$0.11` で、次に **ストレージ** の `$0.04` となります。この 2 つのサービスの合計が `$0.15` であり、コストのほぼ全てを占めていることが分かります。**関数アプリ** や **ロジック アプリ** は 1 回あたりの実行時間が非常に短いため、コストはほとんどかかりません。
なお、監視対象の VM の台数に応じて これらのコストは変動します。

### VM 停止による削減コスト vs VM 停止にかかるコスト

当シナリオでの Start/Stop VMs v2 の 1 日あたりの平均コストを `$0.15` とすると、1 か月あたりの見積もり料金は以下となります。先に計算した VM の計画停止による１か月あたりの削減コストと比べて非常に低コストです。
* 削減コスト　：　`$928.85 /月　-　$340.61 /月　=　$588.24 /月`
* 発生コスト　：　`$0.15 /日　×　30 日間　=　$4.50 /月`

Start/Stop VMs v2 の導入にあたり、コスト面での心配は必要なさそうです。


# まとめ
Azure のサービスを利用する多くの方にとって、毎月の課金額は気になるところかと思います。あれこれとリソースを作成していたら予算を超えてしまった… というのもよくあるケースです。
Azure VM のコストが気になる開発者のみなさま、今回ご紹介した **Start/Stop VMs v2** をぜひお試しいただき、コスト削減効果をお確かめください。


# 参考リンク
* [Start/Stop VMs v2 (プレビュー) の概要 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/start-stop-vms/overview)
* [Azure Automation の Start/Stop VMs during off-hours の概要 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/automation/automation-solution-vm-management)
* [Start/Stop VMs v2 のご紹介 - Japan PaaS Support Team Blog](https://jpazpaas.github.io/blog/2021/11/29/introduce-Start-Stop-VMs-v2.html)
* [料金計算ツール | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/calculator/)
* [価格の概要 - Azure 価格の仕組み | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/)