Terraform AWS Provider:aws_appintegrations_event_integration 数据源详解——按名称读取 AppIntegrations 事件集成 Terraform AWS Provideraws_appintegrations_event_integration 数据源详解——按名称读取 AppIntegrations 事件集成【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本文介绍 terraform-provider-aws 中的aws_appintegrations_event_integration数据源它用于按名称读取一个已存在的 Amazon AppIntegrations Event Integration并导出其 ARN、描述、事件过滤器、EventBridge 事件总线以及标签等属性。读完本文后你将能够在自己的 Terraform 配置中正确引用该数据源理解每个参数的取值约束这些约束来自 Provider 源码中的校验正则并了解数据源读取时的底层 API 调用链与标签处理机制。一、背景AppIntegrations Event Integration 是什么Amazon AppIntegrations 的 Event Integration 用于把合作伙伴Partner发布的事件例如第三方 SaaS 系统产生的业务事件通过指定的 EventBridge 事件总线接入 AWS 事件体系。在 terraform-provider-aws 中这一对象同时提供了资源 aws_appintegrations_event_integration用于创建、更新、删除和数据源 aws_appintegrations_event_integration用于查询已存在对象两种形式。数据源解决的典型场景是Event Integration 可能由其他团队、其他基础设施栈或 AWS 控制台预先创建而你的 Terraform 配置只希望读取它的信息例如把它的arn或eventbridge_bus传给下游资源做引用而不改变它的生命周期归属。二、示例用法官方文档给出的最小示例如下data aws_appintegrations_event_integration example { name example }在实际工程中更常见的做法是把数据源的name指向一个由本仓库或别的栈创建出来的资源实现同配置内的引用。Provider 的验收测试 event_integration_data_source_test.go 就使用了这种写法先创建一个aws_appintegrations_event_integration资源再让数据源按资源导出的name读取它resource aws_appintegrations_event_integration test { name example-name description example description eventbridge_bus default event_filter { source aws.partner/example.com } } data aws_appintegrations_event_integration test { name aws_appintegrations_event_integration.test.name }这里event_filter.source取值aws.partner/example.com并非随意示例源码中该字段的校验正则为^aws\.partner\/.*$见下文取值约束一节即以aws.partner/开头。测试代码中也提供了环境变量EVENT_BRIDGE_PARTNER_EVENT_SOURCE_NAME覆盖机制未设置时回退到aws.partner/example.comevent_integration_data_source_test.go说明这是该服务约定的合作伙伴事件源命名形式。三、Argument Reference参数说明数据源支持以下参数参数必填说明name是AppIntegrations Event Integration 的名称也是唯一查询键region否资源所在区域默认使用 Provider 配置中的 Region关于name的补充说明name是唯一且必填的查询键。数据源的 Read 实现直接把name作为 API 请求参数见下文源码分析因此不能通过 ARN 查询。名称命名规则可参考资源端约束。从同包资源 event_integration.go 的 Schema 定义看名称必须匹配^[0-9A-Za-z\/\._\-]{1,255}$即最多 255 个字符仅允许字母、数字、/、.、_、-。虽然数据源 Schema 本身未重复声明这一校验但你输入的名称必须符合 AWS 侧的命名规则否则 API 会返回错误。区域可用性该数据源依赖 AppIntegrations 服务在目标区域可用。从验收测试的前置检查 event_integration_data_source_test.go 可以看到测试会执行PreCheckPartitionHasService(t, names.AppIntegrationsEndpointID)即先确认当前 Partition/Region 提供 AppIntegrations 端点。在region未指定的情况下请使用你 Provider 配置中的区域。四、Attribute Reference属性说明数据源在上述参数之外导出以下属性属性说明arn该 Event Integration 的 ARNdescription事件集成的描述event_filter事件过滤器配置块结构见下eventbridge_bus接收事件的 EventBridge 事件总线名称id事件集成标识符即事件集成的名称与name相同tags资源上分配的用户标签元数据mapevent_filter块event_filter是一个列表块包含如下属性source- 事件来源字符串例如aws.partner/example.com。从源码的 Schema 定义event_integration_data_source.go看数据源的event_filter为TypeListComputed元素仅暴露source一个只读字符串字段。对应地API 返回的EventFilter结构被flattenEventFilter函数扁平化为仅含source的 mapevent_integration.go。五、源码级实现分析Read 调用链数据源的全部实现位于 event_integration_data_source.go核心只有 60 余行逻辑清晰注册与标记。函数dataSourceEventIntegration()通过SDKDataSource注解注册为aws_appintegrations_event_integration并带有Tags与Testing(tagsIdentifierAttributearn)标记event_integration_data_source.go。前者决定了该数据源支持标签读取后者表明标签相关验收测试以arn作为标识属性。仅注册 Read。资源结构体只实现了ReadWithoutTimeout: dataSourceEventIntegrationRead没有 Create/Update/Delete——这是 SDKv2 数据源的标准形态Terraform 会在刷新refresh阶段调用它。Schema 定义。六个字段与文档一一对应arn、description、eventbridge_bus为Computed字符串event_filter为Computed列表name为Required字符串tags使用tftags.TagsSchemaComputed()生成的只读 mapevent_integration_data_source.go。读取流程。dataSourceEventIntegrationRead的执行顺序是event_integration_data_source.go通过meta.(*conns.AWSClient).AppIntegrationsClient(ctx)获取 AppIntegrations 客户端该客户端会遵循 Provider 的region/端点覆盖设置以GetEventIntegrationInput{Name: aws.String(name)}调用conn.GetEventIntegration即只按名称查询任何 API 错误都会被包装为reading AppIntegrations Event Integration (%s): %s形式的诊断信息返回成功后d.SetId(aws.ToString(output.Name))——用名称作为id这与文档id即name的说法一致随后依次写入arn取自output.EventIntegrationArn、description、event_filter经flattenEventFilter扁平化、eventbridge_bus、name最后调用setTagsOut(ctx, output.Tags)写入标签。值得注意的是与资源端 Read 的差异资源端在ResourceNotFoundException时会静默地把资源从状态中移除event_integration.go而数据源没有这层外部删除容忍逻辑——如果按名称查不到对象数据源会直接报错。也就是说数据源假设对象存在适合读取已知对象而非探测是否存在。六、取值约束与资源端的联动数据源本身不做严格的输入校验仅要求name非空但读取的对象必须满足 AWS 侧与资源端声明过的约束。参考资源 event_integration.go 的 Schema 定义你可以把下表作为合法输入范围的权威依据字段约束源码校验name1–255 字符仅[0-9A-Za-z/._-]StringMatch(^[0-9A-Za-z\/\._\-]{1,255}$)eventbridge_bus1–255 字符仅[0-9A-Za-z/._-]同上正则event_filter.source必须以aws.partner/开头StringMatch(^aws\.partner\/.*$)description1–1000 字符StringLenBetween(1, 1000)event_filter最多 1 个块MaxItems: 1且ForceNewSchema 声明由于eventbridge_bus、event_filter、name在资源端均为ForceNew被数据源读取的这些属性一旦变化意味着对象被删除重建——引用arn的下游资源应意识到 ARN 可能随重建而失效。七、标签行为详解数据源的tags是只读 map且没有tags_all属性——这与资源端同时提供tags与tags_all不同。标签由setTagsOut(ctx, output.Tags)统一写入该函数会应用 Provider 级default_tags/ignore_tags的过滤逻辑。生成式标签测试 event_integration_data_source_tags_gen_test.go 覆盖了以下场景全部通过statecheck.ExpectKnownValue对数据源的tags值做精确断言普通标签tagsKey1Value1精确返回测试配置模板见 main_gen.tf其中数据源以name aws_appintegrations_event_integration.test.name引用同栈资源null / 空 map资源未设置标签时数据源tags为空 mapknownvalue.MapExact(map[string]knownvalue.Check{})default_tags 不重叠Provider 级default_tags与资源tags均出现在数据源结果中并合并ignore_tags 过滤Provider 配置的ignore_tags键会从数据源导出的tags中剔除但通过ExpectFullDataSourceTagsSpecTags辅助检查event_integration_data_source_tags_gen_test.go标识属性为arn确认远端对象实际仍带有全部标签。这组测试还要求 Terraform ≥ 1.1.0tfversion.SkipBelow(tfversion.Version1_1_0)复现时请注意版本前提。八、验收测试如何验证数据源正确性核心验收测试TestAccAppIntegrationsEventIntegrationDataSource_nameevent_integration_data_source_test.go采用先建资源、再读数据源的策略并用TestCheckResourceAttrPair逐项比对数据源与资源同名属性arn、description、name两者必须一致event_filter.#与event_filter.0.source过滤器块的数量和source值必须一致eventbridge_bus事件总线名称必须一致tags资源未配置标签时断言数据源tags为空 map。这一测试结构本身就是一个很好的实践模板当你需要为数据源属性与真实对象一致编写回归测试时AttrPair 比对 空 map 断言的组合能够同时覆盖值正确性与空值语义。九、使用注意事项小结查询键只能是name不支持 ARN 查询id输出等于name方便与资源id语义对齐。对象必须已存在数据源 Read 不吞掉ResourceNotFoundException查不到即报错不能用于存在性探测。区域与端点region参数遵循 Provider 通用区域规则目标区域必须提供 AppIntegrations 服务测试中的PreCheckPartitionHasService即对此的体现。标签只读且受 Provider 标签策略影响default_tags/ignore_tags会改变tags的可见内容但没有tags_all可用。命名与格式约束以资源端 Schema 校验为准name/eventbridge_bus的正则、source的aws.partner/前缀跨栈引用时建议先确认对象名称符合这些规则。相关文件索引便于延伸阅读数据源文档website/docs/d/appintegrations_event_integration.html.markdown数据源实现internal/service/appintegrations/event_integration_data_source.go数据源验收测试internal/service/appintegrations/event_integration_data_source_test.go数据源标签生成式测试internal/service/appintegrations/event_integration_data_source_tags_gen_test.go对应资源实现含全部取值校验internal/service/appintegrations/event_integration.go标签测试配置模板internal/service/appintegrations/testdata/EventIntegration/data.tags/main_gen.tf【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考