在Azure Terraform模块中实现自定义策略定义与分配的最佳实践
前言
在Azure云环境中,策略管理是确保资源合规性的重要手段。本文将详细介绍如何在Azure Terraform模块中实现自定义策略定义与分配,帮助管理员构建符合企业需求的治理框架。
准备工作
在开始之前,需要确保已经正确配置了以下内容:
- 安装了最新版本的Terraform
- 配置了Azure Provider
- 了解基本的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" })
}
}
}
}
}
}
常见问题解决方案
-
策略未被识别:确保文件名使用正确的
.alz_policy_definition.json
和.alz_policy_assignment.json
后缀 -
参数传递错误:在Terraform模块中正确配置
policy_assignments_to_modify
部分的参数 -
基础策略缺失:使用
base_archetype
继承基础策略时,确保引用的策略定义已存在
最佳实践建议
-
采用模块化设计,将不同功能的策略分开定义
-
为策略添加清晰的描述和元数据,便于后续管理
-
使用版本控制管理策略定义,便于追踪变更
-
在测试环境中验证策略效果后再应用到生产环境
-
考虑策略执行对现有资源的影响,合理设置
enforcementMode
通过以上步骤和最佳实践,企业可以在Azure环境中建立完善的策略管理体系,确保资源合规性和安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考