多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Terraform AWS Provider 数据源 aws_cloudwatch_event_buses 完全指南:查询 EventBridge 事件总线

Terraform AWS Provider 数据源 aws_cloudwatch_event_buses 完全指南:查询 EventBridge 事件总线 Terraform AWS Provider 数据源 aws_cloudwatch_event_buses 完全指南查询 EventBridge 事件总线【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本指南系统讲解 HashiCorp Terraform AWS Providerterraform-provider-aws中aws_cloudwatch_event_buses数据源的完整用法包括参数说明、属性结构、底层实现原理与测试验证方式。读完本文你将掌握如何按名称前缀筛选 AWS EventBridge 事件总线并把每个事件总线的 ARN、创建时间、权限策略等元数据安全地接入 Terraform 配置用于后续资源间引用与依赖编排。aws_cloudwatch_event_buses是 AWS Provider 提供的框架型Terraform Plugin Framework数据源用于一次性列出并读取 AWS EventBridge原 CloudWatch Events中全部或满足前缀条件的事件总线。与单数形态的资源数据源aws_cloudwatch_event_bus查询单个总线不同本数据源返回的是事件总线列表特别适合做批量枚举、全量盘点或在配置中以for_each展开驱动其他资源。一、基本用法示例官方文档给出的最小可用配置如下data aws_cloudwatch_event_buses example { name_prefix test }该配置会调用 EventBridge 的ListEventBusesAPI返回所有名称以test开头的自定义事件总线不包含 AWS 服务的default总线之外的托管总线集合结果存放在event_buses列表中。结合资源创建的完整示例参照仓库中的验收测试配置internal/service/events/buses_data_source_test.go实际使用中通常先创建事件总线资源再通过数据源引用resource aws_cloudwatch_event_bus test { name my-app-events } # 按名称前缀精确筛选刚刚创建的总线 data aws_cloudwatch_event_buses by_name_prefix { name_prefix aws_cloudwatch_event_bus.test.name } # 不指定前缀则返回当前区域全部事件总线 data aws_cloudwatch_event_buses all { depends_on [aws_cloudwatch_event_bus.test] }注意当不指定name_prefix时为保障数据源能读到刚由同配置创建的总线强一致性问题测试中显式声明了depends_on。在真实场景中若你的下游资源依赖数据源结果同样建议通过depends_on或让下游资源直接引用事件总线资源而非数据源来规避读取时序问题。将结果展开为映射以驱动其他资源event_buses是对象列表可配合for_each与toset将列表转换为以名称或 ARN为键的映射实现批量处理locals { buses_by_name { for bus in data.aws_cloudwatch_event_buses.example.event_buses : bus.name bus } } output bus_arns { value { for name, bus in local.buses_by_name : name bus.arn } }二、参数Argument Reference该数据源支持的入参如下参数类型是否必填说明regionstring可选数据源访问的 AWS 区域。默认使用 Provider 配置中设置的区域即沿用 Provider 的region或AWS_DEFAULT_REGION环境变量。可在多区域场景下显式覆盖例如在同一个配置中分别读取us-east-1与ap-northeast-1的事件总线。name_prefixstring可选名称前缀过滤条件。设置后仅返回名称以该前缀开头的自定义事件总线。不设置则返回当前区域内的全部自定义事件总线。关于region参数从源码结构看它来自框架内嵌的 internal/framework/with_region.go 中定义的WithRegionModel结构体是框架级公共能力该模型为数据源自动附加一个region属性使数据源实例可以独立于 Provider 默认区域运行这在多区域 Provider alias 之外提供了更灵活的按数据源粒度的区域控制。底层调用ListEventBuses 与 NamePrefix 映射name_prefix在实现上被直接透传为 AWS SDK for Go v2 的ListEventBusesInput.NamePrefix字段。参见 internal/service/events/buses_data_source.goconn : d.Meta().EventsClient(ctx) input : eventbridge.ListEventBusesInput{ NamePrefix: fwflex.StringFromFramework(ctx, data.NamePrefix), } output, err : findEventBuses(ctx, conn, input)fwflex.StringFromFramework负责将 Terraform Framework 的types.String转换为 SDK 的*string这是 Provider 内部统一的数据转换惯例。也就是说前缀过滤是在API 服务端完成的而不是在客户端拉取全部数据后再本地过滤因此数据量大时该数据源的查询效率有保障。三、导出属性Attribute Reference除上述入参外数据源还导出以下属性event_buses- 事件总线列表其中每个元素为一个对象详见下文。event_buses 对象属性列表内每个事件总线对象包含以下字段属性类型说明arnstring事件总线的 ARN形如arn:aws:events:region:account-id:event-bus/name。可用于构造 EventBridge 权限策略或作为目标资源的唯一标识。creation_timestringRFC3339 时间戳事件总线的创建时间。descriptionstring事件总线的描述信息自定义总线创建时可设置。last_modified_timestringRFC3339 时间戳事件总线最近一次被修改的时间。namestring事件总线的名称。policystring事件总线的权限策略JSON描述了哪些其他 AWS 账户可以向该事件总线写入事件。仅当总线配置了跨账户写入策略时该字段才有实际内容。属性与 SDK 响应类型的映射从实现模型 internal/service/events/buses_data_source.go 可以看到这些属性直接对应 EventBridgeListEventBusesAPI 响应中的EventBus结构体字段type eventBusModel struct { ARN types.String tfsdk:arn CreationTime timetypes.RFC3339 tfsdk:creation_time Description types.String tfsdk:description LastModifiedTime timetypes.RFC3339 tfsdk:last_modified_time Name types.String tfsdk:name Policy types.String tfsdk:policy }值得注意的两个实现细节时间字段类型creation_time与last_modified_time使用timetypes.RFC3339来自 terraform-plugin-framework-timetypes即导出为标准的 RFC3339 格式时间字符串便于与timestamp()、timeadd()等 Terraform 内置时间函数配合使用。反序列化方式API 响应通过fwflex.Flatten统一扁平化为模型结构再整体写入 Terraform 状态数据转换逻辑集中在 Provider 的internal/framework/flex包中保持了 Schema 定义与模型结构的高度一致性。四、分页与全量拉取原理由于一个账户下的事件总线数量可能很多ListEventBusesAPI 是分页返回的。数据源通过findEventBuses辅助函数配合自动生成的分页遍历函数listEventBusesPages实现全量聚合参见 internal/service/events/buses_data_source.go 与 internal/service/events/list_pages_gen.gofunc findEventBuses(ctx context.Context, conn *eventbridge.Client, input *eventbridge.ListEventBusesInput) ([]awstypes.EventBus, error) { var output []awstypes.EventBus err : listEventBusesPages(ctx, conn, input, func(page *eventbridge.ListEventBusesOutput, lastPage bool) bool { if page nil { return !lastPage } output append(output, page.EventBuses...) return !lastPage }) // ... }分页循环的终止条件是 SDK 返回的NextToken为空字符串每轮把当前页的EventBuses追加到结果切片直到取完所有页。这意味着数据源对调用方透明地完成了跨页聚合无论底层有多少页数据最终event_buses都包含满足条件的完整集合。listEventBusesPages由internal/generate/listpages代码生成器自动产出文件头注释可见DO NOT EDIT标记与ListRules、ListTargetsByRule等其余 EventBridge 分页遍历函数共用同一套生成模板。五、数据源声明与注册方式该数据源在仓库中通过框架注解声明internal/service/events/buses_data_source.go// FrameworkDataSource(aws_cloudwatch_event_buses, nameBuses) func newEventBusesDataSource(context.Context) (datasource.DataSourceWithConfigure, error) { return eventBusesDataSource{}, nil }注解由 Provider 内部的代码生成工具扫描自动把aws_cloudwatch_event_buses注册到 Provider Schema并纳入数据源文档的自动生成流程。数据源结构体内嵌framework.DataSourceWithModel[eventBusesDataSourceModel]这是 Provider 在 internal/framework 目录下封装的公共数据源基座提供了状态管理、诊断处理等通用能力。六、验收测试验证仓库为数据源编写了完整的验收测试TestAccEventsEventBusesDataSource_basicinternal/service/events/buses_data_source_test.go测试逻辑覆盖了本文介绍的两种用法前缀筛选先创建一个名为随机前缀的事件总线资源aws_cloudwatch_event_bus.test再用name_prefix aws_cloudwatch_event_bus.test.name的数据源去查断言event_buses.#恰好为1并逐一核对arn、name与资源实例一致且creation_time、last_modified_time已被设置。全量枚举不带任何参数的数据源配合depends_on保证时序断言event_buses.# 1验证不设置前缀时能正常返回当前区域的总线集合。测试同时验证了属性对resource.TestCheckResourceAttrPair的可用性——这从测试层面印证了数据源导出的arn、name、creation_time、last_modified_time等属性可以被 Terraform 其他表达式直接引用。七、使用建议与注意事项单数与复数数据源的区别需要精确查询单个已知总线时优先使用aws_cloudwatch_event_bus单数需要枚举、遍历、批量处理时使用本数据源。二者配合使用可以覆盖按名称查详情与按前缀批量盘点两类场景。读取时序数据源在同一terraform apply内读取的是执行时刻的真实 API 结果。若同一配置刚创建的总线需要被数据源读取务必用depends_on显式声明依赖否则可能读到空结果导致下游计算失败。区域意识EventBridge 事件总线是区域级资源数据源默认读取 Provider 配置的区域跨区域盘点时可通过多次声明数据源并各自设置region实现。policy字段的 JSON 特性policy以字符串形式导出如需做策略内容比对或条件判断可用jsondecode()将其解析为对象后访问具体字段。名称前缀的实际效果name_prefix是服务端过滤与 Terraform 中常见的startswith()客户端过滤不同在总线数量极大时也不会产生全量拉取开销。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表