在Terraform资源中是否可以将指定属性标记为不可变?
Terraform资源属性不可变标记实现方案
你提到的helper/schema SDK实际已经内置了对应支持,你只需要给不可更新的属性添加ForceNew: true配置即可实现不可变效果:
- 配置
ForceNew: true后,只要用户修改该属性的取值,Terraform会直接销毁旧资源、使用新配置重建资源,全程不会触发Update更新逻辑,完全匹配不可更新属性的要求。 - 允许更新的属性不需要添加该配置,保持原有配置即可正常走更新逻辑。
配置示例
Schema: map[string]*schema.Schema{ // 支持更新的属性,无需额外配置 "allow_update_attr": { Type: schema.TypeString, Optional: true, }, // 不可更新的属性,添加ForceNew配置 "immutable_attr": { Type: schema.TypeString, Required: true, ForceNew: true, }, }
如果你不希望修改不可变属性时触发资源重建,而是直接拦截修改请求抛出错误,可以搭配CustomizeDiff钩子实现校验:
Resource: &schema.Resource{ Create: resourceXXXCreate, Read: resourceXXXRead, Update: resourceXXXUpdate, Delete: resourceXXXDelete, // 自定义diff校验逻辑 CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, meta interface{}) error { if diff.HasChange("immutable_attr") { return fmt.Errorf("属性 immutable_attr 为不可变属性,不允许修改") } return nil }, Schema: map[string]*schema.Schema{ // 上述属性定义 }, }
内容的提问来源于stack exchange,提问作者Alex Kuzmin
相关产品推荐
相关产品推荐

