如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?

Posted

技术标签:

【中文标题】如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?【英文标题】:How to define and assign an Azure Policy on a Management Group Scope using Terraform? 【发布时间】:2021-04-18 22:21:35 【问题描述】:

我想将 Azure 的内置策略之一分配给使用 Terraform 的管理组。我面临的问题是,虽然通过将范围正确设置为订阅 ID 或资源组或要应用该策略的特定资源,可以相当轻松地使用 Terraform 分配策略,但将其更改为管理组会导致一个错误。我认为这是因为策略定义位置需要是管理组很好,以便我们可以使 azurerm_policy_assignment 的范围等于所需的管理组。我能否就此获得一些帮助,以便如何定义策略,定义位置是 Terraform 中管理组的位置?例如,我尝试在策略分配块之前的 resource azurerm_policy_definition 块中设置 scope = 管理组 ID,但我得到“范围”是一个意外的关键字。设置“位置”也不起作用。

我还将分享我当前的解决方法。

由于我面临的问题,我目前正在做的是从门户复制策略的定义,将“定义位置”更改为等于那里的管理组 ID,然后传递新的策略定义 ID 和范围将成为我后续 Terraform 代码中的管理组,现在该策略已在管理组的相关位置定义,现在可以工作了。

但我想取消这种手动干预,并打算仅使用 Terraform 脚本来完成它。作为该领域的新手,有没有办法可以将策略分配给 Terraform 中的特定管理组,首先在同一范围内适当地定义它,以免导致任何错误?

另外提出,我的问题也可以解释为如何仅使用 Terraform 脚本将 Azure 策略分配给特定的管理组范围(可以假设,管理组也将使用 Terraform 创建,尽管该部分已处理) .

【问题讨论】:

【参考方案1】:

要分配内置策略,我建议将所需的策略定义引用为data source。这样,您无需在 Terraform 代码中声明/创建新的策略定义。 (尽管您也可以将内置策略的定义 ID 作为 policy_definition_id 的值放在 azurerm_policy_assignment 资源块中)。

Here 是在 Terraform 中将内置策略定义引用为数据源的示例。

以下是您的 Terraform 从门户获取内置策略定义并分配给管理组的示例。

# Pull in built-in definition as a data source
# Link to definition: https://portal.azure.com/#blade/Microsoft_Azure_Policy/PolicyDetailBlade/definitionId/%2Fproviders%2FMicrosoft.Authorization%2FpolicyDefinitions%2Fa451c1ef-c6ca-483d-87ed-f49761e3ffb5
data "azurerm_policy_definition" "example" 
  display_name = "Audit usage of custom RBAC rules"


# Reference the definition data source in the policy assignment resource
resource "azurerm_policy_assignment" "example" 
  name = "assign-audit-rbac"
  policy_definition_id = data.azurerm_policy_definition.example.id
  scope = "/providers/Microsoft.Management/managementGroups/MyManagementGroup"

【讨论】:

非常感谢...@noahb,它运行良好...我只是有一个问题。但是,将策略定义引用为数据源不允许我在定义块中编写策略规则和内容......如果没有这些,它如何适用?有没有办法合并它?

以上是关于如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?的主要内容,如果未能解决你的问题,请参考以下文章

在 terraform 的 azure 数据资源管理器中使用 eventthub 的默认消费者组

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署

使用Terraform部署代码和管理配置

如何在 aws 检查器资源组上多次使用相同的标签

Terraform - 不要等待自动缩放组销毁

跨 terraform 环境共享资源