问题描述
使用Azure Policy来检查Azure资源名称是否满足正确要求,如果不满足就拒绝创建或标记为不合规non-compliance
在创建Azure上资源的时候,有如下需求:
1)资源的名称必须以一个前缀开头, 如prod , test等。
2)资源的名称结尾处必须是一个数字,如 0,1,2,3,4,5,6,7,8,9。
3)如果不合规,则拒绝新建操作。
问题解答
Azure Policy可以实现以上需求。
下面的实验以存储账号(Storage Account) 资源为例,需要使用Policy 的Deny Effect操作 ( Deny:在活动日志中生成事件,并根据请求的资源配置使请求失败)
对于需求一
因为前缀为变动,所以把它设计为一个输入参数:prefixname
"parameters": { "prefixname": { "type": "String", "metadata": { "displayName": "Prefix Name", "description": "Prefix Name of the resource, such as 'prod'" }, "defaultValue":"prod" } }
在判断条件中,首先需要使用length()长度函数,判断prefixname的长度,然后使用substring()函数截取资源名开始的前几位字符进行比对。
{
"value": "[substring(field('name'), 0, length(parameters('prefixname')))]",
"notEquals": "[parameters('prefixname')]"
}
- field('name') : 用于获取Azure资源名称
- length(parameters('prefixname')): 计算所要求前缀字符的长度,有prefixname参数决定
- substring(‘name’,0,lenght): 从首字母开始解决length长度的字符串
- notEquals:不相等的情况下,才会触发deny 效果
注:为什么使用这么复杂的比对语句呢?因为Policy Rule中不支持使用正则表达式(Regex), 也没有StartWith的内置条件。策略定义结构的详细信息 - Azure Policy | Azure Docs
对于需求二
通过last() 函数可以获取最后一个字符,而在判断是否是数字时,这里使用了最笨的办法,直接检查最后一个字符是否包含在[“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,”9”] 中。
{ "value": "[last(field('name'))]", "notIn": [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] }
对于需求三
使用 deny来拒绝创建情况,综合以上三个需求,#1,#2 只有有一个不满足就deny,所以使用了anyOf 包含需求一和二。
因本文中使用存储账号(Storage Account)为例,所以添加了 type == Microsoft.Storage/storageAccounts 的条件。
最后完整的Policy Rule如下:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Storage/storageAccounts" }, { "anyOf": [ { "value": "[substring(field('name'), 0,length(parameters('prefixname')))]", "notEquals": "[parameters('prefixname')]" }, { "value": "[last(field('name'))]", "notIn": [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] } ] } ] }, "then": { "effect": "deny" } }, "parameters": { "prefixname": { "type": "String", "metadata": { "displayName": "Prefix Name", "description": "Prefix Name of the resource, such as 'prod'" }, "defaultValue": "prod" } } }
在Azure上测试效果如下
参考资料
Azure Policy Substring函数 & Last 函数: https://docs.azure.cn/zh-cn/azure-resource-manager/templates/template-functions-string#substring
Azure Policy 定义条件: https://docs.azure.cn/zh-cn/governance/policy/concepts/definition-structure#conditions
Substring示例: https://docs.azure.cn/zh-cn/governance/policy/concepts/definition-structure#avoiding-template-failures
allOf & anyOf 示例:https://learn.microsoft.com/en-us/azure/governance/policy/samples/pattern-logical-operators