是否可以在 Terraform SDK v2 中对 TypeMap 使用 DiffSuppressFunc?

2023-12-28

当我创建新属性时:

"foo": {
    Type: schema.TypeMap,
    Elem: &schema.Schema{
        Type: schema.TypeString,
    },
    Sensitive:   true,
    Required:    true,
    ForceNew:    false,
},

一切都按预期进行。但是,当我向其中添加新属性时:

DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
  return true
},

忽略 state 和 main.tf 之间的每个更改(foo财产仅用于CREATE) d.Get("foo")开始返回一个空地图,这非常令人困惑。一旦我删除DiffSuppressFunc d.Get("foo")不再是一张空地图(如预期)。

https://github.com/hashicorp/terraform-plugin-sdk/issues/477 https://github.com/hashicorp/terraform-plugin-sdk/issues/477似乎是相关的。

更新:问题似乎是这样的:DiffSuppressFunc正在被调用

"foo.%" "0" "2"

甚至之前d.Get().


此 SDKv2 基于最初为非常旧的 Terraform 版本(v0.11 及更早版本)编写的 SDK,因此它使用了一些不再适用的约定,其中包括您在所有嵌套的部分中看到的这种不寻常的行为资源类型的属性和复杂类型被扁平化为从字符串到字符串的单个映射,特别是名为的映射属性foo其值类似于{ a = 1, b = 2 }最终以以下特殊方式存储在 SDK 抽象中:

"foo.%" = "2"
"foo.a" = "1"
"foo.b" = "2"

The foo.%元素用于记录这是一个地图(而不是foo.#,这将表示一个列表)并记录地图中的元素数量,这对于地图来说并不是很有用,但它是 SDK 如何处理列表的重要组成部分,以便它可以知道需要哪些索引去寻找。

不幸的是,这个实现细节在DiffSuppressFunc因为该特定功能是在流程的后期处理的schema.ResourceData对象已经被展平成上面这样的形状,所以你在该函数中收到的是展平后的原始键和值。

因此,使用起来并不实际或可靠DiffSuppressFunc具有地图或列表属性。由于与 Terraform v0.11 的期望保持兼容的要求,它可能永远不会。 HashiCorp 的一个团队一直致力于开发 SDKv2 的替代品,名为Terraform 插件框架 https://www.terraform.io/plugin/framework它从一开始就是围绕现代 Terraform 的类型系统和假设而设计的,因此它能够更好地以合理的方式支持复杂类型。

不幸的是,新框架目前没有直接等效的框架DiffSuppressFunc since 它的设计仍在考虑中 https://github.com/hashicorp/terraform-plugin-framework/issues/70,但原则上可以通过以下方式实现类似的效果计划修改 https://www.terraform.io/plugin/framework/resources/plan-modification,尽管有更多的样板。在引擎盖下,什么DiffSuppressFunc所做的只是简单地覆盖计划值以匹配先前的状态而不是配置,然后 Terraform 将其理解为配置和先前的状态值是写下相同信息的两种不同方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Terraform SDK v2 中对 TypeMap 使用 DiffSuppressFunc? 的相关文章

随机推荐