尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

terraform-provider-aws 中 aws_msk_kafka_version 数据源完全指南:MSK Kafka 版本查询与最佳实践

terraform-provider-aws 中 aws_msk_kafka_version 数据源完全指南:MSK Kafka 版本查询与最佳实践 terraform-provider-aws 中 aws_msk_kafka_version 数据源完全指南MSK Kafka 版本查询与最佳实践【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本指南围绕 terraform-provider-aws 官方文档 aws_msk_kafka_version 数据源 展开系统讲解如何通过该数据源精确查询 Amazon MSK 支持的 Kafka 软件版本并串联集群资源aws_msk_cluster的版本声明、升级与重建行为。读完本文你将掌握preferred_versions与version两种查询模式的取舍、status属性的含义以及数据源背后的源码实现与测试验证逻辑。数据源是什么一句话定位aws_msk_kafka_version是 terraform-provider-aws 为 Amazon Managed Streaming for Apache KafkaMSK提供的数据源Data Source用于获取 MSK 平台所支持 Kafka 版本的信息。它本身不创建任何真实云资源而是在terraform plan/apply阶段向 AWS 发起ListKafkaVersions调用将查到的版本号、状态等写入 Terraform 状态供配置中的其他资源引用。它最常见的应用场景是在创建aws_msk_cluster时从一批“可接受版本”中自动选出第一个可用版本避免硬编码版本号导致维护成本校验某个具体版本号如2.8.0、2.4.1.1是否为 MSK 官方支持且当前可用的版本结合status属性判断目标版本是否已进入DEPRECATED状态为版本升级决策提供依据。示例用法官方文档给出的完整用法如下可直接复制使用data aws_msk_kafka_version preferred { preferred_versions [2.4.1.1, 2.4.1, 2.2.1] } data aws_msk_kafka_version example { version 2.8.0 }第一个数据源按“优先顺序”声明了一组候选版本MSK 会返回在列表中第一个命中的版本。当2.4.1.1不可用时会自动回退到2.4.1再不行则回退到2.2.1——这种写法非常适合作为集群配置的版本兜底策略。第二个数据源则是精确指定一个版本号进行查询适合版本策略已经明确的场景。参数详解Argument Reference数据源支持以下参数其中preferred_versions与version必须且只能设置其中一个由源码中的ExactlyOneOf约束保证详见下文源码解析参数是否必填类型说明region可选string执行查询的 AWS 区域。默认使用 Provider 配置中设置的区域。该参数允许对某个特定区域支持的 Kafka 版本做查询不同区域可能支持不同的版本集合preferred_versions二选一list(string)有序的偏好版本列表。按列表顺序与 MSK 返回的可用版本进行匹配返回第一个匹配项version二选一string精确的 MSK Kafka 版本号例如2.4.1.1或2.2.1参数约束要点当preferred_versions中声明的版本一个都没有匹配时数据源会直接报错SingularDataSourceFindErrorterraform plan 阶段就会失败避免将非法版本传入下游资源version传参与preferred_versions的语义不同前者是“我就要这个版本”后者是“按顺序给我挑一个可用的”preferred_versions的顺序语义完全由用户决定数据源不会自动按版本号排序这一点与语义化版本比较无关——它做的是精确字符串匹配匹配逻辑见下文源码。属性详解Attribute Reference数据源在参数之外还会导出以下计算属性属性说明statusMSK Kafka 版本的状态取值为ACTIVE或DEPRECATED。DEPRECATED表示该版本已被标记为弃用建议新集群避免选用此外version本身既是可选参数也是计算属性当通过preferred_versions查询时实际命中并被选中的版本号会回填到version属性中供下游aws_msk_cluster等资源引用。源码级原理数据源是如何工作的Schema 定义与互斥约束数据源的完整实现在 internal/service/kafka/kafka_version_data_source.go。其 Schema 定义非常精简preferred_versionsTypeList的字符串列表可选通过ExactlyOneOf声明与version互斥statusComputed只读计算属性versionOptional且Computed同样通过ExactlyOneOf声明与preferred_versions互斥。ExactlyOneOf是 Terraform SDK 层面的校验机制它保证用户在配置中恰好设置其中一个参数如果两个都写或都不写terraform 校验阶段会直接报错从根源上避免了参数歧义。读取流程数据源的读取入口是dataSourceKafkaVersionRead执行链路如下通过meta.(*conns.AWSClient).KafkaClient(ctx)获取当前区域对应的 MSK API 客户端读取用户配置优先取preferred_versions列表使用flex.ExpandStringValueList展开成 Go 字符串切片若未设置则将version包装成单元素切片调用findKafkaVersion完成查找找到后将版本号写入资源 IDd.SetId(version)并设置status与version两个属性。查找与分页实现findKafkaVersion内部先通过findKafkaVersions调用 AWS 的ListKafkaVersionsAPI并使用 SDK 自带的分页器kafka.NewListKafkaVersionsPaginator遍历所有页将全部KafkaVersions收集到内存中pages : kafka.NewListKafkaVersionsPaginator(conn, input) for pages.HasMorePages() { page, err : pages.NextPage(ctx) ... output append(output, page.KafkaVersions...) }随后进行两层嵌套循环匹配for _, preferredVersion : range preferredVersions { for _, kafkaVersion : range output { if preferredVersion aws.ToString(kafkaVersion.Version) { kafkaVersions append(kafkaVersions, kafkaVersion) } } }外层按用户给出的偏好顺序遍历内层遍历 MSK 返回的版本列表做精确字符串比较因此preferred_versions列表的先后顺序直接决定了匹配优先级。最后通过tfresource.AssertFirstValueResult(kafkaVersions)返回第一个匹配结果若没有任何版本匹配则抛出SingularDataSourceFindError(MSK Kafka Version, err)错误terraform 会将其包装为明确的可读错误信息。一个值得注意的实现细节从源码结构可以推断匹配采用的是逐版本精确匹配而非模糊匹配因此写2.4.1.1与写2.4.1是两个完全不同的版本字符串preferred_versions [2.4, 2.2]这类前缀写法不会命中2.4.1.1若把preferred_versions声明为[2.2.1, 2.4.1.1]即使 MSK 同时支持两者也会返回2.2.1列表顺序优先。与 aws_msk_cluster 的配合从版本查询到集群创建aws_msk_kafka_version数据源最常见的下游消费者是 aws_msk_cluster 资源。在 msk_cluster 文档 中kafka_version是必填参数用于指定期望的 Kafka 软件版本。一个典型的联动写法如下data aws_msk_kafka_version example { preferred_versions [2.8.0, 2.6.0] } resource aws_msk_cluster example { cluster_name example kafka_version data.aws_msk_kafka_version.example.version number_of_broker_nodes 3 # ... 其余 broker_node_group_info、encryption_info 等配置 }这样当 MSK 下线某个旧版本时只需调整数据源的preferred_versions列表无需改动集群资源配置块本身。从源码 internal/service/kafka/cluster.go 可以看到集群资源对版本的处理逻辑kafka_version字段为Required并做了StringLenBetween(1, 64)长度校验cluster.go#L423-L427集群创建时通过KafkaVersion: aws.String(d.Get(kafka_version).(string))传给 MSK APIcluster.go#L600版本升级走UpdateClusterKafkaVersionAPIcluster.go#L988-L1001存在一个值得关注的约束customdiff.ForceNewIfChange(kafka_version, ...)配合semver.LessThan(normalizeKafkaVersion(new), normalizeKafkaVersion(old))判断——如果新版本号低于当前版本降级terraform 会强制替换destroy 后重建集群因为 MSK 不支持版本回退cluster.go#L58-L59normalizeKafkaVersion会移除版本字符串末尾的非数字部分如字母后缀用于版本比较cluster.go#L1481-L1488。因此在使用该数据源做版本兜底时务必让preferred_versions保持“从新到旧”的降序排列避免因命中一个更低版本而触发集群整体重建。测试验证数据源的行为契约数据源的行为由 internal/service/kafka/kafka_version_data_source_test.go 中的两个验收测试Acceptance Test锁定TestAccKafkaKafkaVersionDataSource_basic以version 2.4.1.1精确查询断言返回的version属性等于2.4.1.1且status属性已设置TestAccKafkaKafkaVersionDataSource_preferred以preferred_versions [2.4.1.1, 2.4.1, 2.2.1]查询断言命中2.4.1.1即列表首个可用版本并验证status存在。两个测试都通过testAccVersionPreCheck预检先调用一次ListKafkaVersions若服务不可用例如测试环境未开通 MSK则跳过测试避免误报失败。这些测试直接印证了文档中“返回第一个匹配项”的语义描述。实践建议与注意事项优先使用preferred_versions做版本策略把新版本写在前面、旧版本兜底在后兼顾“用上新版本”和“避免版本下线导致不可用”两个目标version精确查询适合固定版本场景如公司内部统一版本基线直接用硬编码版本配合数据源做存在性校验关注status属性若查询结果显示目标版本DEPRECATED应尽快规划升级防止该版本在未来被 MSK 移除后集群无法重建避免版本回退结合 aws_msk_cluster 的kafka_version升级语义不要将preferred_versions中的兜底版本置于当前版本之下以免触发ForceNew重建注意区域差异region参数允许按区域查询若你的集群部署在多个区域建议为每个区域单独声明数据源因为各区域支持的版本集合可能存在差异。小结aws_msk_kafka_version是 terraform-provider-aws 中一个轻量但实用的数据源通过version或preferred_versions二选一查询 MSK 支持的 Kafka 版本输出status与命中的version供下游集群资源引用。其实现依托ListKafkaVersionsAPI 分页拉取与逐版本精确匹配并依赖ExactlyOneOf与SingularDataSourceFindError保证配置合法性与结果唯一性。将它与aws_msk_cluster的kafka_version参数联动即可构建出健壮、可演进且可自动兜底的 MSK 版本管理方案。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表