如何从Azure Runbook触发Azure Policy?含预算触发场景测试需求
从Azure Runbook触发Azure Policy的实现方案
核心思路
要临时停止订阅内的资源预配,本质是通过Runbook启用限制资源创建的Azure Policy(比如禁止特定资源类型或全量资源部署的策略),或是启用对应的政策计划(如内置的Deny all resource creation类计划)。完整流程为:预算阈值触发动作组 → 动作组调用Runbook Webhook → Runbook执行命令启用目标Policy。
具体步骤
1. 准备目标Azure Policy
- 提前创建或选定要触发的Policy:可以自定义规则为拒绝所有资源部署,也可直接使用Azure内置的“拒绝资源创建”类Policy。
- 记录Policy的资源ID/名称、目标订阅ID,后续Runbook脚本需要用到这些信息。
2. 编写Runbook脚本(PowerShell示例)
Runbook需完成的核心操作:创建Policy分配(若未分配),或更新现有分配的启用状态。示例脚本如下:
# 通过系统托管身份登录Azure Connect-AzAccount -Identity # 定义关键参数 $subscriptionId = "你的订阅ID" $policyDefinitionName = "Deny-All-Resource-Creation" # 替换为你的Policy名称 $policyAssignmentName = "临时停止资源预配" # 切换至目标订阅 Set-AzContext -Subscription $subscriptionId # 检查Policy分配是否存在,不存在则创建,存在则启用 $existingAssignment = Get-AzPolicyAssignment -Name $policyAssignmentName -Scope "/subscriptions/$subscriptionId" -ErrorAction SilentlyContinue if (-not $existingAssignment) { # 创建新的Policy分配 New-AzPolicyAssignment -Name $policyAssignmentName -PolicyDefinitionName $policyDefinitionName -Scope "/subscriptions/$subscriptionId" } else { # 启用已存在的Policy分配(将执行模式设为Default) $existingAssignment.Properties.EnforcementMode = "Default" Set-AzPolicyAssignment -InputObject $existingAssignment }
注意:需给Runbook的系统托管身份分配订阅级别的
Policy Contributor角色,确保其具备管理Policy分配的权限。
3. 测试触发流程
手动测试Runbook
- 在Azure自动化账户中直接启动Runbook,检查作业日志确认执行成功,再尝试在订阅内创建资源,验证Policy是否生效(创建操作被拒绝)。
模拟预算触发动作组
- 在Azure门户的动作组页面,点击“测试动作组”,选择关联的Webhook动作触发Runbook。
- 验证结果:查看Runbook作业日志确认执行状态,再测试资源创建操作,确认Policy已生效。
4. 恢复资源预配的反向操作
若需恢复资源预配,可编写另一个Runbook,将Policy分配的EnforcementMode改为DoNotEnforce,或直接删除Policy分配,同样通过动作组触发执行。
内容的提问来源于stack exchange,提问作者Sahil Wadehra
相关产品推荐
相关产品推荐

