如何在Terraform Provider Framework中传递提供程序ARN至数据源
如何将Terraform提供程序级ARN配置传递至数据源
问题背景
我希望实现提供程序级配置功能,在特殊场景下传递可选的特定ARN供提供程序使用。示例配置如下:
provider "custom_provider" { arn = "arn:aws:service:region-1:123456789012" }
我已经完成了以下开发步骤:
- 创建提供程序Schema:
func (p *customProvider) Schema(_ context.Context, _ provider.SchemaRequest, resp *provider.SchemaResponse) { resp.Schema = schema.Schema{ Attributes: map[string]schema.Attribute{ "arn": schema.StringAttribute{ Optional: true, }, }, } }
- 实现提供程序数据模型:
type customProviderModel struct { Arn types.String `tfsdk:"arn"` }
- 完成配置功能的基础实现:
func (p *customProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) { var config customProviderModel var arn string diags := req.Config.Get(ctx, &config) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } if !config.Arn.IsNull() { arn = config.Arn.ValueString() } }
但不清楚如何将该ARN从配置传递至数据源,以便在数据源的Read功能中使用它来扮演角色,想要实现类似AWS提供程序传递region的功能。
解决方案
要实现和AWS provider传递region一致的效果,核心是把配置的ARN存储到提供程序实例的状态中,再在数据源初始化时注入这个值,具体步骤如下:
1. 修改提供程序结构体,添加ARN存储字段
在你的customProvider结构体中新增字段,用于保存解析后的ARN:
type customProvider struct { // 保留原有字段 Arn string }
2. 在Configure方法中保存ARN到提供程序实例
修改Configure方法,将解析到的ARN赋值给提供程序实例的字段:
func (p *customProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) { var config customProviderModel diags := req.Config.Get(ctx, &config) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } // 将ARN保存到提供程序实例 if !config.Arn.IsNull() { p.Arn = config.Arn.ValueString() } else { // 可选:设置默认值或留空 p.Arn = "" } }
3. 为数据源结构体添加提供程序引用
每个数据源需要持有指向customProvider的指针,以此访问全局配置的ARN:
type customDataSource struct { provider *customProvider }
4. 注册数据源时注入提供程序实例
在提供程序的注册代码中,通过WithProvider方法将当前提供程序实例传递给数据源:
func New(version string) func() provider.Provider { return func() provider.Provider { p := &customProvider{ // 初始化其他字段 } return provider.New( p, version, provider.WithDataSources( func(ctx context.Context) []func() datasource.DataSource { return []func() datasource.DataSource{ func() datasource.DataSource { return &customDataSource{provider: p} }, } }, ), // 其他配置:资源定义、Schema等 ) } }
5. 在数据源Read方法中使用ARN
现在在数据源的Read方法里,可直接通过d.provider.Arn获取提供程序级配置的ARN,用于角色扮演等逻辑:
func (d *customDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // 获取全局配置的ARN arn := d.provider.Arn if arn != "" { // 执行角色扮演或其他依赖ARN的逻辑 // ... } // 其他数据源读取逻辑 }
核心原理说明
这种实现和AWS provider传递region的逻辑完全一致:
- 提供程序在
Configure阶段加载并持久化全局配置 - 所有数据源/资源在初始化时持有提供程序实例的引用
- 运行时直接从提供程序实例读取全局配置值,无需在每个数据源中重复定义相同参数
内容的提问来源于stack exchange,提问作者alexx087
相关产品推荐
相关产品推荐

