Terraform AWS Provider 数据源 aws_imagebuilder_image 完全指南:查询 EC2 Image Builder 镜像的构建版本与产物信息
Terraform AWS Provider 数据源 aws_imagebuilder_image 完全指南查询 EC2 Image Builder 镜像的构建版本与产物信息【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_imagebuilder_image是 Terraform AWS Provider 提供的数据源Data Source用于按 ARN 查询 AWS EC2 Image Builder 已构建完成的镜像返回其构建版本 ARN、关联的镜像配方/容器配方、分发配置、基础设施配置、镜像扫描与测试配置以及 AMI/容器镜像等输出产物等完整信息。本文以 imagebuilder_image.html.markdown 文档为主体结合仓库内 image_data_source.go 等源码实现系统讲解该数据源的用法、参数、属性以及底层读取原理帮助你直接在 HCL 中引用最新构建版本或精确构建版本并将其 ARN 传递给其他资源。数据源概述aws_imagebuilder_image数据源用于获取 EC2 Image Builder 中某个镜像Image的详细信息。在 Image Builder 中镜像构建完成后会以形如arn:aws:imagebuilder:us-west-2:123456789012:image/my-image/1.0.0/1的 ARN 存在其中包含配方版本1.0.0与构建序号1两部分。该数据源弥补了aws_imagebuilder_image资源在只读查询、跨配置引用场景下的不足当你不希望在配置中管理镜像的生命周期而只是想读取已有镜像的元数据时使用数据源即可。在仓库中该数据源的定义位于 image_data_source.go通过// SDKDataSource(aws_imagebuilder_image, nameImage)注解注册属于 Image Builder 服务包的一部分参见 service_package_gen.go。它与同名的aws_imagebuilder_image资源实现见 image.go共享大量扁平化flatten辅助函数因此数据源导出的属性与资源的只读属性高度一致。基础用法查询最新构建版本最典型的场景是查询 AWS 官方预置的公共镜像。Image Builder 会为公共镜像持续发布新版本而 ARN 后缀使用通配符x.x.x时数据源会自动解析为当前最新的构建版本data aws_imagebuilder_image example { arn arn:aws:imagebuilder:us-west-2:aws:image/amazon-linux-2-x86/x.x.x }在真实配置中为兼容不同 AWS 分区如aws、aws-cn、aws-us-gov与当前 Region更稳健的写法是借助aws_partition与aws_region数据源动态拼接 ARN。仓库的验收测试 image_data_source_test.go 正是采用这种写法data aws_partition current {} data aws_region current {} data aws_imagebuilder_image test { arn arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.region}:aws:image/amazon-linux-2-x86/x.x.x }获取到数据源后可通过data.aws_imagebuilder_image.example.build_version_arn等属性将其 ARN 或元数据传递给aws_imagebuilder_image_recipe、aws_imagebuilder_image_pipeline等资源例如将公共镜像 ARN 作为自建配方的parent_imageresource aws_imagebuilder_image_recipe example { name my-linux-recipe parent_image data.aws_imagebuilder_image.example.arn version 1.0.0 component { component_arn arn:aws:imagebuilder:us-west-2:aws:component/amazon-linux-2-update/x.x.x } }Argument Reference参数详解该数据源支持以下参数其中arn为必需项region为可选项参数必需性说明arnRequired镜像的 ARN。后缀既可以使用通配符x.x.x获取最新构建版本也可以使用完整构建版本如2020.11.26/1获取精确版本regionOptional镜像所在 Region默认取 provider 配置中设置的 Regionarn通配符与精确版本arn是唯一必需的参数其在 schema 中被声明为Required的字符串类型并通过verify.ValidARN做 ARN 格式校验见 image_data_source.go。其取值有两种形式通配符形式如arn:aws:imagebuilder:us-west-2:aws:image/amazon-linux-2-x86/x.x.xx.x.x匹配任意语义版本数据源会返回该镜像的最新构建版本精确形式如arn:aws:imagebuilder:us-west-2:123456789012:image/my-image/2020.11.26/1包含完整语义版本与构建序号数据源返回该特定构建。需要注意的是配置中的arn与返回的build_version_arn并不一定相同。底层 APIGetImage总是返回带完整#.#.#/#后缀的构建版本 ARN因此通配符输入会被解析为精确输出。仓库源码对此有专门处理image_data_source.go数据源将build_version_arn设置为 API 返回的完整 ARN同时保留用户配置的通配符arn不回写避免 Terraform 在 refresh 时因配置与状态不一致而产生计划差异注释原文The configured ARN may contain x.x.x wildcards while the API returns the full build version#.#.#/#suffix。region跨区域查询region参数允许数据源查询非 provider 默认 Region 中的镜像。从源码结构看该属性由 Provider 的增强 Region 支持机制自动注入aws_imagebuilder_image资源与数据源共享相同的 Region 注入逻辑相关验证可参见 image_identity_gen_test.go 中对region属性的断言。当省略时默认使用 provider 配置中的 Region。Attribute Reference导出的属性数据源除参数外还会导出以下属性全部为只读Computed。以下按类别组织并标注了源码中的 schema 声明位置image_data_source.go身份与版本属性类型说明build_version_arnstring镜像的构建版本 ARN始终带#.#.#/#后缀。例如arn:aws:imagebuilder:us-west-2:aws:image/amazon-linux-2-x86/2.0.20201120.0/1namestring镜像的名称versionstring镜像版本格式为#.#.#/#语义版本 构建序号如2.0.20201120.0/1platformstring镜像的平台取值为Linux或Windowsos_versionstring镜像的操作系统版本如Amazon Linux 2date_createdstring镜像创建时间RFC3339 格式仓库测试通过acctest.CheckResourceAttrRFC3339验证见 image_data_source_test.go配方与配置关联 ARN属性类型说明image_recipe_arnstring构建该镜像所用的镜像配方Image RecipeARNAMR 镜像场景container_recipe_arnstring构建该镜像所用的容器配方Container RecipeARN容器镜像场景distribution_configuration_arnstring关联的 Image Builder 分发配置Distribution ConfigurationARNinfrastructure_configuration_arnstring关联的基础设施配置Infrastructure ConfigurationARN由于image_recipe_arn与container_recipe_arn互斥资源的 schema 中通过ExactlyOneOf保证见 image.go数据源返回的属性中只会出现其中一个另一个在测试中被断言为不存在TestCheckNoResourceAttr见 image_data_source_test.go。扫描与测试配置enhanced_image_metadata_enabledbool— 是否收集所创建镜像的额外信息增强镜像元数据。image_scanning_configurationlist最多 1 个对象— 镜像扫描配置包含image_scanning_enabledbool— 创建新镜像时Image Builder 是否保留 Amazon Inspector 对构建实例运行漏洞扫描的快照ecr_configurationlist最多 1 个对象— ECR 扫描配置repository_namestring— Amazon Inspector 扫描容器镜像以识别发现项的容器仓库名称container_tagsset of string— Image Builder 应用到待扫描输出容器镜像上的一组标签。image_tests_configurationlist最多 1 个对象— 镜像测试配置包含image_tests_enabledbool— 是否启用镜像测试timeout_minutesint— 镜像测试超时前等待的分钟数。输出资源 output_resourcesoutput_resourceslist最多 1 个对象— 镜像构建产生的资源列表包含两类amisset of 对象— 构建产出的每个 AMIaccount_idstring— AMI 所属账户标识descriptionstring— AMI 的描述imagestring— AMI 的标识符AMI IDnamestring— AMI 的名称regionstring— AMI 所在 Regioncontainersset of 对象— 构建产出并存储到输出仓库的每个容器镜像image_urisset of string— 创建出的容器镜像 URI 集合regionstring— 容器镜像所在 Region。标签tagsmap of string— 镜像的资源标签。在源码中通过tftags.TagsSchemaComputed()声明image_data_source.go并在读取末尾通过setTagsOut(ctx, image.Tags)写入状态第 L243 行。完整属性示例以下 HCL 展示了对典型自建 Linux 镜像的属性引用方式data aws_imagebuilder_image example { arn arn:aws:imagebuilder:us-west-2:123456789012:image/my-linux-image/x.x.x } output build_version { value data.aws_imagebuilder_image.example.build_version_arn } output ami_ids { value data.aws_imagebuilder_image.example.output_resources[0].amis[*].image } output image_recipe { value data.aws_imagebuilder_image.example.image_recipe_arn }源码实现原理一次读取的背后理解数据源的读取链路有助于诊断查询问题。核心流程如下入口dataSourceImageReadimage_data_source.go从状态中取出arn通过meta.(*conns.AWSClient).ImageBuilderClient(ctx)获取 Image Builder 客户端查找调用findImageByARNimage.go它构造imagebuilder.GetImageInput{ImageBuildVersionArn: arn}并调用 AWS SDK v2 的GetImageAPI若返回ResourceNotFoundException则包装为retry.NotFoundError若响应为空或Image.State为空则返回tfresource.NewEmptyResultError()设置 IDd.SetId(aws.ToString(image.Arn))数据源的 ID 即镜像构建版本 ARN属性映射依次通过flattenImageScanningConfiguration、flattenImageTestsConfiguration、flattenOutputResources等辅助函数将 API 结构体转换为 Terraform 的 list/set 结构具体实现位于 image.go 与 image_pipeline.go标签通过setTagsOut输出标签。值得关注的是findImageByARN同时被同名资源aws_imagebuilder_image的 Create/Read 流程复用image.go并在创建时通过waitImageStatusAvailable轮询镜像状态直至Available其间会经过Pending、Building、Testing、Distributing、Integrating等中间状态image.go。这意味着通过资源刚创建的镜像状态可能尚未最终定型而数据源读取到的则始终是稳定可用的构建产物——这也是在自动化流水线中优先使用数据源而非资源引用的原因之一。实战场景场景一查询 AWS 官方公共镜像使用通配符 ARN 即可获得当前 Region 中 Amazon Linux 2 最新公共镜像的构建版本无需维护版本号data aws_imagebuilder_image amazon_linux_2 { arn arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.region}:aws:image/amazon-linux-2-x86/x.x.x }仓库测试TestAccImageBuilderImageDataSource_ARN_aws正是此场景的验证image_data_source_test.go它断言name为Amazon Linux 2 x86、os_version为Amazon Linux 2、platform为Linux且build_version_arn匹配image/amazon-linux-2-x86/\d\.\d\.\d/\d模式。场景二查询自建镜像与资源联动若镜像由本配置中的aws_imagebuilder_image资源创建可直接用资源 ARN 作为数据源输入验证或消费其完整元数据resource aws_imagebuilder_image test { image_recipe_arn aws_imagebuilder_image_recipe.test.arn infrastructure_configuration_arn aws_imagebuilder_infrastructure_configuration.test.arn } data aws_imagebuilder_image test { arn aws_imagebuilder_image.test.arn }仓库测试TestAccImageBuilderImageDataSource_ARN_selfimage_data_source_test.go对资源与数据源的build_version_arn、date_created、distribution_configuration_arn、enhanced_image_metadata_enabled、image_recipe_arn、image_tests_configuration.#、output_resources.#等属性逐一做了配对断言确保数据源导出与资源状态完全一致。场景三查询容器镜像及扫描配置对于基于容器配方构建的镜像数据源会返回container_recipe_arn以及output_resources.0.containers中的image_uris同时携带扫描配置信息resource aws_imagebuilder_image test { container_recipe_arn aws_imagebuilder_container_recipe.test.arn infrastructure_configuration_arn aws_imagebuilder_infrastructure_configuration.test.arn image_scanning_configuration { image_scanning_enabled true ecr_configuration { repository_name aws_ecr_repository.test.name container_tags [foo, bar] } } } data aws_imagebuilder_image test { arn aws_imagebuilder_image.test.arn } output container_uris { value data.aws_imagebuilder_image.test.output_resources[0].containers[*].image_uris }对应验收测试见 image_data_source_test.go其显式验证了container_recipe_arn、output_resources.0.containers.0.image_uris.#与region在资源与数据源间的一致性。测试与验证仓库为aws_imagebuilder_image数据源提供了完整的验收测试位于 image_data_source_test.go覆盖三种典型场景公共 AWS 镜像TestAccImageBuilderImageDataSource_ARN_aws验证通配符 ARN 解析最新版本以及name、os_version、platform、version、date_createdRFC3339、output_resources.#等关键字段自建镜像TestAccImageBuilderImageDataSource_ARN_self通过TestCheckResourceAttrPair断言数据源与aws_imagebuilder_image资源各属性一一对应容器镜像TestAccImageBuilderImageDataSource_ARN_containerRecipe验证容器配方关联与output_resources.0.containers输出。若需在本地运行这些测试可参考仓库 docs/running-and-writing-acceptance-tests.md 配置 AWS 凭据后使用如下命令示例仅验证数据源测试make testacc TESTSTestAccImageBuilderImageDataSource_ARN_aws PKGimagebuilder小结aws_imagebuilder_image数据源为 Terraform 配置提供了一条只读、幂等地读取 EC2 Image Builder 镜像元数据的途径通过arn参数配合x.x.x通配符即可始终指向最新构建版本通过build_version_arn、image_recipe_arn、container_recipe_arn、output_resources、image_scanning_configuration等属性则可获得构建产物与配置细节的完整视图。其底层实现与aws_imagebuilder_image资源共用findImageByARN查询与扁平化辅助函数保证了数据源导出与资源状态的一致性。在编写依赖镜像 ARN 的配方、流水线或分发配置时优先使用该数据源是兼顾稳定性与可维护性的推荐做法。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →