🚓

Azure リソース作成時に自動的にメトリックのアラート ルールを設定したい

2024/03/23に公開

はじめに

タイトルの通りなのですが、Azure リソースが作成された際にメトリックのアラート ルールを自動的に設定したいということで、Azure ポリシーで実現できないか考えてみました。

検討

今回の検討のターゲットは VM にしています。(VM は新規作成時に推奨アラートを設定できるようになっていますが、今回は設定を強制するという意味合いもあり)
仕組みとしては、Azure ポリシーの if の条件で type を "Microsoft.Compute/virtualMachines" として、deployIfNotExist でアラート ルールをデプロイすればよいのでは?と考えていました。ですが仕様などを確認していると、VM リソースのパラメータにアラート ルールに関連するものがないため、existenceCondition の field に指定できるものがない (別リソースであるアラート ルールのパラメータは指定できない) ことが分かりました。
要は、以下のようなことができない、ということです。

NG のポリシー定義
{
  "mode": "All",
  "policyRule": {
    "if": {
      "field": "type",
      "equals": "Microsoft.Compute/virtualMachines"
    },
    "then": {
      "effect": "deployIfNotExists",
      "details": {
        "type": "Microsoft.Insights/metricAlerts",
        "roleDefinitionIds": [
          "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
        ],
        "existenceCondition": {
          "allOf": [
            {
              "field": "name",
              "like": "[concat('High CPU Alert - ', field('Microsoft.Compute/virtualMachines/name'))]"
            }
          ]
        },
        "deployment": {
          "properties": {
            "mode": "incremental",
            "template": {
              // ARM テンプレート内容
            },
            "parameters": {
              // ARM テンプレート渡すパラメータ
            }
          }
        }
      }
    }
  },
  "parameters": {}
}

そのため、代替策として以下のような構成を考えました。

  • existenceCondition の箇所で VM に特定のタグが付与されているかチェック
  • タグがない場合にアラート ルールのデプロイと VM にタグを付与

設定と動作確認

上記の要件で以下のポリシーとしました。

{
  "mode": "All",
  "policyRule": {
    "if": {
      "field": "type",
      "equals": "Microsoft.Compute/virtualMachines"
    },
    "then": {
      "effect": "deployIfNotExists",
      "details": {
        "type": "Microsoft.Compute/virtualMachines",
        "roleDefinitionIds": [
          "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
        ],
        "existenceCondition": {
          "allOf": [
            {
              "field": "tags.CpuAlert",
              "exists": "true"
            }
          ]
        },
        "deployment": {
          "properties": {
            "mode": "incremental",
            "template": {
              "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
              "contentVersion": "1.0.0.0",
              "parameters": {
                "alertName": {
                  "type": "string"
                },
                "vmId": {
                  "type": "string"
                },
                "actionGroupId": {
                  "type": "string"
                },
                "vmName": {
                  "type": "string"
                },
                "location": {
                  "type": "string"
                }
              },
              "resources": [
                {
                  "type": "Microsoft.Insights/metricAlerts",
                  "apiVersion": "2018-03-01",
                  "name": "[parameters('alertName')]",
                  "location": "global",
                  "properties": {
                    "description": "CPU usage is over 80%",
                    "severity": 3,
                    "enabled": true,
                    "scopes": [
                      "[parameters('vmId')]"
                    ],
                    "evaluationFrequency": "PT5M",
                    "windowSize": "PT5M",
                    "criteria": {
                      "allOf": [
                        {
                          "name": "High CPU usage",
                          "metricName": "Percentage CPU",
                          "operator": "GreaterThan",
                          "threshold": 80,
                          "timeAggregation": "Average",
                          "metricNamespace": "Microsoft.Compute/virtualMachines"
                        }
                      ],
                      "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria"
                    },
                    "actions": [
                      {
                        "actionGroupId": "[parameters('actionGroupId')]"
                      }
                    ]
                  }
                },
                {
                  "type": "Microsoft.Compute/virtualMachines",
                  "apiVersion": "2021-07-01",
                  "name": "[parameters('vmName')]",
                  "location": "[parameters('location')]",
                  "tags": {
                    "CpuAlert": "true"
                  }
                }
              ]
            },
            "parameters": {
              "alertName": {
                "value": "[concat('High CPU Alert - ', field('name'))]"
              },
              "vmId": {
                "value": "[field('id')]"
              },
              "actionGroupId": {
                "value": "[parameters('actionGroupId')]"
              },
              "vmName": {
                "value": "[field('name')]"
              },
              "location": {
                "value": "[field('location')]"
              }
            }
          }
        }
      }
    }
  },
  "parameters": {
    "actionGroupId": {
      "type": "String",
      "metadata": {
        "displayName": "actionGroupId",
        "description": "The ID of the action group to use when the alert is triggered."
      }
    }
  }
}

ポリシーを適用してみると以下のようになります。



まとめ

完璧に要件を満たせるわけではありませんが、まあ運用に耐えられるかなというレベルでしょうか。他に良い案があればぜひ教えてください。
今回は VM をターゲットにしてメトリックや閾値は固定にしていますが、チェックするリソースタイプや監視するメトリック、閾値などをすべてパラメータ化すれば他の PaaS でも利用可能となると思います。

Microsoft (有志)

Discussion