You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在日志警报触发时执行Azure Function删除低CPU占用VM

解决Azure警报触发时Azure Function未执行的问题

针对你遇到的警报触发后仅邮件通知生效、Azure Function(Delete-VM)未执行的问题,可以按以下步骤逐一排查解决:

1. 确认Azure Function的触发类型与配置

  • 确保Delete-VM是HTTP触发的Function:Azure Monitor警报只能触发HTTP类型的Function,其他触发类型(如Timer)无法被警报调用。
  • 检查Function的访问权限:
    • 如果Function设置为非匿名访问,需在动作组的Function配置中填入正确的函数密钥或主密钥(可在Function应用的“密钥”页面获取),否则警报请求会因权限不足被拒绝。
    • 若允许匿名访问,需确保Function的授权级别设置为“匿名”。

2. 检查动作组的Function配置正确性

  • 确认动作组中添加的动作类型是**“Azure函数”**,而非其他类型。
  • 验证动作组中选择的订阅、资源组、Function应用、Function名称完全匹配Delete-VM的实际信息,避免选错资源导致无法触发。

3. 排查Azure Function的权限

  • 确保Delete-VM所在的Function应用的服务主体(或托管标识)在目标资源组上拥有**“虚拟机参与者”或“贡献者”**角色:
    • 若无足够权限,Function执行删除VM操作时会失败,即使警报已触发。
    • 可通过Azure门户的资源组“访问控制(IAM)”页面添加角色分配,将Function应用的托管标识(或服务主体)添加为对应角色。

4. 检查自定义日志查询与警报规则逻辑

  • 你的当前查询中where AggregatedValue < 100不符合需求(需低于30%),应修正为:
    Perf | where TimeGenerated > ago(60m) | where ObjectName == "Processor" | summarize AggregatedValue = avg(CounterValue) by Computer | where AggregatedValue < 30 | project Computer, AggregatedValue
    
  • 确认警报规则的触发条件配置正确:
    • 选择“基于度量值”触发,将阈值设为“小于30”,确保只有CPU使用率持续低于30%时才触发警报。
    • 验证警报规则确实关联了正确的delete-Action动作组,且动作组中的Function未被禁用。

5. 查看执行日志定位错误

  • Azure Monitor警报日志:进入“Azure Monitor”->“警报”->“所有警报”,找到触发的警报,查看“历史记录”,检查Function动作的执行状态(成功/失败)及错误信息(如401未授权、404资源不存在、500服务器错误等)。
  • Function执行日志:进入Function应用的“监控”->“日志”,搜索Function的执行记录,排查是否收到警报请求、是否存在代码错误(如参数解析失败、权限不足等)。

6. 修正Function代码的请求解析逻辑

Azure Monitor发送给Function的请求包含特定JSON格式,需确保代码正确解析其中的VM名称信息。以下是修正后的PowerShell Function示例(适配警报请求格式):

using namespace System.Net

param($Request, $TriggerMetadata)

# 从警报请求中提取VM名称
$alertData = $Request.Body.data
$vmNames = $alertData.alertContext.searchResults | Select-Object -ExpandProperty Computer

# 目标资源组名称(可改为从应用设置读取,更灵活)
$resourceGroupName = "你的目标资源组名称"

foreach ($vmName in $vmNames) {
    try {
        # 删除VM及关联资源(按需调整参数,如保留磁盘可移除相关删除逻辑)
        Remove-AzVM -ResourceGroupName $resourceGroupName -Name $vmName -Force -ErrorAction Stop
        Write-Output "VM $vmName 删除成功"
    }
    catch {
        Write-Error "删除VM $vmName 失败: $_"
    }
}

# 返回成功响应
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = "VM删除处理完成"
})

内容的提问来源于stack exchange,提问作者kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:01:23