如何配置Azure Policy强制订阅内VM创建时输入合规MM/DD/YYYY日期标签
Azure Policy 虚拟机终止日期标签强制配置方案
问题概述
原有订阅级Azure Policy策略可拦截未配置TerminationDate标签的虚拟机创建请求,但日期校验逻辑存在两处核心缺陷:
- 仅使用
##/##/####通配符做格式匹配,无法识别月份大于12、日期与月份不匹配(如2月30日)的非法日期输入 - 未做时间范围校验,无法限制输入日期必须在未来2个月的有效区间内
原有策略代码片段如下:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/VirtualMachines" }, { "field": "tags['TerminationDate']", "notMatch": "['##/##/####']" } ] }, "then": { "effect": "deny" } } }
修正后完整策略
直接使用Azure Policy内置的日期处理函数替代纯通配符匹配,可自动完成日期合法性、时间范围的双重校验,无需手写复杂正则处理大小月、闰年等边界场景,完整可直接部署的策略代码如下:
{ "mode": "Indexed", "parameters": { "allowedFutureMonths": { "type": "Integer", "defaultValue": 2, "metadata": { "description": "终止日期允许的最大未来月份范围" } } }, "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "anyOf": [ // 拦截未配置TerminationDate标签的请求 { "field": "tags['TerminationDate']", "exists": false }, // 拦截不符合MM/dd/yyyy格式、日期值非法的输入(如13/01/2024、02/30/2024) { "value": "[isDate(field('tags[''TerminationDate'']'), 'MM/dd/yyyy')]", "equals": false }, // 拦截日期早于当前UTC时间的输入 { "value": "[parseDate(field('tags[''TerminationDate'']'), 'MM/dd/yyyy')]", "less": "[utcNow()]" }, // 拦截日期超出指定未来月份范围的输入 { "value": "[parseDate(field('tags[''TerminationDate'']'), 'MM/dd/yyyy')]", "greater": "[addToTime(utcNow(), parameters('allowedFutureMonths'), 'Month')]" } ] } ] }, "then": { "effect": "deny", "details": { "errorMessage": "创建虚拟机必须配置TerminationDate标签,标签值需为MM/dd/yyyy格式的有效日期,且日期范围为当前时间之后2个月内" } } } }
逻辑说明
- 策略模式调整为
Indexed,仅针对带标签和位置的支持资源做校验,提升策略执行效率 - 用
isDate()函数做日期合法性校验:输入值不符合MM/dd/yyyy格式、或日期本身不存在(如月份>12、日期超出当月最大天数)时,函数返回false直接触发拒绝,比纯通配符、正则匹配的准确率更高 - 用
parseDate()将合法的标签值转换为日期对象后,搭配utcNow()获取当前UTC时间、addToTime()计算2个月后的截止时间点,自动处理跨月、跨年、闰年的日期计算逻辑,无需手动编写边界判断规则 - 将允许的未来月份范围设置为可配置参数,后续如果需要调整时间限制,直接修改参数默认值即可,不需要改动核心规则逻辑
内容的提问来源于stack exchange,提问作者Sahil Wadehra
相关产品推荐
相关产品推荐

