Terraform count多实例PG灵活服务器关联for_each配置方法
问题原因
你当前代码无法关联多台服务器的核心原因有两个:
- 用
count创建的azurerm_postgresql_flexible_server.example是资源实例列表,直接访问.id不符合Terraform的资源引用规则,无法拿到单台实例的实际ID - 现有
flat_config仅展开了配置项维度,没有和多台PostgreSQL实例做关联,配置资源没有生成对应每台服务器的独立实例,自然无法批量生效。Splat表达式返回的是ID列表,而server_id参数仅接受单个字符串值,直接传列表会触发参数类型不匹配的报错。
实现方案
不需要把现有for_each改成count,只需要调整本地值逻辑,把服务器实例和配置项做笛卡尔积,生成每个「服务器+配置项」组合对应的唯一资源键即可,原有创建PostgreSQL服务器的代码不需要改动。
- 调整本地值定义,新增服务器和配置的组合映射:
locals { # 保留原有配置展开逻辑 flat_config = merge([ for single_config in var.config: { for value in single_config.values: "${single_config.name}-${value}" => { "name" = single_config.name "value" = value } } ]...) # 生成全量「服务器+配置项」组合,每个组合对应一个configuration资源 server_config_pairs = merge([ for psql_server in azurerm_postgresql_flexible_server.example : { for config_key, config_info in local.flat_config : "${psql_server.name}-${config_key}" => { server_id = psql_server.id config_name = config_info.name config_value = config_info.value } } ]...) }
- 修改configuration资源的for_each引用:
resource "azurerm_postgresql_flexible_server_configuration" "example" { for_each = local.server_config_pairs name = each.value.config_name server_id = each.value.server_id value = each.value.config_value }
方案说明
- 该方案的for_each键使用「服务器名称+配置项唯一标识」的复合键,后续增减PostgreSQL实例、调整配置项列表时,只会精准增删对应的configuration资源,不会出现资源顺序错乱导致的批量重建问题,稳定性远高于直接套count的实现
- 如果你后续把PostgreSQL服务器的创建方式从count改成for_each,这个逻辑也只需要极小调整就能适配
- 不要直接给configuration资源嵌套count按索引匹配,一旦调整服务器或者配置的顺序,会触发大量非预期的资源删除重建操作。
内容的提问来源于stack exchange,提问作者iluv_dev
相关产品推荐
相关产品推荐

