🚓
Azure リソース作成時に自動的にメトリックのアラート ルールを設定したい
はじめに
タイトルの通りなのですが、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 でも利用可能となると思います。
Discussion