Terraform用for_each创建动态资源时条件过滤失效如何解决
问题根因
你原有代码的核心问题是for_each的过滤条件作用域错误:
你在if判断位传入了所有parameters元素的init值组成的列表,Terraform会将非空列表直接判定为布尔值true,因此这个全局判断条件会作用于所有元素,无法实现单个元素的独立过滤。同时直接用列表索引作为for_each的键存在索引变更导致资源意外重建的风险,建议用唯一的name字段作为键。
修复后的代码
resource "aws_autoscaling_group" "aws_asg" { # 遍历每个参数对象,仅保留init为true的项,用name作为唯一键避免索引变动影响资源 for_each = { for param in var.parameters : param.name => param if param.init } # 资源参数直接通过each.value调用即可,示例如下: name = each.value.name min_size = each.value.scaling.minimum max_size = each.value.scaling.maximum desired_capacity = each.value.scaling.desired # 其余ASG配置参数按需补充 }
逻辑说明
- 遍历
var.parameters中的每一个对象,以对象的name属性作为生成map的键,对象本身作为值 - 每个对象单独判断自身的
init属性,仅init == true的对象会被保留到for_each的map中,对应创建ASG资源 - 用
name作为键比用列表索引更稳定,后续调整参数列表顺序不会导致已有资源被误删重建
内容的提问来源于stack exchange,提问作者Unity
相关产品推荐
相关产品推荐

