組織内のAzure VMを自動停止させる仕組みを導入してみた

株式会社船井総研デジタルの@fsd-jumeです。
Azure初心者も恐れることなくAzureを触れるようになることを目標に毎回記事を投稿しております。
そのため、内容は各技術の表面的な部分であることが多いので、さらに詳しく知りたい方は他の方も様々な記事を投稿しておりますので、ぜひそちらも含めて知識を深めていただけたらと思います。
私の投稿では、その入り口になれば幸いです。

## 今回のテーマ
今回は組織内で稼働していたAzure VMの停止を忘れており、使用していない業務時間や祝休日も稼働していて無駄なコストが発生しておりました。
そのため、ヒューマン運用として各個人が気を付けるだけでなく、自動的に停止させる仕組みを導入することになり、その中で手軽に自動化できる「Start/Stop VMs v2」を今回導入いたしました。
本投稿では「Start/Stop VMs v2」を導入する手順について簡単にご紹介いたします。

## Start/Stop VMs v2
「Start/Stop VMs v2」はAzure VMを自動で起動/停止することができる、複数のAzureサービスからなるソリューションです。
こちらのソリューションをデプロイするだけで、簡単に指定の時刻でVMの起動/停止を自動化できます。
また、対象となるVMも下記の通り設定可能です。(下記はそれぞれ個別に設定可能)
・サブスクリプション/リソースグループ/リソース(VM)単位で指定可能
※除外設定も可能
・専用のタグをつけて起動/停止の順番を指定可能
・CPUの使用率に基づいて対象となるVMを自動選定可能

https://learn.microsoft.com/ja-jp/azure/azure-functions/start-stop-vms/overview

## 今回導入したい仕組み
・毎日22時に対象サブスクリプション内のVMを停止
・特定のVMは自動停止をさせない

## Start/Stop VMs v2の構成方法
**1. Start/Stop VMs v2をデプロイ**
**2. Start/Stop VMs v2の設定を変更**

### 1. Start/Stop VMs v2をデプロイ
**1-1. 下記のリンクにアクセスします。**
[Start/Stop VMs during off-hours overview (V2)](https://github.com/microsoft/startstopv2-deployments/blob/main/README.md)

**1-2. リンク内の「Deploy to Azure」を押すと、Azure PortalのStart/Stop VMs v2デプロイ画面が開きます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/832ef603-3871-7c7a-f316-cb689825e7e3.png)

**1-3. プランを「StartStopV2」にして作成を押すと、作成画面に移ります。**
※「StartStopV2-AZ」は可用性ゾーンのプランです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/817d0249-a96a-4faa-042e-e58a0cfea343.png)

**1-4. 必要な項目を入力/選択し、「確認および作成」を押すとデプロイの検証が実行します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/dd0d806e-4fe9-40a1-7165-0d20f5bae3dd.png)
**※各項目の説明**
| 表示内容 | 説明 |
|:-:|:-:|
| サブスクリプション | デプロイするサブスクリプションを指定 |
| リージョン | デプロイするリージョンを指定 |
| Resource Group Name | デプロイするリソースグループを指定(専用に新規で作成することを推奨) |
| Azure Function App Name | VMの起動/停止を実行するAzure Functionの名前を指定 |
| Application Insights Name | テレメトリデータを収集するApplication Insightsの名前を指定 |
| Application Insights Region | Application Insightsのリージョンを指定 |
| Storage Account Name | 実行テレメトリを格納するストレージアカウントの名前を指定 |
| Email Addresses | 指定したアドレスに起動/停止の通知を送付(省略可) |

**1-5. 「検証に成功しました」と表示されたら、「作成」を押してデプロイします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/90e65d12-f0f2-62e3-d452-408dc40dc939.png)

**1-6. 画面が切り替わって、「デプロイが完了しました」と表示されれば、デプロイは完了です。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/c197970f-21bf-7db0-d7e1-0991159446d3.png)

### 2. Start/Stop VMs v2の設定を変更
**2-1. 作成したリソースグループを開き、「ststv2_vms_Scheduled_stop」を開きます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/2a9088c9-b6f6-a4e5-c4eb-9e5cafb3cf65.png)
**※各ロジックアプリの使用用途**
| ロジックアプリ名 | 使用用途 | 実施する動作 |
|:-:|:-:|:-:|
| ststv2_vms_AutoStop | CPU使用率で判断したい場合 | 停止 |
| ststv2_vms_Scheduled_start | 指定した時刻で**一度に**実行したい場合 | 起動 |
| ststv2_vms_Scheduled_stop | 指定した時刻で**一度に**実行したい場合 | 停止 |
| ststv2_vms_Sequenced_start | 指定した時刻で**順番に**実行したい場合 | 起動 |
| ststv2_vms_Sequenced_stop | 指定した時刻で**順番に**実行したい場合 | 停止 |

**2-2. 左の「開発者ツール」から「ロジックアプリデザイナー」を押すと、設定画面が表示されます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/4cefdfed-1d05-65cf-cf4d-a1ee6f81dee0.png)

**2-3. 画面の「Recurrence」を押すと編集できるようになるので、実行したい時刻を指定します。**
※今回は毎日22時に停止させたいので下記の通り指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/4b20eff0-6784-7c7e-81cc-8a3e823339b5.png)

**2-4. 画面の「Function-Try」を押し、さらに「Scheduled」を押すと「要求本文」が表示されるので、「要求本文」を下記の通り修正し、左上の「保存」を押します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/012f9104-ff4c-4a8d-7c11-bb77efac4c50.png)
**修正内容**
```json:
{
  "Action": "stop",
  "EnableClassic": false,
  "RequestScopes": {
    "ExcludedVMLists": [
      "/subscriptions/例外VMのサブスクリプションID/resourceGroups/例外VMのリソースグループ名/providers/Microsoft.Compute/virtualMachines/例外VM名"
    ],
    "Subscriptions": [
      "/subscriptions/停止対象のサブスクリプションID/"
    ]
  }
```
**各パターンに応じた書き方の例**
```json:指定したサブスクリプション内をすべて対象にする場合
    "Subscriptions": [
      "/subscriptions/対象のサブスクリプションID/"
    ]
```
```json:指定したリソースグループ内をすべて対象にする場合
    "ResourceGroups": [
      "/subscriptions/対象のサブスクリプションID/resourceGroups/対象のリソースグループ名/"
    ]
```
```json:指定したVMを対象にする場合
    "VMLists": [
      "/subscriptions/対象のサブスクリプションID/resourceGroups/対象のリソースグループ名/providers/Microsoft.Compute/virtualMachines/対象のVM名"
    ]
```
```json:例外のVMを設定したい場合
    "ExcludedVMLists": [
      "/subscriptions/例外VMのサブスクリプションID/resourceGroups/例外VMのリソースグループ名/providers/Microsoft.Compute/virtualMachines/例外VM名"
    ]
```

**2-5. 最後に左の「概要」から画面中央の「有効」を押すと、ロジックアプリが有効化され、Start/Stop VMs v2の設定は完了です。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/7707688b-1a79-96c4-5c6c-ff53c24feef2.png)

### 最後に
これで設定は完了し、時間になれば自動で対象サブスクリプション内のVMを毎日22時に自動停止してくれるようになりました。
他にもまだまだ細かい設定なども可能なので、これからもAzureの知見を深めて、ナレッジを投稿していきたいと思います。