カスタムポリシーを使用して強制的に VM の自動シャットダウンを有効化する

Azure VM に自動シャットダウン機能を構成することで、検証用 VMの停止(割り当て解除)忘れによる無駄なコストを回避することができます。

検証用のサブスクリプションにおいて自動シャットダウンの構成を必須ルールとするようなケースでは、Azure Policy で自動シャットダウンを有効化するポリシーを割り当てることが有効です。

Azure Policy には、定義済みの組み込みポリシーと、自由に定義できるカスタムポリシーがあります。現時点では、自動シャットダウンを構成するポリシーは組み込みポリシーに含まれていません。

そこで本稿では、自動シャットダウンを構成するカスタムポリシーの作成方法について記載します。

以下の情報を参考にしました。

techcommunity.microsoft.com

自動シャットダウンの有効化に必要となるリソース

Azure Portal から VM の自動シャットダウン機能を構成すると、以下のリソースが自動作成されます。リソース名には VM 名が含まれており、VM と1対1に対応します。

リソース名

shutdown-computevm-<VM名>

種類 microsoft.devtestlab/schedules

このリソースが存在しない場合は、VM に自動シャットダウンが構成されていないと判断することができます。
また、「このリソースが存在しない場合にリソースを作成する」ポリシーを定義することで、自動シャットダウンを有効化することができます。

カスタムポリシーの作成

ポリシー定義の構成要素

ポリシー定義(JSON)には、以下が含まれます。

  • display name
  • description
  • mode
  • metadata
  • parameters
  • policy rule
    • logical evaluation
    • effect

ポリシー定義のテンプレートの詳細はこちらに記載されています。

learn.microsoft.com

"policyRule"要素には、評価対象リソースと効果*1を指定します。
今回の場合、評価対象リソースに仮想マシンを指定し、効果に”deployIfNotExists”を指定します。

作成したポリシー定義

以下が作成したポリシー定義の概要です。

  1. If ブロックでポリシーの評価対象に VM を指定
  2. Then ブロック内の”effect”に”deployIfNotExists”を指定
  3. Then ブロック内の"details"に、”deployIfNotExists”の対象として自動シャットダウン構成リソースを指定
  4. "details"内の"deployment"に、テンプレートの形式で自動シャットダウン構成リソースのパラメータを指定

定義の中では以下のポリシー関数*2を使用しています。

resourceGroup()

評価対象リソースの親リソースグループのプロパティを取得します

field() 評価対象リソースのフィールド(name, location など)の値を取得します

注意点として、4. のテンプレート部分にはポリシー関数を使用することができません。そのため、"parameters"を使用してポリシーからテンプレートに値を渡しています。 

以下が作成したJSONです。

環境に合わせて修正が必要な箇所はありません。環境に合わせた設定(ポリシー定義の作成先サブスクリプションやリソースグループなど)は、Azure 上でポリシー定義を作成する際に選択します。

また、任意で変更が可能な箇所は赤色で表示しています。特に、自動シャットダウンを実行する時刻、タイムゾーン、通知の有無などはお好みで調整してください。

{
    "type": "Microsoft.Authorization/policyDefinitions",
    "name": "deploy-vm-shutdown-schedule-policyDef",
    "properties": {
      "displayName": "Deploy Virtual Machine Auto Shutdown Schedule",
      "description": "This policy deploys a Auto shutdown schedule for a Virtual Machine.",
      "mode": "all",
      "parameters": {},
      "policyRule": {
        "if": {
          "field": "type",
          "equals": "Microsoft.Compute/virtualMachines"
        },
        "then": {
          "effect": "deployIfNotExists",
          "details": {
            "type": "Microsoft.DevTestLab/schedules",
            "existenceCondition": {
              "allOf": [
                {
                  "field": "Microsoft.DevTestLab/schedules/taskType",
                  "equals": "ComputeVmShutdownTask"
                },
                {
                  "field": "Microsoft.DevTestLab/schedules/targetResourceId",
                  "equals": "[concat(resourceGroup().id,'/providers/Microsoft.Compute/virtualMachines/',field('name'))]"
                }
              ]
            },
            "deployment": {
              "properties": {
                "mode": "incremental",
                "template": {
                  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                  "contentVersion": "1.0.0.0",
                  "parameters": {
                    "vmName": {
                      "type": "string"
                    },
                    "location": {
                      "type": "string"
                    }
                  },
                  "variables": {},
                  "resources": [
                    {
                      "name": "[concat('shutdown-computevm-',parameters('vmName'))]",
                      "type": "Microsoft.DevTestLab/schedules",
                      "location": "[parameters('location')]",
                      "apiVersion": "2018-09-15",
                      "properties": {
                        "status": "Enabled",
                        "taskType": "ComputeVmShutdownTask",
                        "dailyRecurrence": {
                          "time": "2100"
                        },
                        "timeZoneId": "Tokyo Standard Time",
                        "notificationSettings": {
                          "status": "Disabled",
                          "timeInMinutes": 30,
                          "notificationLocale": "ja"
                        },
                        "targetResourceId": "[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]"
                      }
                    }
                  ],
                  "outputs": {}
                },
                "parameters": {
                  "vmName": {
                    "value": "[field('name')]"
                  },
                  "location": {
                    "value": "[field('location')]"
                  }
                }
              }
            }
          }
        }
      }
    }
 }

カスタムポリシーの割り当て

JSON が用意できたら、Azure 上にポリシー定義を作成し、任意のスコープに割り当てます。*3

ポリシーの割り当ての際には、適切なロールを付与したマネージドIDを指定します。今回の場合、仮想マシン共同作成者のロールが付与されていれば問題ありません。

動作確認

ポリシーの割り当て後、既存リソースに対する評価が始まり、ポリシーに準拠していないリソースが検出されます。ポリシーの準拠状況は Azure Portal > [ポリシー] > [コンプライアンス] から確認できます。

※[コンプライアンス] 画面にポリシーの評価が反映されるまでに、ある程度時間がかかります。

既存の VM に自動シャットダウンを構成するために、修復タスクを実行します。

無事、自動シャットダウンが有効化されました。

以降、新規で作成される VM に対しては自動的に自動シャットダウンが有効化されます。

おわりに

ポリシー定義を作成することで、強制的に VM の自動シャットダウンを有効化することができました。他にも効率的なサブスクリプションの管理にカスタムポリシーを役立てていければと思います。

執筆担当者プロフィール
森野 祥平

森野 祥平(日本ビジネスシステムズ株式会社)

主にAzureに携わっています。好きなアーティストはB'zです。

担当記事一覧