HashiCorp Terraform 插件框架现已正式发布

HashiCorp 发布 Terraform Plugin Framework 1.0 版本

HashiCorp 宣布 Terraform Plugin Framework 1.0 正式发布,该框架取代了现有的 Terraform Plugin SDKv2,并提供了多项改进。新框架支持验证器、路径表达式、嵌套属性、资源私有状态管理以及自定义类型。基于该框架的插件将以 Go 语言编写的可执行二进制文件形式提供。

主要改进与功能

  1. 可维护性与未来性
    新框架的代码更易于维护,并为未来的 Terraform 插件开发功能和工具奠定了基础。HashiCorp 团队成员 Brian Flad、Dave Parfitt 和 Vishnu Ravindra 均表示,新框架在多个方面优于之前的 SDKv2。
  2. 验证器
    新框架内置了多种预构建的验证器,用于向用户提供关于语法、类型和可接受值的反馈。例如,验证器可以检查字符串长度或确保数字在有效范围内。这些验证器位于 terraform-plugin-framework-validators Go 模块中。

    示例代码:

    schema.StringAttribute{
        Validators: []validator.String{
            stringvalidator.LengthBetween(10, 256),
            stringvalidator.RegexMatches(
                regexp.MustCompile(`^[a-z0-9]+$`),
                "must contain only lowercase alphanumeric characters",
            ),
        },
    }
  3. 路径表达式
    路径表达式允许通过相对路径指定属性之间的关系。这些表达式可以表示模式或基于模式的数据中的一个或多个实际路径。相对路径表达式可以使用 path.MatchRelative() 函数启动。
  4. 资源私有状态管理
    该功能允许将数据与状态一起存储,但不在 Terraform 计划中显示。HashiCorp 建议将其用于存储和检索不需要向用户显示的值,例如 API 调用的 ETags。提供程序可以在创建、导入、规划、读取和更新操作期间保存此数据,并在删除、规划、读取和更新操作期间读取数据。

    示例代码:

    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.
            ... 
        }
    }

兼容性与迁移

  • SDKv2 支持
    虽然 Terraform Plugin SDKv2 将继续得到支持,但 HashiCorp 表示新框架将优先获得新功能和工具的支持。
  • 向后兼容性
    基于新框架的插件可以向后兼容 Terraform 0.12 及以上版本。
  • Terraform Plugin Protocol 版本 6
    用户可以选择使用新的 Terraform Plugin Protocol 版本 6,以访问 Terraform 1.x 版本中的最新功能。

资源与指南

  • 迁移指南
    提供了从 Terraform Plugin SDKv2 迁移到新框架的指南。
  • 更多信息
    更多关于发布的详细信息可以在 HashiCorp 博客入门页面 上找到。

总结

Terraform Plugin Framework 1.0 的发布标志着 Terraform 插件开发的一个重要里程碑。新框架不仅提升了代码的可维护性,还引入了多项新功能,为未来的插件开发提供了更强大的支持。尽管 SDKv2 仍将继续支持,但新框架将成为未来开发的首选。

阅读 38
0 条评论