十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

terraform-provider-aws 数据源详解:使用 aws_kinesis_stream_consumer 查询 Kinesis 增强型消费者

terraform-provider-aws 数据源详解:使用 aws_kinesis_stream_consumer 查询 Kinesis 增强型消费者 terraform-provider-aws 数据源详解使用 aws_kinesis_stream_consumer 查询 Kinesis 增强型消费者【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读aws_kinesis_stream_consumer是 Terraform AWS Provider 中用于查询 Kinesis Data Streams 增强型消费者Enhanced Fan-Out Consumer详细信息的只读数据源。当你的基础设施中已经存在或由aws_kinesis_stream_consumer资源托管流消费者并希望在配置中引用其 ARN、状态、创建时间等信息时这个数据源可以让你以声明式方式完成查找。读完本文你将掌握该数据源的完整参数与属性语义、与配套资源协同使用的方法以及其底层基于ListStreamConsumersAPI 的查询实现原理。数据源定位为已有流消费者提供只读查询能力Kinesis 增强型消费者Enhanced Fan-Out Consumer通过专属带宽通道接收数据是实现高并发、低延迟流处理的关键机制。与资源Resource不同数据源Data Source本身不创建、修改或删除任何云资源它的职责是读取现有消费者的元数据并将结果暴露给 Terraform 配置使用。在 terraform-provider-aws 的 Kinesis 服务包中该数据源与同名资源aws_kinesis_stream_consumer共同定义于 internal/service/kinesis 目录下其类型注册可在 service_package_gen.go 中看到Factory: dataSourceStreamConsumer, TypeName: aws_kinesis_stream_consumer,该数据源的核心实现位于 internal/service/kinesis/stream_consumer_data_source.go通过SDKDataSource注解声明采用 Terraform Plugin SDK v2 编写。示例用法按名称查找消费者原文档给出的最简用法是以namestream_arn作为查询条件data aws_kinesis_stream_consumer example { name example-consumer stream_arn aws_kinesis_stream.example.arn }在真实场景中stream_arn通常直接引用同配置中aws_kinesis_stream资源的arn属性。下面是一份完整的、可运行的组合配置同时演示了数据源与配套资源aws_kinesis_stream_consumer的协同关系# 1. 创建 Kinesis 数据流 resource aws_kinesis_stream example { name example-stream shard_count 1 } # 2. 在流上注册增强型消费者 resource aws_kinesis_stream_consumer example { name example-consumer stream_arn aws_kinesis_stream.example.arn tags { Environment production } } # 3. 通过数据源按名称查询该消费者 data aws_kinesis_stream_consumer example { name aws_kinesis_stream_consumer.example.name stream_arn aws_kinesis_stream.example.arn } # 4. 在其它资源中引用查询结果 output consumer_arn { value data.aws_kinesis_stream_consumer.example.arn } output consumer_status { value data.aws_kinesis_stream_consumer.example.status }提示数据源的id即为消费者的 ARN因此在上面的配置中data.aws_kinesis_stream_consumer.example.id与.arn等价。Argument Reference四个查询参数详解该数据源共支持以下参数对应源码 stream_consumer_data_source.go 中的 Schema 定义参数必填类型说明stream_arnRequiredString消费者所注册数据流的 ARN是查询的必选条件Schema 中通过verify.ValidARN校验其必须是合法 ARNnameOptionalString消费者名称。指定后仅返回名称匹配的消费者不指定则忽略该条件arnOptionalString消费者自身的 ARN同样经过verify.ValidARN校验指定后仅返回 ARN 匹配的消费者regionOptionalString资源所在区域默认使用 provider 配置中设置的区域name与arn均可选但需要特别注意stream_arn必须显式提供它是调用 AWSListStreamConsumersAPI 的基础name和arn可以同时省略——此时数据源返回该流下唯一一个消费者若存在多个则会报错见下文底层原理name和arn也可以同时指定两者会按AND 逻辑叠加过滤见源码中的过滤函数实现。region参数继承自 provider 的通用约定当使用多区域 provider 配置时可用它显式指定该数据源查询的端点区域默认跟随 provider 配置 中设定的区域。Attribute Reference五个导出属性除了上述参数外查询成功后数据源还会导出以下只读属性属性类型说明idString流消费者 ARN与arn相同arnString流消费者的 ARN形如arn:aws:kinesis:region:account:stream/stream/consumer/consumer:timestampcreation_timestampString消费者创建时间的近似时间戳格式为 RFC3339例如2026-09-18T02:50:58ZstatusString消费者当前状态可能取值包括CREATING、ACTIVE、DELETING等tagsMap消费者上的标签集合从源码看creation_timestamp的格式化发生在 stream_consumer_data_source.god.Set(creation_timestamp, aws.ToTime(consumer.ConsumerCreationTimestamp).Format(time.RFC3339))AWS 返回的是*time.Time类型provider 统一将其格式化为 RFC3339 字符串便于 Terraform 状态存储与比较。status直接取自 AWS SDK 的ConsumerStatus枚举其生命周期CREATING → ACTIVE → DELETING在资源侧的状态等待逻辑中有完整印证见 stream_consumer.go 中waitStreamConsumerCreated的Pending/Target配置。底层原理一次查询背后的完整调用链理解数据源的工作原理有助于排查查询不到或返回多个结果等问题。其读取函数dataSourceStreamConsumerRead见 stream_consumer_data_source.go执行以下步骤1. 构建分页查询输入数据源在客户端通过meta.(*conns.AWSClient).KinesisClient(ctx)获取 Kinesis SDK v2 客户端然后基于stream_arn构造ListStreamConsumersInput调用 AWS 的ListStreamConsumersAPIinput : kinesis.ListStreamConsumersInput{ StreamARN: aws.String(streamARN), }2. 分页拉取并过滤由于一个流可能注册多个消费者provider 使用kinesis.NewListStreamConsumersPaginator自动分页遍历所有页面并对每个消费者执行过滤谓词见 stream_consumer_data_source.go 中的findStreamConsumersfor pages.HasMorePages() { page, err : pages.NextPage(ctx) // ... for _, v : range page.Consumers { if filter(v) { output append(output, v) } } }过滤逻辑第 74-84 行按配置条件匹配if v, ok : d.GetOk(names.AttrName); ok v.(string) ! aws.ToString(c.ConsumerName) { return false // name 指定且不匹配 → 排除 } if v, ok : d.GetOk(names.AttrARN); ok v.(string) ! aws.ToString(c.ConsumerARN) { return false // arn 指定且不匹配 → 排除 }3. 唯一性断言与错误处理过滤完成后findStreamConsumer调用tfresource.AssertSingleValueResult对结果做唯一性断言若一个消费者都未匹配返回未找到错误若匹配到多个则返回存在多个匹配结果的歧义错误。错误最终通过tfresource.SingularDataSourceFindError包装为 Terraform 诊断信息提示形如Your query returned no results / more than one result. Please refine your search to be more specific.这正是数据源强制要求stream_arn且建议搭配name或arn精确定位的原因。4. 写入状态最后将ConsumerARN设为数据源的id并同步写入arn、creation_timestamp、name、status、stream_arn等属性第 90-95 行完成状态填充。最佳实践与使用建议优先用namestream_arn组合这是文档中的标准用法语义清晰、便于阅读在引用同配置内资源时直接使用aws_kinesis_stream_consumer.example.name与aws_kinesis_stream.example.arn可避免硬编码。用arn直接定位当你知道消费者 ARN例如从terraform import或其它系统获取时用arn查询最精确此时可不指定name。谨慎省略name/arn只传stream_arn时数据源要求该流下恰好只有一个消费者否则会因唯一性断言失败而报错。在多消费者场景下务必带上过滤条件。结合导入能力管理存量消费者对于已存在但未被 Terraform 管理的消费者可先用资源文档中的terraform import方式导入见 kinesis_stream_consumer 资源文档 的 Import 章节id为消费者 ARN再用数据源统一引用其元数据。测试用例对使用边界的印证数据源的三个接入测试stream_consumer_data_source_test.go分别覆盖了三种查询路径可作为使用参考TestAccKinesisStreamConsumerDataSource_basic仅指定stream_arn流上只有单个消费者验证arn、name、stream_arn、creation_timestamp、status、tags等属性均正确填充TestAccKinesisStreamConsumerDataSource_name以name定位消费者TestAccKinesisStreamConsumerDataSource_arn以arn定位消费者。测试中还体现了两个实践细节一是数据源可读取到资源侧写入的tags数据源 Schema 中通过tftags.TagsSchemaComputed()导出标签二是流消费者数量存在上限约束资源测试 stream_consumer_test.go 注释中提示单个流可注册的并发消费者数量受 AWS 配额限制因此按名称/ARN 精确查询、避免歧义尤为重要。小结aws_kinesis_stream_consumer数据源以极小的配置成本为 Terraform 配置提供了对 Kinesis 增强型消费者元数据的完整只读访问能力stream_arn必填name/arn按需精确过滤返回arn、id、status、creation_timestamp、tags等属性。其实现依托 AWS SDK v2 的ListStreamConsumers分页查询与唯一性断言机制确保了查询结果的确定性和可预期性。无论是与aws_kinesis_stream_consumer资源组合使用还是引用存量消费者它都是 Kinesis 流处理基础设施编排中不可或缺的查询工具。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表