Azure Policy中utcNow()无法传格式参数 如何获取dd/mm/yyyy日期
Azure Policy自动追加dd/mm/yyyy格式创建日期标签配置问题
问题场景
我尝试创建一项Azure Policy,用于为新创建的资源追加值为dd/mm/yyyy格式日期的created-on标签,配置时选用了Azure内置的Append a tag and its value to resources策略,策略完整定义如下:
{ "properties": { "displayName": "Append a tag and its value to resources", "policyType": "BuiltIn", "mode": "Indexed", "description": "Appends the specified tag and value when any resource which is missing this tag is created or updated. Does not modify the tags of resources created before this policy was applied until those resources are changed. Does not apply to resource groups. New 'modify' effect policies are available that support remediation of tags on existing resources (see https://aka.ms/modifydoc).", "metadata": { "version": "1.0.1", "category": "Tags" }, "parameters": { "tagName": { "type": "String", "metadata": { "displayName": "Tag Name", "description": "Name of the tag, such as 'environment'" } }, "tagValue": { "type": "String", "metadata": { "displayName": "Tag Value", "description": "Value of the tag, such as 'production'" } } }, "policyRule": { "if": { "field": "[concat('tags[', parameters('tagName'), ']')]", "exists": "false" }, "then": { "effect": "append", "details": [ { "field": "[concat('tags[', parameters('tagName'), ']')]", "value": "[parameters('tagValue')]" } ] } } }, "id": "/providers/Microsoft.Authorization/policyDefinitions/2a0e14a6-b0a6-4fab-991a-187a4f81c498", "type": "Microsoft.Authorization/policyDefinitions", "name": "2a0e14a6-b0a6-4fab-991a-187a4f81c498" }
配置过程与报错
配置策略参数时,我将标签名设置为created-on,标签值设置为[utcNow('d')],配置界面参考:
保存配置时持续收到如下报错:
内部异常:策略语言函数'utcNow'传入了1个参数,该函数预期的参数数量为0。
已验证现象
根据Azure Resource Manager模板日期函数的官方文档说明,utcNow函数本应支持传入格式指定参数,但实际在Azure Policy环境中测试:
- 移除
utcNow传入的'd'参数后,函数可正常运行,默认返回yyyyMMddTHHmmssZ格式的日期值 - 只要给
utcNow传入任何格式参数,就会触发上述参数数量不匹配的报错
待解决问题
如何配置才能获取dd/mm/yyyy格式的日期作为标签值,自动追加到新建资源上?
解决方案
报错的核心原因是Azure Policy使用的策略表达式语言与ARM模板的函数实现并不完全对齐:Azure Policy规则中的utcNow()函数不支持传入格式参数,仅支持无参调用,固定返回yyyyMMddTHHmmssZ格式的UTC时间字符串,和ARM模板中带格式参数的utcNow实现逻辑不同。
要得到dd/mm/yyyy格式的日期标签,操作步骤如下:
- 放弃直接在原内置策略的参数栏填写带格式的
utcNow调用,原内置策略的参数逻辑无法支持日期格式转换操作 - 新建自定义策略,在策略规则的标签赋值逻辑中,通过字符串截取函数手动拼接目标日期格式,核心转换表达式为:
表达式逻辑说明:concat(substring(utcNow(), 6, 2), '/', substring(utcNow(), 4, 2), '/', substring(utcNow(), 0, 4))- 无参调用
utcNow()拿到默认格式时间字符串,例如20240520T091233Z对应2024年5月20日 - 从字符串索引6的位置开始截取2位,得到两位日期
- 从字符串索引4的位置开始截取2位,得到两位月份
- 从字符串索引0的位置开始截取4位,得到四位年份
- 按照
日/月/年的顺序用/拼接,最终得到符合dd/mm/yyyy要求的日期字符串
- 无参调用
- 推荐将策略效果从原内置策略的
append改为modify,该效果支持通过托管身份修正已有资源的标签,打标稳定性更高。使用modify效果时需要在规则中配置对应的权限角色ID,核心策略规则片段参考如下:
"if": { "field": "tags['created-on']", "exists": "false" }, "then": { "effect": "modify", "details": { "roleDefinitionIds": [ "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c" ], "operations": [ { "operation": "add", "field": "tags['created-on']", "value": "[concat(substring(utcNow(), 6, 2), '/', substring(utcNow(), 4, 2), '/', substring(utcNow(), 0, 4))]" } ] } }
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

