实战Azure IaC之ARM自动化编排告警规则

121 阅读8分钟

实战Azure IaC之ARM自动化编排告警规则

一 背景

在实施Azure基础设施即代码(IaC)时,利用Azure资源管理器(ARM)模板自动化编排告警规则至关重要。通过定义和部署这些规则,可以有效监控Azure资源的状态和性能,及时发现潜在问题并采取必要措施,从而确保环境的稳定性和安全性。

二 相关概念

2.1 Azure ARM

JSON Azure 资源管理器模板(ARM 模板)使你能够以声明性且可重用的方式指定项目的基础结构。 你可以对模板进行版本控制,并将它们保存在你的开发项目所在的源代码管理中。

假设你正在管理一个软件团队,该团队正在为你的合作伙伴公司开发库存系统。 你计划将此产品部署到 Azure,并让每个合作伙伴公司拥有自己的解决方案。 你计划通过不同的 Azure 存储帐户为每个部署实现不同策略。 你决定使用基础结构即代码的做法,方法是使用 ARM 模板。 这种方法允许你跟踪不同的版本,并确保每个环境的基础结构部署一致且灵活。

本模块将介绍 ARM 模板结构,并演示如何创建 ARM 模板并将其部署到 Azure。

ARM 模板是 JavaScript 对象表示法 (JSON) 文件,定义部署的基础结构和配置。 此模板使用声明性语法。 声明性语法是一种构建结构和元素的方法,这些结构和元素概述了资源的外观,而不是描述控制流。 声明性语法不同于“命令性语法”,后者使用命令让计算机来执行。 命令性脚本侧重于指定部署资源过程中的每个步骤。

ARM 模板使你能够声明要部署的内容,而无需编写创建它的编程命令序列。 在 ARM 模板中,可以指定资源和这些资源的属性。 然后,Azure 资源管理器使用这些信息以有组织且一致的方式部署资源。

2.2 Azure ARM 特点

ARM 模板使你能够实现部署自动化并使用基础结构即代码 (IaC) 的做法。 模板代码将成为基础结构和开发项目的一部分。 与应用程序代码一样,你可以将 IaC 文件存储在源存储库中并对它进行版本控制。

ARM 模板是幂等的,这意味着你可以多次部署同一模板并获取处于相同状态的相同资源类型。

资源管理器协调资源的部署操作,以便按正确的顺序创建资源。 如果可能,还将并行创建资源,因此 ARM 模板部署会比脚本部署更快完成。

资源管理器还有内置验证。 它会在开始部署之前检查模板以确保部署成功。

如果部署变得更复杂了,可以将 ARM 模板拆分为更小的可重用组件。 然后在部署时将这些较小的模板链接在一起。 此外,还可以在其他模板中嵌套模板。

在 Azure 门户中,可以查看部署历史记录并获取有关部署状态的信息。 门户显示所有参数和输出的值。

还可以将 ARM 模板集成到诸如 Azure Pipelines 等持续集成和持续部署 (CI/CD) 工具中,这些工具可以自动执行发布管道,从而实现快速可靠的应用程序和基础结构更新。 通过使用 Azure DevOps 和 ARM 模板任务,可以持续构建和部署项目。

三 ARM模板文件结构

在编写 ARM 模板时,你需要了解组成模板的所有部分以及它们的作用。 ARM 模板文件由下列元素组成:

展开表

元素说明
架构一个必需的部分,用于定义描述 JSON 数据结构的 JSON 架构文件的位置。 所用版本号取决于部署范围和 JSON 编辑器。
contentVersion一个必需的部分,用于定义模板的版本(例如 1.0.0.0)。 可以使用此值记录模板中的重大更改,从而确保部署正确的模板。
apiProfile一个可选部分,用于定义资源类型的 API 版本集合。 使用此值即可不必为模板中的每个资源指定 API 版本。
parameters一个可选部分,可在其中定义部署期间提供的值。 这些值可以由参数文件、命令行参数或在 Azure 门户中提供。
variables一个可选部分,可在其中定义用于简化模板语言表达式的值。
functions一个可选部分,可在其中定义模板中可用的用户定义函数。 当在模板中重复使用复杂表达式时,用户定义函数可以简化模板。
resources一个必需的部分,用于定义要在资源组或订阅中部署或更新的实际项。
output一个可选部分,可在其中指定将在部署结束时返回的值。

四 实战部署

# 查看命令帮助
az login

# 创建资源组
az group create --name {name of your resource group} --location "{location}"

# 制定模板,部署模板
templateFile="{provide-the-path-to-the-template-file}"
az deployment group create --name blanktemplate --resource-group myResourceGroup --template-file $templateFile

使用链接模板部署复杂的解决方案。 可以将一个模板拆分为许多模板,并通过一个主模板来部署这些模板。 在你部署主模板时,会触发链接的模板的部署。 可以使用 SAS 令牌来存储和保护已链接的模板。

模板内容

  • storageaccount-alarm.json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "alertName": {
            "minLength": 1,
            "type": "String",
            "metadata": {
                "description": "Name of the alert"
            }
        },
        "alertDescription": {
            "defaultValue": "This is a metric alert",
            "type": "String",
            "metadata": {
                "description": "Description of alert"
            }
        },
        "alertSeverity": {
            "defaultValue": 3,
            "allowedValues": [
                0,
                1,
                2,
                3,
                4
            ],
            "type": "Int",
            "metadata": {
                "description": "Severity of alert {0,1,2,3,4}"
            }
        },
        "isEnabled": {
            "defaultValue": true,
            "type": "Bool",
            "metadata": {
                "description": "Specifies whether the alert is enabled"
            }
        },
        "resourceId": {
            "minLength": 1,
            "type": "String",
            "metadata": {
                "description": "Full Resource ID of the resource emitting the metric that will be used for the comparison. For example /subscriptions/00000000-0000-0000-0000-0000-00000000/resourceGroups/ResourceGroupName/providers/Microsoft.compute/virtualMachines/VM_xyz"
            }
        },
        "metricName": {
            "defaultValue": "Percentage CPU",
            "minLength": 1,
            "type": "String",
            "metadata": {
                "description": "Name of the metric used in the comparison to activate the alert."
            }
        },
        "operator": {
            "defaultValue": "GreaterThan",
            "allowedValues": [
                "Equals",
                "NotEquals",
                "GreaterThan",
                "GreaterThanOrEqual",
                "LessThan",
                "LessThanOrEqual"
            ],
            "type": "String",
            "metadata": {
                "description": "Operator comparing the current value with the threshold value."
            }
        },
        "threshold": {
            "defaultValue": "0",
            "type": "String",
            "metadata": {
                "description": "The threshold value at which the alert is activated."
            }
        },
        "timeAggregation": {
            "defaultValue": "Average",
            "allowedValues": [
                "Average",
                "Minimum",
                "Maximum",
                "Total",
                "Count"
            ],
            "type": "String",
            "metadata": {
                "description": "How the data that is collected should be combined over time."
            }
        },
        "windowSize": {
            "defaultValue": "PT5M",
            "allowedValues": [
                "PT1M",
                "PT5M",
                "PT15M",
                "PT30M",
                "PT1H",
                "PT6H",
                "PT12H",
                "PT24H"
            ],
            "type": "String",
            "metadata": {
                "description": "Period of time used to monitor alert activity based on the threshold. Must be between one minute and one day. ISO 8601 duration format."
            }
        },
        "evaluationFrequency": {
            "defaultValue": "PT1M",
            "allowedValues": [
                "PT1M",
                "PT5M",
                "PT15M",
                "PT30M",
                "PT1H"
            ],
            "type": "String",
            "metadata": {
                "description": "how often the metric alert is evaluated represented in ISO 8601 duration format"
            }
        },
        "actiongroups_xuel_azure_alarm_operate_group_externalid": {
            "defaultValue": "/subscriptions/7b431969-a571-4fec-a201-17d327cc80cd/resourceGroups/xuel_patch_manage/providers/microsoft.insights/actiongroups/xuel-azure-alarm-operate-group",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Insights/metricAlerts",
            "apiVersion": "2018-03-01",
            "name": "[parameters('alertName')]",
            "location": "global",
            "properties": {
                "description": "[parameters('alertDescription')]",
                "severity": "[parameters('alertSeverity')]",
                "enabled": "[parameters('isEnabled')]",
                "scopes": [
                    "[parameters('resourceId')]"
                ],
                "evaluationFrequency": "[parameters('evaluationFrequency')]",
                "windowSize": "[parameters('windowSize')]",
                "criteria": {
                    "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
                    "allOf": [
                        {
                            "name": "1st criterion",
                            "metricName": "[parameters('metricName')]",
                            "operator": "[parameters('operator')]",
                            "threshold": "[parameters('threshold')]",
                            "timeAggregation": "[parameters('timeAggregation')]"
                        }
                    ]
                },
                "autoMitigate": true,
                "targetResourceType": "Microsoft.Storage/storageAccounts",
                "actions": [
                    {
                        "actionGroupId": "[parameters('actiongroups_xuel_azure_alarm_operate_group_externalid')]",
                        "webHookProperties": {}
                    }
                ]
            }
        }
    ]
}
  • 参数:storageaccount-alarm.parameters.json
{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
      "alertName": {
          "value": "xuel-storage-usecapacity"
      },
      "alertDescription": {
          "value": "This is a metric alert"
      },
      "alertSeverity": {
          "value": 3
      },
      "isEnabled": {
          "value": false
      },
      "resourceId": {
          "value": "/subscriptions/7b43xxxxxxxxxxxxxxxxxxx/resourceGroups/xuel_patch_manage/providers/Microsoft.Storage/storageAccounts/xuelstorageaccount"
      },
      "metricName": {
          "value": "UsedCapacity"
      },
      "operator": {
          "value": "GreaterThan"
      },
      "threshold": {
          "value": "90"
      },
      "timeAggregation": {
          "value": "Average"
      },
      "windowSize": {
          "value": "PT1H"
      },
      "evaluationFrequency": {
          "value": "PT1M"
      },
      "actiongroups_xuel_azure_alarm_operate_group_externalid": {
        "value": null
    }
  }
}

部署

az  login

# 如果是21v使用设置为中国
az cloud set -n AzureChinaCloud

az deployment group create --resource-group xxx --template-file storageaccount-alarm.json --parameters storageaccount-alarm.parameters.json

查看告警记录

告警规则

销毁

只需将资源的enable属性改为false即可

删除命令和创建命令一致,操作完成后查看规则已经不存在。

五 创建多个规则

创建多个报警规则在resources配件里多个规则

六 总结

Azure资源管理器(ARM)是Azure的基础设施即代码(IaC)解决方案,通过JSON格式的ARM模板描述和管理Azure资源的部署和配置。ARM模板的核心特点包括声明性语法和资源定义,使得用户可以精确指定要部署的资源类型、属性和关系,从而实现自动化和一致性的部署过程。这种方式不仅简化了环境的管理,还能够减少手动操作引入的错误,提高部署的可靠性和效率。

ARM模板支持参数化和变量定义,使得模板可以根据环境和需求动态调整,适应不同场景的部署需求。此外,模板还能定义资源的依赖关系和部署顺序,确保资源按照正确的顺序创建和配置,避免因依赖关系导致的部署失败或不一致性。

ARM与Azure资源管理服务深度集成,用户可以通过Azure门户、Azure CLI或Azure PowerShell直接部署和管理ARM模板,提升了操作的便捷性和用户体验。同时,ARM模板的版本控制和审计功能,使得用户可以跟踪和管理环境变更,确保每个部署步骤都可以追溯和审计,增强了环境的安全性和可控性。

参考链接