You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:15:36