我应该为 Terraform 资源设置一个空字符串计算字符串属性吗?
Shall I set an empty string computed string attribute for Terraform resource?
上下文:我正在向 TF 提供程序添加新资源。
我有一个 API 可以选择 return 一个字符串属性,所以我将其表示为:
"foo": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},
问题:如果 API return 的值未设置/response.foo
的空字符串,我是否仍应为 foo
属性设置一个空字符串,或者我应该不设置任何值(例如 null
)?
在我的资源架构中。
(您好!我就是您截图中回答的那个人。)
如果两种方法——返回 null
或返回空字符串——从技术角度来看同样可行,那么我通常更愿意使用 null
来表示值的缺失,因为这明显不同于空字符串,在某些情况下,空字符串否则将是该属性的有效现值。
但是,由于您在这里使用的似乎是旧版 SDK(“SDKv2”),因此从技术角度来看您可能会受到限制:SDKv2 是为 Terraform v0.11 及更早版本设计的,因此它早于这个想法属性是 null
,因此无法在其 API 中指定。您可以通过在 Create
函数中根本不调用 d.Set("foo", ...)
来“欺骗”SDK 进入 有效地 返回 null
,但是有没有 API 提供给 unset 一个属性,所以一旦你将它设置为某个东西 non-null 通常就没有办法让它恢复到原来的状态再次null
。
鉴于此,我建议在使用旧 SDK 时最好保持一致并始终使用 ""
,因为这样提供者的用户将不必处理值的不一致在这种情况下,有时是 null
,有时是 ""
。
使用现代 Terraform Plugin Framework 时,此限制不适用,因为该框架在设计时考虑了现代 Terraform 语言。您没有使用该框架,因此这部分答案现在可能对您没有帮助,但我提到它只是为了防止将来可能已经在使用或正在考虑使用的其他人找到此答案新框架。
上下文:我正在向 TF 提供程序添加新资源。
我有一个 API 可以选择 return 一个字符串属性,所以我将其表示为:
"foo": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},
问题:如果 API return 的值未设置/response.foo
的空字符串,我是否仍应为 foo
属性设置一个空字符串,或者我应该不设置任何值(例如 null
)?
在我的资源架构中。
(您好!我就是您截图中回答的那个人。)
如果两种方法——返回 null
或返回空字符串——从技术角度来看同样可行,那么我通常更愿意使用 null
来表示值的缺失,因为这明显不同于空字符串,在某些情况下,空字符串否则将是该属性的有效现值。
但是,由于您在这里使用的似乎是旧版 SDK(“SDKv2”),因此从技术角度来看您可能会受到限制:SDKv2 是为 Terraform v0.11 及更早版本设计的,因此它早于这个想法属性是 null
,因此无法在其 API 中指定。您可以通过在 Create
函数中根本不调用 d.Set("foo", ...)
来“欺骗”SDK 进入 有效地 返回 null
,但是有没有 API 提供给 unset 一个属性,所以一旦你将它设置为某个东西 non-null 通常就没有办法让它恢复到原来的状态再次null
。
鉴于此,我建议在使用旧 SDK 时最好保持一致并始终使用 ""
,因为这样提供者的用户将不必处理值的不一致在这种情况下,有时是 null
,有时是 ""
。
使用现代 Terraform Plugin Framework 时,此限制不适用,因为该框架在设计时考虑了现代 Terraform 语言。您没有使用该框架,因此这部分答案现在可能对您没有帮助,但我提到它只是为了防止将来可能已经在使用或正在考虑使用的其他人找到此答案新框架。