如何在Terraform Provider Schema中定义含任意配置的ListNestedAttribute
解决方案
你的需求完全可行,以下两种方案可以实现:
方案1:使用DynamicAttribute(推荐)
你之前认为DynamicAttribute无法在集合中使用是误解,Terraform Plugin Framework 完全支持在嵌套对象属性中使用它来接收任意类型的值。直接将schema.Something替换为schema.DynamicAttribute即可,示例代码:
resp.Schema = schema.Schema { Attributes: map[string]schema.Attribute { "my_list": schema.ListNestedAttribute { Required: true, NestedObject: schema.NestedAttributeObject { Attributes: map[string]schema.Attribute { "config": schema.DynamicAttribute { Required: true, // 根据需求设置为Required/Optional } } } } } }
这种方式允许用户传入任意类型的config值(字符串、数字、嵌套对象、数组等),框架会自动处理类型转换和存储。
方案2:使用StringAttribute存储JSON字符串
如果遇到DynamicAttribute的兼容问题(比如旧版本框架限制),可以用字符串类型接收JSON格式的任意配置,再在代码中自行解析:
import "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" import "github.com/hashicorp/terraform-plugin-framework/schema/validator" // ... resp.Schema = schema.Schema { Attributes: map[string]schema.Attribute { "my_list": schema.ListNestedAttribute { Required: true, NestedObject: schema.NestedAttributeObject { Attributes: map[string]schema.Attribute { "config": schema.StringAttribute { Required: true, Validators: []validator.String{ stringvalidator.IsJSON(), // 校验输入为合法JSON }, } } } } } }
后续在读取配置时,你可以将这个字符串解析为interface{}或者具体的结构体,比如:
var configStr string diags := req.Config.GetAttribute(ctx, path.Root("my_list").AtListIndex(0).AtName("config"), &configStr) if diags.HasError() { return diags } var config interface{} err := json.Unmarshal([]byte(configStr), &config) // 处理错误
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

