如何在日志警报触发时执行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
相关产品推荐
相关产品推荐

