【Azure Policy】使用Azure Policy来检查Azure资源名称是否满足正确要求(不满足就拒绝创建或标记为不合规non-compliance)

问题描述

使用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

 

posted @ 2024-03-21 20:31  路边两盏灯  阅读(19)  评论(0编辑  收藏  举报