ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Terraform AWS Provider 查询 Image Builder 镜像管道:aws_imagebuilder_image_pipeline 数据源完整指南

Terraform AWS Provider 查询 Image Builder 镜像管道:aws_imagebuilder_image_pipeline 数据源完整指南 Terraform AWS Provider 查询 Image Builder 镜像管道aws_imagebuilder_image_pipeline 数据源完整指南【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsEC2 Image Builder 是 AWS 上用于构建、测试与分发自定义 VM 镜像和容器镜像的托管服务而 Image Pipeline镜像管道正是驱动整套构建流程的核心编排对象。本文基于 terraform-provider-aws 仓库中 aws_imagebuilder_image_pipeline 数据源文档 及其实现在 internal/service/imagebuilder/image_pipeline_data_source.go 中的源码系统讲解如何使用aws_imagebuilder_image_pipeline数据源按 ARN 读取既有镜像管道的全部配置信息并说明region跨区域覆盖、各嵌套属性块的字段语义以及底层 AWS API 调用链帮助你把它与aws_imagebuilder_image_pipeline资源配合构建出可查询、可引用的完整镜像流水线基础设施。一、数据源与资源的定位差异在 terraform-provider-aws 的 ImageBuilder 包internal/service/imagebuilder中围绕镜像管道存在两组能力资源aws_imagebuilder_image_pipeline负责创建、更新、删除管道CRUD实现在 image_pipeline.go标注为SDKResource(aws_imagebuilder_image_pipeline, nameImage Pipeline)。数据源aws_imagebuilder_image_pipeline只读查询按 ARN 获取既有管道的属性快照实现在 image_pipeline_data_source.go标注为SDKDataSource(aws_imagebuilder_image_pipeline, nameImage Pipeline)并带有Tags注解表示会一并导出标签。两者的 Schema 结构高度一致资源的输入字段在数据源中大多变为Computed: true只读导出只有arn是数据源唯一必需的输入参数。理解这一点后你既可以用数据源引用「他人或历史遗留」的管道也可以在同一次 plan 内先创建管道资源、再通过数据源把管道的 ARN 与属性安全地暴露给下游模块。二、最简用法按 ARN 查询管道原文档给出的最小示例即按 ARN 读取data aws_imagebuilder_image_pipeline example { arn arn:aws:imagebuilder:us-west-2:aws:image-pipeline/example }随后即可通过data.aws_imagebuilder_image_pipeline.example.name、data.aws_imagebuilder_image_pipeline.example.platform等表达式在配置中引用管道属性。需要特别说明的是arn的格式约束从源码 image_pipeline_data_source.go 可见arn是Required必填且经过verify.ValidARN校验的字符串传入非法 ARN 会在 plan 阶段直接报错。测试与仓库中的实际配置也遵循arn:partition:imagebuilder:region:account:image-pipeline/name的 AWS 标准 ARN 形态。三、实战示例创建后回读源自仓库验收测试仓库中的数据源验收测试 image_pipeline_data_source_test.go 展示了「资源创建 → 数据源回读 → 属性对拍」的完整链路这是把数据源用在实际模块中最常见的姿势。以下示例还原了测试中的核心流程VM 镜像管道场景data aws_region current {} data aws_partition current {} resource aws_iam_role example { assume_role_policy jsonencode({ Version 2012-10-17 Statement [{ Action sts:AssumeRole Effect Allow Principal { Service ec2.${data.aws_partition.current.dns_suffix} } Sid }] }) name imagebuilder-pipeline-role } resource aws_iam_instance_profile example { name aws_iam_role.example.name role aws_iam_role.example.name } resource aws_imagebuilder_component example { data yamlencode({ schemaVersion 1.0 phases [{ name build steps [{ action ExecuteBash name example inputs { commands [echo hello world] } onFailure Continue }] }] }) name example-component platform Linux version 1.0.0 } resource aws_imagebuilder_infrastructure_configuration example { instance_profile_name aws_iam_instance_profile.example.name name example-infra } resource aws_imagebuilder_image_recipe example { component { component_arn aws_imagebuilder_component.example.arn } name example-recipe parent_image arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.region}:aws:image/amazon-linux-2-x86/x.x.x version 1.0.0 } resource aws_imagebuilder_image_pipeline example { image_recipe_arn aws_imagebuilder_image_recipe.example.arn infrastructure_configuration_arn aws_imagebuilder_infrastructure_configuration.example.arn name example-pipeline } data aws_imagebuilder_image_pipeline example { arn aws_imagebuilder_image_pipeline.example.arn } output pipeline_platform { value data.aws_imagebuilder_image_pipeline.example.platform } output pipeline_status { value data.aws_imagebuilder_image_pipeline.example.status }在验收测试TestAccImageBuilderImagePipelineDataSource_arn中数据源的arn、container_recipe_arn、date_created、date_last_run、date_next_run、date_updated、description、distribution_configuration_arn、enhanced_image_metadata_enabled、image_recipe_arn、image_scanning_configuration.#、image_tests_configuration.#、infrastructure_configuration_arn、name、platform、schedule.#、status、tags.%全部与对应资源属性做TestCheckResourceAttrPair对拍确保数据源读取结果与资源状态完全一致——这也是你在模块中使用数据源时可以放心的依据。针对容器镜像管道测试TestAccImageBuilderImagePipelineDataSource_containerRecipeARN展示了使用container_recipe_arn而非image_recipe_arn的变体并同时验证了image_scanning_configuration块在启用 ECR 扫描时的回读一致性resource aws_ecr_repository example { name example-repo } resource aws_imagebuilder_container_recipe example { component { component_arn aws_imagebuilder_component.example.arn } dockerfile_template_data EOF FROM {{{ imagebuilder:parentImage }}} {{{ imagebuilder:environments }}} {{{ imagebuilder:components }}} EOF name example-container-recipe container_type DOCKER parent_image arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.region}:aws:image/amazon-linux-x86-latest/x.x.x version 1.0.0 target_repository { repository_name aws_ecr_repository.example.name service ECR } } resource aws_imagebuilder_image_pipeline example { container_recipe_arn aws_imagebuilder_container_recipe.example.arn infrastructure_configuration_arn aws_imagebuilder_infrastructure_configuration.example.arn name example-container-pipeline image_scanning_configuration { image_scanning_enabled true ecr_configuration { container_tags [a, b] repository_name aws_ecr_repository.example.name } } } data aws_imagebuilder_image_pipeline example { arn aws_imagebuilder_image_pipeline.example.arn }四、Argument Reference参数详解该数据源支持以下参数参数必填说明arn是镜像管道的 ARN作为查询主键。源码中使用verify.ValidARN校验见 image_pipeline_data_source.go。region否指定该数据源在哪个 Region 下执行查询覆盖 provider 配置中的默认 Region适用于跨区域读取管道。详见下文第六节。原文档中region的定位是「Region where this resource will be managed」即区域级覆盖参数。如果未显式指定则默认使用 provider 配置中设置的 Region。这对 ImageBuilder 这类严格分区域regional endpoint的服务意义重大——每个 Region 内的管道是相互隔离的。五、Attribute Reference导出属性全解除上述参数外数据源导出以下属性。所有属性在源码 image_pipeline_data_source.go 的 Schema 中均标记为Computed: true由GetImagePipelineAPI 返回值填充。5.1 基础标识与元数据container_recipe_arn— 容器配方 ARN。若管道基于容器镜像构建则为非空此时image_recipe_arn为空。image_recipe_arn— 镜像配方 ARN。若管道基于 VM 镜像构建则为非空。资源侧见 image_pipeline.go通过ExactlyOneOf约束container_recipe_arn与image_recipe_arn二选一因此数据源回读时两者至多只有一个有值。name— 管道名称。description— 管道描述。platform— 管道平台如Linux/Windows由构建配方决定。status— 管道状态ENABLED/DISABLED。enhanced_image_metadata_enabled— 是否在构建镜像时收集附加元数据。资源侧默认值为true。tags— 管道的标签键值映射TypeMap结构来自tftags.TagsSchemaComputed()数据源同样导出由setTagsOut写入的标签结果。5.2 时间与调度信息date_created— 管道创建时间。date_last_run— 管道最近一次运行时间。date_next_run— 管道下一次计划运行时间。date_updated— 管道最近一次更新时间。schedule— 调度设置对象列表TypeList最多 1 个元素包含schedule_expression— Cron 表达式定义管道启动条件被评估的频率。资源侧为必填项长度 11024。pipeline_execution_start_condition— 触发新构建的条件。资源侧默认值为EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE表达式匹配且有依赖更新可用时才触发。timezone— 调度时区。虽然原文档属性表中未列出但从源码 flattenSchedule 可以看到timezone同样会被回读导出。5.3 关联配置 ARNdistribution_configuration_arn— 关联的 Image Builder 分发配置Distribution ConfigurationARN决定构建产物分发到哪些区域/账户。infrastructure_configuration_arn— 关联的基础设施配置Infrastructure ConfigurationARN决定构建实例的实例类型、IAM 角色、子网等运行时参数。5.4 扫描与测试配置image_scanning_configuration— 镜像扫描配置对象列表结构为image_scanning_enabled— 是否启用镜像扫描资源侧默认false。ecr_configuration— 用于镜像扫描的 ECR 配置对象列表repository_name— Amazon Inspector 扫描的容器仓库名称。container_tags— 附加到被扫描输出容器上的标签集合TypeSet。该块的读写展开/扁平化由expandImageScanningConfiguration/flattenImageScanningConfiguration与expandECRConfiguration/flattenECRConfiguration完成见 image_pipeline.go。注意原文档在属性表中把扫描配置错误地重复命名为image_tests_configuration实际正确的块名应以源码 Schema 为准即扫描为image_scanning_configuration测试为下述image_tests_configuration。image_tests_configuration— 镜像测试配置对象列表image_tests_enabled— 是否启用构建后测试资源侧默认true。timeout_minutes— 测试超时分钟数资源侧默认720取值范围 601440由validation.IntBetween约束见 image_pipeline.go。六、跨区域读取region 参数与多区域实践Image Builder 的资源按区域隔离若你的管道位于非默认区域或需要在一个配置中汇总多个区域的管道信息可显式传入regiondata aws_imagebuilder_image_pipeline east { arn arn:aws:imagebuilder:us-east-1:123456789012:image-pipeline/prod-east region us-east-1 } data aws_imagebuilder_image_pipeline west { arn arn:aws:imagebuilder:us-west-2:123456789012:image-pipeline/prod-west region us-west-2 }仓库中针对该区域覆盖能力提供了专门的验收测试TestAccImageBuilderImagePipeline_Identity_regionOverride见 image_pipeline_identity_gen_test.go其测试配置 testdata/ImagePipeline/region_override/main_gen.tf 展示了region var.region同时作用于数据源、资源、配方与基础设施配置的写法测试还会验证region属性回读值与AlternateRegion完全一致knownvalue.StringExact(acctest.AlternateRegion())。七、底层实现原理从 ARN 到属性快照数据源的读取逻辑集中在dataSourceImagePipelineRead见 image_pipeline_data_source.go其调用链为从 provider 客户端上下文取得 ImageBuilder SDK 客户端conn : meta.(*conns.AWSClient).ImageBuilderClient(ctx)取出配置中的arn调用findImagePipelineByARN(ctx, conn, arn)查询管道查询成功后以 ARN 作为资源 IDd.SetId(aws.ToString(imagePipeline.Arn))并把 API 返回的*awstypes.ImagePipeline各字段逐一d.Set到 Schema 属性中通过setTagsOut(ctx, imagePipeline.Tags)将标签写入数据源状态支持Tags注解声明的标签导出。其中findImagePipelineByARN定义在同包 image_pipeline.go内部封装conn.GetImagePipeline调用若 AWS 返回ResourceNotFoundException错误码定义于 errors.go则包装为retry.NotFoundError供上层做「不存在即忽略」处理若响应为空或ImagePipeline对象为空返回tfresource.NewEmptyResultError()其他错误原样透传最终由数据源层统一包装为reading Image Builder Image Pipeline (%s)的诊断信息。对比资源侧的resourceImagePipelineRead可以发现两者的字段映射完全同构区别仅在于资源还处理!d.IsNewResource() retry.NotFound(err)时的状态清理从 state 移除。这保证了「先建后查」时数据源与资源看到的属性一定一致。八、身份与导入以 ARN 为唯一标识该数据源与同名资源均以 ARN 作为唯一身份标识数据源读取后Id即 ARN资源侧同样标注了ArnIdentity注解资源的id与arn恒等。自动化身份测试TestAccImageBuilderImagePipeline_Identity_basic见 image_pipeline_identity_gen_test.go通过statecheck.CompareValuePairs(resourceName, id, resourceName, arn, compare.ValuesSame())直接验证这一恒等关系并断言arn不为空导入import时直接使用 ARN 作为 import ID跨区域场景可追加region后缀。测试注释表明 Region/Identity 相关能力在 v6.3.0 之后引入// Resource Identity was added after v6.3.0因此若使用较旧版本 provider请留意版本前提。九、使用建议与注意事项区分容器与 VM 管道判断管道类型时优先看container_recipe_arn与image_recipe_arn哪个非空platform反映操作系统平台两者维度不同不要混用。调度字段的默认语义schedule.pipeline_execution_start_condition默认为「表达式匹配且存在依赖更新」才触发若你期望严格按 Cron 定时构建应在资源侧显式配置该字段并注意数据源只读、无法修改管道。跨区域查询记得配regionImageBuilder 管道按区域隔离忘记指定region时数据源会在默认区域查询可能得到ResourceNotFoundException数据源侧会报「reading Image Builder Image Pipeline」诊断错误。扫描配置仅影响容器管道image_scanning_configuration与 ECR 仓库强相关VM 镜像管道无需也无法生效启用扫描前需确认 Amazon Inspector 与 ECR 仓库的访问权限已就绪。引用已有管道而非重复创建当管道由其他团队或流程如 CI/CD 管道预先创建时用数据源读取其distribution_configuration_arn、infrastructure_configuration_arn等关联 ARN 去组装下游资源可避免配置漂移和重复管理。十、延伸阅读数据源文档原文website/docs/d/imagebuilder_image_pipeline.html.markdown数据源实现internal/service/imagebuilder/image_pipeline_data_source.go同名资源实现字段默认值与校验规则的权威来源internal/service/imagebuilder/image_pipeline.go数据源验收测试含完整 HCL 示例internal/service/imagebuilder/image_pipeline_data_source_test.go身份/导入/区域覆盖测试internal/service/imagebuilder/image_pipeline_identity_gen_test.goImageBuilder 服务包说明internal/service/imagebuilder/README.md【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进