CustomizeDiff与DiffSuppressFunc中GetChange的old/new值来源问询
Terraform SDKv2:DiffSuppressFunc和CustomizeDiff的old/new值来源说明
DiffSuppressFunc里的old和new
- 未修改配置时:
old是Terraform状态(state)中存储的资源属性值,new是资源Read方法(即你提到的readResource())从实际基础设施读取到的当前值。 - 用户修改
main.tf后:old依然是Terraform状态里的旧值,new则是用户在配置文件中设置的新期望值,而非Read方法的返回结果。因为用户修改配置后,Terraform会先对比配置与状态生成初步差异,再调用DiffSuppressFunc判断是否需要抑制该差异。
CustomizeDiff里的old和new
通过old, new := d.GetChange("foo")获取的两个值:
old:来自Terraform状态中的现有值;若资源为首次创建,就是属性的默认值(配置未指定时)。new:是用户main.tf中的期望值,或是Terraform通过依赖链计算出的最终期望结果。
补充漂移检测场景:若配置未变但实际基础设施值与状态不一致,CustomizeDiff会结合
Read方法的结果更新差异,但GetChange的old仍为状态值,new会被修正为实际读取到的漂移后的值。
更多资料查阅渠道
- 查看Terraform SDKv2的源码注释:重点看
schema.go中DiffSuppressFunc和CustomizeDiff的定义部分,有详细逻辑说明。 - 阅读Terraform官方Provider开发文档的「资源差异定制」章节,会深入讲解差异计算的完整流程。
- 参考成熟Terraform Provider的实现代码(比如AWS、Azure官方Provider),看他们如何用这两个函数处理差异场景。
内容的提问来源于stack exchange,提问作者Ivan Petrov
相关产品推荐
相关产品推荐

