问题描述
使用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
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!