在Azure Terraform模块中实现自定义策略定义与分配的最佳实践

在Azure Terraform模块中实现自定义策略定义与分配的最佳实践

terraform-azurerm-avm-ptn-alz Terraform module to deploy Azure Landing Zones terraform-azurerm-avm-ptn-alz 项目地址: https://gitcode.com/gh_mirrors/te/terraform-azurerm-avm-ptn-alz

前言

在Azure云环境中,策略管理是确保资源合规性的重要手段。本文将详细介绍如何在Azure Terraform模块中实现自定义策略定义与分配,帮助管理员构建符合企业需求的治理框架。

准备工作

在开始之前,需要确保已经正确配置了以下内容:

  1. 安装了最新版本的Terraform
  2. 配置了Azure Provider
  3. 了解基本的Azure Policy概念

文件结构与命名规范

正确的文件结构和命名规范是成功实现自定义策略的关键:

- lib/
  ├── policy_assignments/
  │   └── inherit_rg_tags.alz_policy_assignment.json
  ├── policy_definitions/
  │   └── inherit-resoucegroup-multipletags-if-missing.alz_policy_definition.json
  └── custom_root.alz_archetype_override.yaml

注意文件扩展名必须使用.alz_policy_assignment.json.alz_policy_definition.json格式,这是模块识别的关键。

自定义策略定义实现

下面是一个完整的资源组标签继承策略定义示例:

{
  "properties": {
    "displayName": "从资源组继承多个标签",
    "mode": "Indexed",
    "description": "当资源创建或更新时,如果缺少标签则从父资源组继承多个标签",
    "metadata": {
      "category": "Tags",
      "version": "1.0.0"
    },
    "parameters": {
      "effect": {
        "type": "String",
        "metadata": {
          "displayName": "效果",
          "description": "启用或禁用策略执行"
        },
        "allowedValues": ["Modify"],
        "defaultValue": "Modify"
      },
      "tagName1": {
        "type": "String",
        "metadata": {
          "displayName": "第一个标签名称",
          "description": "标签名称,如'环境'"
        }
      }
      // 可以添加更多标签参数
    },
    "policyRule": {
      "if": {
        "anyOf": [
          {
            "field": "[concat('tags[', parameters('tagName1'), ']')]",
            "exists": "false"
          }
          // 可以添加更多标签检查条件
        ]
      },
      "then": {
        "effect": "[parameters('effect')]",
        "details": {
          "roleDefinitionIds": [
            "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
          ],
          "operations": [
            {
              "operation": "add",
              "field": "[concat('tags[', parameters('tagName1'), ']')]",
              "value": "[resourceGroup().tags[parameters('tagName1')]]"
            }
            // 可以添加更多标签操作
          ]
        }
      }
    }
  },
  "id": "/providers/Microsoft.Authorization/policyDefinitions/Inherit-RG-Tags",
  "type": "Microsoft.Authorization/policyDefinitions",
  "name": "Inherit-RG-Tags"
}

策略分配配置

策略分配文件将定义如何在实际环境中应用策略:

{
  "name": "Inherit-RG-Tags",
  "type": "Microsoft.Authorization/policyAssignments",
  "apiVersion": "2019-09-01",
  "properties": {
    "description": "资源从资源组继承标签",
    "displayName": "资源从资源组继承标签",
    "policyDefinitionId": "/providers/Microsoft.Management/managementGroups/alz-root/providers/Microsoft.Authorization/policyDefinitions/Inherit-RG-Tags",
    "nonComplianceMessages": [
      {
        "message": "标签必须从资源组继承"
      }
    ],
    "scope": "${current_scope_resource_id}",
    "enforcementMode": null
  },
  "location": "${default_location}",
  "identity": {
    "type": "SystemAssigned"
  }
}

覆盖基础架构配置

使用.alz_archetype_override.yaml文件来扩展基础架构配置:

base_archetype: root
name: root-custom
policy_assignments_to_add:
  - "Inherit-RG-Tags"
policy_definitions_to_add:
  - "Inherit-RG-Tags"

Terraform模块配置

在Terraform主配置文件中,需要正确引用自定义策略:

provider "alz" {
  library_references = [{
    path = "platform/alz"
    ref  = "2025.02.0"
    },
    {
      custom_url = "${path.root}/lib"
  }]
}

module "alz" {
  source             = "Azure/avm-ptn-alz/azurerm"
  version            = "0.11.1"
  architecture_name  = "custom"
  parent_resource_id = data.azapi_client_config.current.tenant_id
  
  policy_assignments_to_modify = {
    alz-root = {
      policy_assignments = {
        Inherit-RG-Tags = {
          parameters = {
            tagName1 = jsonencode({ value = "Environment" })
            tagName2 = jsonencode({ value = "Department" })
          }
        }
      }
    }
  }
}

常见问题解决方案

  1. 策略未被识别:确保文件名使用正确的.alz_policy_definition.json.alz_policy_assignment.json后缀

  2. 参数传递错误:在Terraform模块中正确配置policy_assignments_to_modify部分的参数

  3. 基础策略缺失:使用base_archetype继承基础策略时,确保引用的策略定义已存在

最佳实践建议

  1. 采用模块化设计,将不同功能的策略分开定义

  2. 为策略添加清晰的描述和元数据,便于后续管理

  3. 使用版本控制管理策略定义,便于追踪变更

  4. 在测试环境中验证策略效果后再应用到生产环境

  5. 考虑策略执行对现有资源的影响,合理设置enforcementMode

通过以上步骤和最佳实践,企业可以在Azure环境中建立完善的策略管理体系,确保资源合规性和安全性。

terraform-azurerm-avm-ptn-alz Terraform module to deploy Azure Landing Zones terraform-azurerm-avm-ptn-alz 项目地址: https://gitcode.com/gh_mirrors/te/terraform-azurerm-avm-ptn-alz

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣芮宜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值