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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:33:26