1

我们最近创建了一个 Azure 策略,强制在所有资源上显示一组特定的标签。此策略会阻止部署中不包含所需标签的部署。但是,某些可标记资源(例如 Vnet)在部署期间没有添加标记的选项,除非您使用 ARM 模板。看起来 Terraform 还尝试在添加标签之前将 Vnet 作为单独的步骤部署,即使提供了正确的标签,这也会导致 Terraform 部署的 Vnet 失败。使用 Terraform,如果提供了 ARM 模板,它将绕过此问题。

如何在不使用 ARM 模板且无需放弃 azure 策略的情况下获得 Terraform 部署资源(例如 Vnet)?理想情况下,我希望能够从 Azure 策略中排除 Terraform 启动的资源部署,但我找不到将 Terraform 部署与 Azure 策略中的正常 Azure Web Portal 部署区分开来的方法。

其他一些想法:

  • 使用 Terraform 在资源组上创建一个临时标签,指定“免除这些资源”。完成 Terraform 脚本后删除此标记。在 Azure 策略中引用此标记,如果该标记存在,则免除部署。这个解决方案还可以,但我更喜欢更优雅的解决方案
  • 使用 Terraform 在执行时将资源组添加为策略的豁免,然后在执行后恢复
  • 更新策略以在不支持在没有 ARM 模板的初始部署时标记的资源上不需要标记

除了上面提到的选项之外,还有更优雅的解决方案吗?

4

1 回答 1

0

Azure Policy 没有任何方法来区分 ARM 操作的执行方式,它只能看到将应用于资源的结果属性集。

使用继承资源组标记策略 ( https://github.com/Azure/azure-policy/tree/master/samples/Tags/inherit-resourcegroup-tag ) 怎么样?Terraform 可以将标签添加到资源组,然后部署 vnet,此时 Policy 会将标签从资源组应用到 vnet。

于 2020-02-12T22:49:58.303 回答