Terraform 提供者私有状态是全局的还是按资源限定范围?

问题描述 投票:0回答:2

Terraform 提供者能够存储私有状态:https://developer.hashicorp.com/terraform/plugin/framework/resources/private-state#reserved-keys

状态可以这样存储:

func (r *resourceExample) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
    
    value := []byte(`{"valid": "json", "utf8": "safe"}`)
    
    diags := resp.Private.SetKey(ctx, "key", value)
    
    resp.Diagnostics.Append(diags...)
}

状态可以这样读取:

func (r *resourceExample) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
    
    value, diags := req.Private.GetKey(ctx, "key")
    
    resp.Diagnostics.Append(diags...)
    
    if value != nil {
        // value will be []byte.
        ... 
    }
}

此状态的范围是否仅限于资源,这意味着每个资源都可以有自己的

key
版本,或者此状态的范围是否仅限于提供者,这意味着
key
的值一旦设置就可用于所有资源?

如果状态仅限于资源,是否有替代机制可以在资源之间共享数据?

terraform
2个回答
0
投票

可以在函数签名中验证,

resp
结构体是
*resource.ReadResponse
类型,因此它是
resource
结构体的一部分,因此只能在该特定资源中进行读写。

如果您希望在资源之间共享“数据”,那么通常这是在提供者结构中作为客户端完成的,然后在每个资源中从提供者初始化客户端。在官方教程中,您可以在here查看说明和示例。

但是,您似乎在询问要在资源之间共享的任意数据,并且通过为一个资源/数据设置

Computed
属性,然后允许用户将其映射为
Required/Optional 可以更无缝地完成这一点
另一个资源的属性参数。如果情况仍然不是这样,那么我建议澄清问题,使其不那么抽象。


0
投票

像这样的“读取”请求始终针对 Terraform Core 所谓的“资源实例”,如果您使用 count 和 for_each (其中单个资源块然后零个或多个实例),则该请求与“资源”区分开来。

导出以在模块中其他位置使用的属性和您所引用的“私有”数据都属于该资源实例。

提供商有时使用它来跟踪无趣的内部细节,他们稍后需要再次基于此对象采取操作;大多数时候是不必要的,导出的属性就足够了。

Terraform 不提供“提供程序全局”方法来将数据从要应用的计划或从一个计划/应用轮保留到下一轮,但如果您想在单个 Terraform 期间仅以瞬时方式在提供程序中的资源类型之间共享数据那么典型的策略是让您的资源类型实现

ResourceWithConfigure
,将
ProviderData
对象保存为资源类型中的字段,然后安排将必要的数据存储在该对象内。

属于同一提供者实例的所有资源对象将共享相同的

ProviderData
值,因此如果该值包含指向共享对象的指针,则对该对象的突变对该对象的所有持有者都将可见。如果您要在最初创建数据后对其进行更改,请务必使用合适的 Go 同步原语以避免数据竞争,因为框架接受并执行对同一提供者的多个并发请求。

© www.soinside.com 2019 - 2024. All rights reserved.