news 2026/9/17 11:12:48

Terraform AWS Provider 中 aws_appconfig_configuration_profiles 数据源详解:批量获取 AppConfig 配置配置文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Terraform AWS Provider 中 aws_appconfig_configuration_profiles 数据源详解:批量获取 AppConfig 配置配置文件

Terraform AWS Provider 中 aws_appconfig_configuration_profiles 数据源详解:批量获取 AppConfig 配置配置文件

【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws

本文围绕 Terraform AWS Provider 提供的aws_appconfig_configuration_profiles数据源展开。该数据源用于按application_id列出指定 AWS AppConfig 应用下的所有 Configuration Profile ID,是解决"配置配置文件 ID 由控制台或其他流程生成、无法预知"这一常见痛点的关键工具。读完本文,你将掌握该数据源的完整参数与导出属性、与aws_appconfig_configuration_profile单数数据源配合使用的for_each模式,以及其在 Provider 源码中基于分页迭代器的实现原理。

一、数据源定位:从应用 ID 到配置配置文件 ID 集合

AWS AppConfig 中,Application 与其下的 Configuration Profile 是一对多的层级关系:一个应用可以挂载多个配置配置文件,每个配置文件对应一份location_uri指定的配置内容。当这些配置文件的 ID 不是由 Terraform 管理(例如由其他团队、CI 流程或手动在控制台创建)时,Terraform 配置中就需要一种"先列出、再引用"的能力。

aws_appconfig_configuration_profiles数据源正是为此设计:给定一个 AppConfig Application 的 ID,它调用 AWS API 列出该应用下的全部 Configuration Profile,并把它们的 ID 汇总为一组集合导出,供其他资源或数据源引用。典型场景包括:

  • 将列出的配置文件 ID 通过for_each批量展开为aws_appconfig_configuration_profile数据源,逐条读取完整属性;
  • aws_appconfig_deployment等资源中动态引用某个配置文件,避免硬编码 ID;
  • 在 Terraform 输出(output)中暴露应用下的配置文件清单,供下游模块消费。

二、完整用法示例:数据源链式引用

官方文档给出的基础用法展示了"列表数据源 + 单数数据源"的组合模式:

data "aws_appconfig_configuration_profiles" "example" { application_id = "a1d3rpe" } data "aws_appconfig_configuration_profile" "example" { for_each = data.aws_appconfig_configuration_profiles.example.configuration_profile_ids configuration_profile_id = each.value application_id = aws_appconfig_application.example.id }

这段配置的工作流程是:

  1. data.aws_appconfig_configuration_profiles.example先执行,向 AppConfig 发起列表查询,拿到configuration_profile_ids集合;
  2. data.aws_appconfig_configuration_profile.example以该集合作为for_each键值,为每个配置文件 ID 创建一个数据源实例;
  3. 单数数据源实例逐个拉取对应配置文件的完整属性(描述、location_uritypekms_key_identifier、校验器等)。

需要注意的实操细节:

  • 文档示例中的application_id使用了静态 ID 字符串(如"a1d3rpe"),实际使用时通常引用资源属性,如aws_appconfig_application.example.id,保证 ID 与 Terraform 管理状态一致;
  • 若配置文件本身也是由 Terraform 资源创建的,务必通过depends_on建立显式依赖,确保数据源在资源创建之后再读取。仓库中的验收测试正是这样做的,见 数据源测试文件:
data "aws_appconfig_configuration_profiles" "test" { application_id = aws_appconfig_application.test.id depends_on = [aws_appconfig_configuration_profile.test_1, aws_appconfig_configuration_profile.test_2] }

三、Argument Reference:输入参数

该数据源支持以下输入参数:

参数必填说明
application_idAppConfig Application 的 ID
region操作所在 Region,默认继承 Provider 配置中的 Region 设置

从源码定义可以看到,application_id被声明为Required的字符串字段,而configuration_profile_ids是一个Computed的字符串集合(TypeSet),即它只能由 Provider 计算填充、用户不可写入,见 数据源 schema 定义:

names.AttrApplicationID: { Type: schema.TypeString, Required: true, }, "configuration_profile_ids": { Type: schema.TypeSet, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, },

使用TypeSet而非TypeList意味着返回结果是无序集合,在 Terraform 配置中应以for_each(而非count+ 索引)的方式消费,这正是官方示例采用for_each的原因。

四、Attribute Reference:导出属性

除上述输入参数外,数据源导出以下属性:

属性说明
configuration_profile_ids与该 AppConfig Application 关联的所有 Configuration Profile ID 集合

这是该数据源唯一的导出属性,也是它与下游配置衔接的唯一数据通道。

配合单数数据源可获得哪些完整属性?

仅拿到 ID 集合往往不够,通常还需描述、存储位置、校验器等详情。此时链式引用的aws_appconfig_configuration_profile单数数据源会导出以下属性(参见 单数数据源文档):

  • arn- 配置文件的 ARN;
  • description- 描述;
  • id- 配置文件 ID 与 Application ID 以冒号(:)分隔组合而成的复合 ID;
  • kms_key_identifier- 用于加密配置数据的 KMS 密钥标识符;
  • location_uri- 配置文件内容的位置 URI;
  • name- 配置文件名称;
  • retrieval_role_arn- 访问location_uri所指内容所需的 IAM 角色 ARN;
  • tags- 资源标签映射;
  • type- 配置文件类型(如AWS.FreeformAWS.AppConfig.FeatureFlags,类型常量定义见 资源源码);
  • validator- 校验方法嵌套集合,含content(JSON Schema 内容或 Lambda 函数 ARN)与typeJSON_SCHEMALAMBDA)两个字段。

这些属性的读取逻辑在 单数数据源读取函数 中逐一落盘到 state,且两个必填输入(application_idconfiguration_profile_id)都通过了[a-z\d]{4,7}的正则校验,可以在terraform validate阶段提前拦截非法 ID 格式。

五、源码级实现:分页拉取与错误处理

数据源的读取入口是dataSourceConfigurationProfilesRead,其核心步骤为(见 实现源码):

  1. 从 meta 中取得 AppConfig 客户端:meta.(*conns.AWSClient).AppConfigClient(ctx)
  2. 构造ListConfigurationProfilesInput并委托给findConfigurationProfileSummaries完成实际查询;
  3. application_id作为数据源自身的 state ID;
  4. tfslices.ApplyToAll把 API 返回的ConfigurationProfileSummary对象切片映射为纯字符串切片,写入configuration_profile_ids

真正的 API 调用封装在findConfigurationProfileSummaries(见 分页实现),其中有两个值得注意的工程细节:

  • 完整分页:通过 SDK v2 的appconfig.NewListConfigurationProfilesPaginator创建分页迭代器,循环pages.HasMorePages()直到取尽所有页,因此无论应用下有多少个配置文件都不会遗漏——列表结果的正确性不依赖单次 API 调用的页大小;
  • 资源缺失的语义化处理:当 API 返回ResourceNotFoundException(例如application_id不存在)时,将其转换为retry.NotFoundError,而非直接向用户抛出原始 SDK 错误。这让上层能统一按"资源未找到"的语义处理,也解释了为什么引用一个不存在的 Application ID 会报 NotFound 类错误。

测试如何验证行为

验收测试TestAccAppConfigConfigurationProfilesDataSource_basic在该应用下创建了两个hosted类型的配置文件,然后断言数据源的configuration_profile_ids集合恰好包含 2 个元素,且每个元素分别与两个资源的configuration_profile_id属性成对匹配(见 测试断言)。这验证了两个关键行为:集合大小准确(无重复、无遗漏),以及集合元素确实来自 List API 的真实返回值。

六、实际使用建议与限制

结合上述实现,给出几条可落地的使用建议:

  • 始终与for_each搭配消费configuration_profile_ids是集合类型,顺序不保证,用for_each展开为单数数据源实例是最稳妥的模式;
  • 显式声明依赖:当配置文件由同一栈中的资源创建时,为列表数据源添加depends_on,避免读到尚未创建完成的空列表(仓库测试中的做法即如此);
  • 理解 Region 语义region参数覆盖 Provider 级 Region 配置,跨 Region 引用同一应用 ID 时需注意 AppConfig 应用是 Region 级资源,不同 Region 的 ID 空间相互独立;
  • 结果可能为空:若应用下没有任何配置文件,configuration_profile_ids为空集合,for_each展开后不会产生任何实例,下游引用这些实例属性的配置会报引用错误,建议在count/for_each之外配合条件判断或输出检查;
  • 该数据源只读且轻量:它只返回 ID 集合,不含名称、类型等详情。需要完整属性时请链式使用单数数据源,或将 ID 交给aws_appconfig_deployment等资源使用——后者同样以configuration_profile_id作为必填参数(见 deployment 资源)。

参考文件索引

  • 数据源文档:aws_appconfig_configuration_profiles
  • 数据源实现:configuration_profiles_data_source.go
  • 数据源验收测试:configuration_profiles_data_source_test.go
  • 单数数据源实现:configuration_profile_data_source.go
  • 配置文件资源(含 type 常量):configuration_profile.go
  • AppConfig 服务包说明:README

【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 11:11:42

嵌入式Linux WiFi设备驱动开发:从架构到调试实战

做嵌入式 Linux 开发这些年,我在不同板子上折腾过的 WiFi 模组一只手数不过来:USB 接口的、SDIO 接口的、PCIe 接口的,甚至有那种焊在板子上的从模组到天线全得自己调的方案。接触 Linux WiFi 设备驱动开发的次数越多,越发现一个规…

作者头像 李华
网站建设 2026/9/17 11:10:45

移动硬盘拷贝小文件慢?从随机访问原理到FastCopy提速实战

我用移动硬盘拷过几次照片目录,那速度真的能把人急到怀疑人生。明明单个大文件能跑到 100MB/s 以上的盘,一旦换成几千张几 MB 的图片、几万个碎代码文件,速度直接掉到几 MB/s 甚至几百 KB/s,进度条跟卡死了一样。这不是盘坏了&…

作者头像 李华
网站建设 2026/9/17 11:09:16

薄壁筒车削颤振建模与稳定性分析:从固有频率到有限元验证

简介:一套围绕薄壁筒零件切削系统动力学建模与稳定性分析的论文复现资料,面向机械工程专业学生、科研人员及精密制造工程师,旨在解决车削薄壁筒易发生颤振、影响加工质量的问题。内容基于Donnell薄壳理论建立转动薄壁筒的非线性动力学模型&am…

作者头像 李华
网站建设 2026/9/17 11:04:15

MySQL分库分表实战:分片方案、中间件选型与数据迁移全记录

上个月的一天下午,我正开着会,运维群里突然炸了锅——订单库的CPU使用率直接冲到98%,慢查询日志每分钟刷出几十条,连接数眼看就要被打满。第一反应是又有人写了烂SQL,可查了一圈发现,一堆走了索引的查询也慢…

作者头像 李华
网站建设 2026/9/17 11:04:10

O2O实时CRM架构:从客户管理到决策中枢的演进

简介:本资源是一份面向互联网中台架构师、O2O业务系统设计者及CRM平台开发者的技术文档,深入解析美团如何通过CRM系统构建核心线下能力。文档系统阐述其公私海线索管理模型、45天期限机制、BD与运营协同分工、移动办公支持(MOMA客户端&#x…

作者头像 李华