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

问题描述

使用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 image.png

对于需求二

通过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上测试效果如下

policy deny no-right name.gif

参考资料

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

当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!