Terraform无需重建资源为指定Azure子网配置subnet delegation的方法
实现方案
这个方案完全不需要修改你现有的subnets变量定义、tfvars子网配置,只会新增少量代码,所有已有子网不会触发删除重建,仅对指定子网做原地更新添加delegation。
步骤1:新增子网delegation配置变量
在变量文件中新增如下变量,用来存储需要配置delegation的子网对应规则:
variable "subnet_delegations" { type = map(list(object({ name = string service_name = string actions = optional(list(string), ["Microsoft.Network/virtualNetworks/subnets/join/action"]) }))) default = {} description = "指定子网需要配置的service delegation规则,key为子网名称,value为对应的delegation配置列表" }
步骤2:在tfvars文件中添加指定子网的delegation配置
根据你的需求配置mlops-aue-snt-db1、mlops-aue-snt-db2的delegation规则,示例如下(可根据实际需要修改service_name和actions):
subnet_delegations = { "mlops-aue-snt-db1" = [ { name = "sqlManagedInstanceDelegation" service_name = "Microsoft.Sql/managedInstances" } ] "mlops-aue-snt-db2" = [ { name = "postgresqlFlexibleDelegation" service_name = "Microsoft.DBforPostgreSQL/flexibleServers" } ] # 后续要给其他子网加delegation直接在这里加就行,不需要改其他代码 }
步骤3:修改现有azurerm_subnet资源,添加dynamic delegation块
在你现有子网资源代码中添加dynamic块即可,其他原有属性完全不动:
resource "azurerm_subnet" "azr_subnet" { for_each = var.subnets name = each.key resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vnet.name address_prefixes = each.value enforce_private_link_endpoint_network_policies = true # 新增的dynamic delegation块 dynamic "delegation" { # 只有当前子网在subnet_delegations里有配置时才会生成对应的delegation块 for_each = lookup(var.subnet_delegations, each.key, []) content { name = delegation.value.name service_delegation { name = delegation.value.service_name actions = delegation.value.actions } } } }
验证修改
配置完成后执行terraform plan,确认输出的变更只有对需要添加delegation的子网的Update操作,没有任何Destroy/Create操作,确认无误后执行terraform apply即可完成配置。
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

