Terraform自定义Provider结构体数组配置报错及解决方案咨询
Terraform自定义Provider结构体数组配置解决方案
错误原因
你遇到的"Unsupported argument"错误,根源在于Schema定义中Elem: &schema.Resource{}的设置。Terraform会将这种配置识别为嵌套块类型,而非支持=语法的参数(属性)。因此Terraform要求你用块的形式声明ldus,而不是数组赋值的写法。
两种可行实现方案
方案1:保留嵌套块模式(沿用当前Schema)
如果继续使用TypeList + Elem: Resource的Schema定义,需要将Terraform配置中的数组写法改为重复的嵌套块:
Provider Schema代码(你的现有配置):
"ldus": { Type: schema.TypeList, Required: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "ld_field1": {Type: schema.TypeString, Required: true}, "ld_field2": {Type: schema.TypeInt, Required: true}, // 其他ld-lu结构体字段 }, }, },
正确的Terraform配置写法:
resource "your_custom_resource" "demo" { // 其他顶层属性 ldus { ld_field1 = "foo" ld_field2 = 100 } ldus { ld_field1 = "bar" ld_field2 = 200 } }
方案2:改用对象列表属性(支持数组赋值)
如果希望保留数组ldus = [ ... ]的写法,需要修改Schema,将Elem的类型从Resource改为TypeObject:
修改后的Provider Schema代码:
"ldus": { Type: schema.TypeList, Required: true, Elem: &schema.Schema{ Type: schema.TypeObject, Schema: map[string]*schema.Schema{ "ld_field1": {Type: schema.TypeString, Required: true}, "ld_field2": {Type: schema.TypeInt, Required: true}, // 其他ld-lu结构体字段 }, }, },
对应的Terraform配置写法:
resource "your_custom_resource" "demo" { // 其他顶层属性 ldus = [ { ld_field1 = "foo" ld_field2 = 100 }, { ld_field1 = "bar" ld_field2 = 200 } ] }
说明
两种方案在Terraform v1.3.9版本中均完全支持,选择哪种取决于你偏好的配置语法风格。嵌套块模式更符合Terraform原生资源的常见写法,而对象列表属性则更贴近传统数组的表达形式。
内容的提问来源于stack exchange,提问作者Pratik Mota
相关产品推荐
相关产品推荐

