Terraform忽略ASG的commit_location标签变更报错及解决尝试遇阻
解决Terraform AWS ASG中忽略
commit_location标签变更的问题 错误解读
第一个错误原因
AWS Provider v5对ASG的tag块做了调整,现在它是对象集合(set)类型,不再是可通过key直接索引的结构,所以tag["commit_location"]这种写法会报错——集合元素没有可寻址的键,必须用for表达式筛选匹配的元素。
第二个错误原因
你尝试的动态标签方案里,ignore_changes的写法违反了Terraform的语法规则:
ignore_changes数组中只能放静态属性引用,不能直接写带if的条件表达式tags[*].value的写法错误,ASG资源里的标签块字段名是tag而非tags,且不能用这种批量引用方式
有效解决方案
不管是用静态tag块还是动态tag块,核心都是用for表达式在ignore_changes中精准筛选要忽略的标签对象。
方案1:保留静态tag块
直接修改lifecycle配置即可,不用改动原有的tag定义:
tag { key = "Name" value = "${var.stage}-${var.name}" propagate_at_launch = true } tag { key = "commit_location" value = data.aws_ssm_parameter.commit_location.value propagate_at_launch = true } lifecycle { ignore_changes = [ # 遍历所有tag块,筛选出key为commit_location的元素 for t in tag : t if t.key == "commit_location" ] }
方案2:使用动态tag块
如果坚持用动态标签,同样用for表达式筛选:
dynamic "tag" { for_each = { Name = "${var.stage}-${var.name}" commit_location = data.aws_ssm_parameter.commit_location.value } content { key = tag.key value = tag.value propagate_at_launch = true } } lifecycle { ignore_changes = [ for t in tag : t if t.key == "commit_location" ] }
验证方式
修改data.aws_ssm_parameter.commit_location.value对应的SSM参数值后,执行terraform plan,你会看到ASG资源不再因为commit_location标签的变更而被标记为需要更新。
内容的提问来源于stack exchange,提问作者bliq00
相关产品推荐
相关产品推荐

