Terraform 操作 AWS ASG 清理已启用监控指标触发报错求助
ASG 指标同步报ValidationError问题解决方案
问题本质
这个报错和当前HCL配置内容无关,是Terraform状态缓存值与AWS侧实际资源状态不一致触发的老版本provider逻辑缺陷:
- 你的状态文件中记录该ASG历史上曾开启过包含Warm Pool相关指标在内的全部21个ASG指标采集,但当前该ASG已经没有配置Warm Pool功能,AWS控制面不再将WarmPool前缀的指标判定为该资源的合法可操作值。
- Terraform对ASG资源的
enabled_metrics参数处理逻辑存在缺陷:当检测到配置未声明该参数、需要同步为空集合时,会直接将状态中缓存的所有旧指标值作为参数传入AWSDisableMetricsCollection接口,不会校验这些值在当前资源上下文下的合法性。 - 你显式添加
enabled_metrics = []无效的原因就是:Terraform构造请求时根本不会读取你配置里的空列表,只会读取状态中缓存的旧值发请求,因此必然被AWS的指标合法性校验拦截。
分步解决流程
- 先通过AWS CLI查询该ASG当前实际支持的已启用指标列表
记录返回结果中aws autoscaling describe-metrics-collections --auto-scaling-group-name cloud-logstashcluster-asgMetrics字段下的所有合法值,这部分是AWS当前认可的、可以操作的指标范围。 - 手动修正Terraform状态中缓存的
enabled_metrics值
不用移除整个ASG资源,直接用state set命令把状态里缓存的指标列表替换成上一步查到的实际值:
操作完成后可以通过# 如果AWS侧当前没有启用任何指标,直接将状态里的enabled_metrics设为空列表 terraform state set 'aws_autoscaling_group.logstashcluster_asg' enabled_metrics=[]terraform state show aws_autoscaling_group.logstashcluster_asg确认状态中的enabled_metrics值已经没有WarmPool前缀的非法旧值。 - 匹配实际需求调整HCL配置
- 若不需要启用任何ASG指标采集,保持当前配置不声明
enabled_metrics、或显式写enabled_metrics = []即可,此时Terraform做配置diff时会发现状态与配置完全一致,不会再触发被AWS拒绝的旧请求。 - 若需要保留指定指标采集,在配置中显式声明你需要的合法指标列表(必须是上一步查到的、AWS认可的值,不能包含WarmPool类指标):
enabled_metrics = [ "GroupMinSize", "GroupMaxSize", "GroupDesiredCapacity", "GroupInServiceInstances" ]
- 若不需要启用任何ASG指标采集,保持当前配置不声明
可选临时绕开方案
若不想手动修正状态,可以将AWS provider升级到v5.17.0及以上版本。该版本修复了ASG资源的指标同步逻辑:构造DisableMetricsCollection请求前,会自动过滤掉当前资源上下文下不支持的非法缓存值,不会向AWS发送带非法参数的请求。
注意:升级provider前需做好全量兼容性测试,避免影响栈内其他资源的同步逻辑。
避坑提醒
- 不要尝试通过重建ASG的方式绕开问题:Terraform在执行
create_before_destroy替换逻辑前,依然会先对旧ASG执行指标同步操作,必然触发同样的400报错。 - 不要仅在AWS控制台手动关闭所有指标采集后就跑Terraform:状态中缓存的21个旧非法指标值依然存在,下次apply时还是会拿着这批旧值发请求,照样会被AWS拒绝。
内容的提问来源于stack exchange,提问作者JackOuttaBox
相关产品推荐
相关产品推荐

