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 }这段配置的工作流程是:
data.aws_appconfig_configuration_profiles.example先执行,向 AppConfig 发起列表查询,拿到configuration_profile_ids集合;data.aws_appconfig_configuration_profile.example以该集合作为for_each键值,为每个配置文件 ID 创建一个数据源实例;- 单数数据源实例逐个拉取对应配置文件的完整属性(描述、
location_uri、type、kms_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_id | 是 | AppConfig 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.Freeform、AWS.AppConfig.FeatureFlags,类型常量定义见 资源源码);validator- 校验方法嵌套集合,含content(JSON Schema 内容或 Lambda 函数 ARN)与type(JSON_SCHEMA或LAMBDA)两个字段。
这些属性的读取逻辑在 单数数据源读取函数 中逐一落盘到 state,且两个必填输入(application_id、configuration_profile_id)都通过了[a-z\d]{4,7}的正则校验,可以在terraform validate阶段提前拦截非法 ID 格式。
五、源码级实现:分页拉取与错误处理
数据源的读取入口是dataSourceConfigurationProfilesRead,其核心步骤为(见 实现源码):
- 从 meta 中取得 AppConfig 客户端:
meta.(*conns.AWSClient).AppConfigClient(ctx); - 构造
ListConfigurationProfilesInput并委托给findConfigurationProfileSummaries完成实际查询; - 以
application_id作为数据源自身的 state ID; - 用
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),仅供参考