使用Azure Policy(策略)强制实现资源Tag的坑
Azure的Tag(标记)可以帮助运维人员对云资源分类从而方便地进行计费和资源管理。然而在具体实践中工程师部署云资源的时候常常会忘记给资源做标记打Tag。
针对这个问题,Azure的官方文档建议是可以使用自定义的策略要求所有资源都拥有针对特定标记以及特定的值.https://www.azure.cn/documentation/articles/resource-manager-policy/
在global azure里面甚至已经提供了内置的策略(buildin policy)来帮助管理员强制实现资源Tag。

我们以第一个内置策略为例研究一下如何在azure china也实现类似的功能。这个策略的json内容如下:

以此为模板,设计策略如下:资源组Meow内的资源都必须带有特定的标记“costcenter”,该costcenter的值必须是100.200.300。
如果这个标记不存在,资源将不能被创建
策略定义如下:
{
"if": {
"not": {
"field": "tags.costcenter",
"equals": "100.200.300“
}
},
"then": {
"effect": "deny"
}
}
接下来, 用powershell在订阅里实现这个策略

创建一个没有标记costcenter的存储账号测试一下,错误信息显示策略限制了存储帐号的创建

加上标记costcenter,随意给个标记值,再试一下,还是不能创建

好吧,老老实实按策略来,加上标记costcenter,标记值是100.200.300

这就是我们今天要讲的坑吗?当然不是!!!!!!!!!,重要的事情讲三遍
这个策略不能随便用
这个策略不能随便用
这个策略不能随便用
还记得怎么从portal创建一个存储账户吗?

看见没有,portal就没有给机会在创建的时候加入标记tag,实施了以上的策略的订阅和资源组事实上限制了任何用户从portal在该订阅资源组创建资源。任何从portal的创建都会得到以下错误信息

所以,除非云平台的IDAM安全策略本身禁止从portal创建资源的,
类似的策略不能随便用,哪怕是azure内置的。
类似的策略不能随便用,哪怕是azure内置的。
类似的策略不能随便用,哪怕是azure内置的。
不过呢,虽然这个策略不能用,事情还是一样要做。其实global azure的内置策略还给了另外一种思路

这个策略相对温和,资源在创建时候如果没有特定标记和特定值,该策略会用append方式自动加上标记和相应的值。
先把上面实施的策略删除,然后实施新策略

用powershell创建一个没有标记costcenter的存储账号,从命令输出可以看到标记costcenter和相应的值100.200.300被自动加在存储账号上

回到portal继续创建存储账号,创建成功,标记和值都被加上了

最后再讲一句,设想一下,在一个企业级的azure环境里或者在一个azure managed service provider的环境里,十几个甚至几十个项目同时在进行,每个项目使用不同的订阅或者不同的资源组,项目不同阶段的costcenter都是不同的,采用这个append策略的话,云管理员就忙着和各个项目沟通拿costcenter加策略改策略删策略没时间干其他活了啊。
理想的解决方案到底该是怎么样的呢?