十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Terraform AWS Provider 数据源 `aws_imagebuilder_components` 实战指南:批量查询 EC2 Image Builder 组件

Terraform AWS Provider 数据源 `aws_imagebuilder_components` 实战指南:批量查询 EC2 Image Builder 组件 Terraform AWS Provider 数据源aws_imagebuilder_components实战指南批量查询 EC2 Image Builder 组件【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本文围绕 terraform-provider-aws 中的aws_imagebuilder_components数据源展开讲解如何按所有者Owner、平台platform等条件批量检索 EC2 Image Builder 组件一次性获取匹配组件的 ARN 与名称集合。读完本文你将掌握该数据源的参数语义、filter 过滤块的用法、底层 API 调用机制以及结合单组件数据源与资源完成从批量发现到精确读取的完整实践。数据源定位与适用场景aws_imagebuilder_components是 terraform-provider-aws 为 EC2 Image Builder 服务提供的列表型List数据源其职责是按指定条件调用 Image Builder 的ListComponentsAPI返回匹配组件的 ARN 集合与名称集合。它面向批量检索场景与按单个 ARN 精确读取组件详情的aws_imagebuilder_component数据源形成互补。典型应用场景包括在配置中引用当前账号Self下所有自建组件例如配合循环构建 Image Pipeline 或 Image Recipe按平台Linux/Windows筛选出符合条件的组件清单用于做版本对比或生成文档通过name过滤字段精确定位某个命名组件的所有版本组件 ARN 带版本后缀同名组件会有多个版本 ARN。对应源码实现位于 internal/service/imagebuilder/components_data_source.go其官方文档位于 website/docs/d/imagebuilder_components.html.markdown。示例配置按所有者与平台过滤数据源使用非常直接最小示例只需声明owner再叠加一个或多个filter块即可data aws_imagebuilder_components example { owner Self filter { name platform values [Linux] } }配置完成后通过data.aws_imagebuilder_components.example.arns与data.aws_imagebuilder_components.example.names即可引用匹配到的 ARN 与名称集合。下面是更贴合真实工程的组合用法先用数据源批量发现组件再通过for_each结合单组件数据源aws_imagebuilder_component逐个读取完整详情data aws_imagebuilder_components linux_self { owner Self filter { name platform values [Linux] } } data aws_imagebuilder_component this { for_each toset(data.aws_imagebuilder_components.linux_self.arns) arn each.value } output component_versions { value { for arn, ds in data.aws_imagebuilder_component.this : ds.name ds.version } }其中aws_imagebuilder_component数据源的 schema 与读取逻辑见 component_data_source.go它要求arn必填需为合法 ARN并导出data、platform、type、version、supported_os_versions、encrypted、kms_key_id、owner、tags等计算属性。参数参考Argument Reference该数据源支持以下参数参数类型是否必填说明regionstring可选数据源所操作的地域。默认使用 provider 配置 中设置的地域即 Provider 的region参数。ownerstring可选组件的所有者。合法取值为Self、Shared、Amazon、ThirdParty。默认值为Self。filter配置块可重复可选过滤条件集合用于按字段筛选组件详细说明见下文。关于owner的默认值说明文档与源码均确认owner的默认语义为Self。从实现看owner在 schema 中并未显式声明Default但在 components_data_source.go 中通过ValidateDiagFunc: enum.Validate[awstypes.Ownership]()强制校验取值必须是awstypes.Ownership枚举之一。由于d.GetOk(names.AttrOwner)在未配置时返回 falseinput.Owner保持零值此时 AWS 服务端按Self语义处理——这与官方文档Defaults to Self的描述一致。校验器通用实现位于 internal/enum/validate.go它会将配置值与 AWS SDK 的Ownership枚举比对非法取值会在 plan/apply 阶段直接报错。filter 配置块每个filter块支持以下参数参数类型是否必填说明namestring必填过滤字段名。合法取值以 Image BuilderListComponentsAPI 的 Filter 定义为准例如name、platform等。valuesset(string)必填该字段接受的取值集合。只要任一取值命中即算匹配OR 语义。filter块的 schema 并非 Image Builder 专用而是由 provider 统一封装在 internal/namevaluesfilters/name_values_filters.go 中Schema()定义了通用的filter集合结构每个元素包含必填的name与valuesNew()与Add()负责把 Terraform 侧的*schema.Set转换为NameValuesFilters即map[string][]string这一标准中间类型再通过ImageBuilderFilters()适配为 Image Builder 的Filter结构。这样同一套过滤语法可复用于 provider 内多个数据源。属性参考Attribute Reference除上述参数外数据源还会导出以下计算属性属性类型说明arnsset(string)所有匹配 Image Builder 组件的 ARN 集合。namesset(string)所有匹配 Image Builder 组件的名称集合。需要特别说明的是arns与names是集合Set而非列表二者按同一顺序来自 API 返回的组件版本对象可通过索引对应。由于是 Set若后续循环引用建议先toset()或按键名访问避免依赖隐式顺序。源码实现原理从 Terraform 配置到 AWS API数据源的底层实现完整路径如下Schema 定义dataSourceComponents()声明arns、names为计算属性filter使用通用过滤器 schemaowner带枚举校验见 components_data_source.go参数组装读取阶段将filter块经namevaluesfilters.New(v.(*schema.Set)).ImageBuilderFilters()转换为ListComponentsInput.Filters将owner字符串转换为awstypes.Ownership类型components_data_source.go分页拉取findComponents()使用imagebuilder.NewListComponentsPaginator遍历所有分页把每页的ComponentVersionList追加合并为完整结果集components_data_source.go——因此无需担心组件数量超过单页 25 条上限服务端分页限制结果写入对每个ComponentVersion分别取出Arn与Name写入arns、names两个 Set并将数据源 ID 设置为当前 Regioncomponents_data_source.go。从源码可以看出该数据源只返回 ARN 与名称两个维度不包含组件内容yaml 文档、平台类型、版本等明细字段。若要获取这些信息必须将 ARN 传入aws_imagebuilder_component数据源做二次读取其底层调用GetComponent见 component.go 中的findComponentByARN。过滤字段的合法取值从哪来filter.name的合法字段名以 AWS Image BuilderListComponentsAPI 的 Filter 参数定义为准对应 ListComponents API 参考 中的 Filter。常用字段包括name按组件名称过滤可精确匹配某名称下的所有版本platform按平台过滤取值为Linux或Windowstype按组件类型过滤如BUILD、TEST。由于values是集合且采用任一命中即匹配的 OR 语义例如values [Linux]表示只保留 platform 为 Linux 的组件而values [Linux, Windows]则会同时匹配两种平台。测试用例与验证方式仓库中的 acceptance test 验证了数据源与组件资源的联动可作为编写配置的参考模板见 components_data_source_test.goresource aws_imagebuilder_component test { data yamlencode({ phases [{ name build steps [{ action ExecuteBash inputs { commands [echo hello world] } name example onFailure Continue }] }] schemaVersion 1.0 }) name tf-acc-test-component platform Linux version 1.0.0 } data aws_imagebuilder_components test { filter { name name values [aws_imagebuilder_component.test.name] } }测试断言arns.#与names.#均为1证明通过name过滤字段可以精确命中刚创建的组件。注意测试第一步只创建资源、第二步才引入数据源并校验结果——这利用了 Terraform 的依赖图数据源引用了资源的name因此会在资源创建完成后执行读取。使用注意事项与单组件数据源的区分aws_imagebuilder_components复数只输出 ARN/名称集合需要组件 yaml 内容、平台、版本、标签等明细时用aws_imagebuilder_component单数按 ARN 查询owner 语义Self指当前账号下由你创建的组件Amazon指 AWS 官方托管组件Shared指通过 Resource Access Manager 共享的组件ThirdParty指第三方发布的组件地域敏感数据源结果与region默认继承 provider 地域绑定同一组件在不同地域的 ARN 不同跨地域检索需显式指定region分页自动处理无需手动处理nextTokenprovider 内部的分页器已自动聚合所有页结果结果顺序不保证arns/names是 Set 类型不要在配置中依赖服务端返回顺序。总结aws_imagebuilder_components是 terraform-provider-aws 中面向 EC2 Image Builder 组件批量发现的标准入口通过ownerfilter组合条件即可在配置中动态获取组件 ARN 与名称集合再配合单组件数据源实现发现 → 读取明细的完整链路。其实现沉淀了 provider 内部统一的过滤器封装namevaluesfilters与分页读取模式理解它也就掌握了同类列表型数据源的通用用法。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表