自定义Terraform Provider中如何为嵌套块添加标签?
Terraform自定义Provider嵌套块标签问题解答
核心结论
你对官方文档的描述存在误解,文档中提到的支持配置标签的块仅指顶级配置块(如resource、data、provider、module等),资源类型内部定义的嵌套块本身不支持额外配置标签位。
报错原因说明
你当前将settings字段定义为schema.TypeSet类型的嵌套块,该结构对应的配置语法本身不允许添加额外标签,你写的settings "set1" { ... }不符合SDKv2对嵌套集合块的语法规范,因此会触发"多余标签"的报错。
替代实现方案
如果需要给每个settings块配置唯一标识,可以用以下两种成熟方案实现同等效果:
方案1:嵌套块内增必填名称属性
在settings对应的嵌套资源Schema中新增必填的name字段,配置写法调整为:
resource "myprovider_thing" "test" { x = 1 settings { name = "set1" y = 2 } }
后续读取配置时,直接遍历TypeSet中的每个元素,读取name属性即可获取标识。
方案2:改用Map类型承载嵌套结构
将settings的类型从schema.TypeSet改为schema.TypeMap,Elem保持为原有的&schema.Resource结构,配置写法调整为:
resource "myprovider_thing" "test" { x = 1 settings = { set1 = { y = 2 } } }
这种写法中的set1就是Map的键,你可以直接读取Map的键值作为每个配置项的标识,和你原本想要的标签效果完全一致。
官方文档描述补充说明
文档中提到的"特定块类型可配置任意数量的必填标签",对应的示例是resource "myprovider_thing" "test" {}这类顶级块,其中的myprovider_thing、test就是resource块的两个必填标签;而提到的无需标签的块就是network_interface这类资源内部的嵌套块,两类块的定义逻辑完全不同。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

