Terraform AWS Provider 数据源 aws_datapipeline_pipeline 完全指南:读取 AWS Data Pipeline 管道信息
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
导读
aws_datapipeline_pipeline是 Terraform AWS Provider 提供的 Data Pipeline 服务数据源,用于按 Pipeline ID 查询指定 AWS Data Pipeline 管道的名称、描述与标签信息。在 terraform-provider-aws 项目中,它配合 aws_datapipeline_pipeline 资源 使用,可帮助你在配置中引用现有管道元数据,或在管道资源与下游资源之间建立依赖关系。读完本文,你将掌握该数据源的参数、导出属性、底层实现原理与标签行为,并能写出可直接落地的 Terraform 配置。
数据源概览:它解决什么问题
AWS Data Pipeline 是 AWS 的托管式数据工作流编排服务。在基础设施即代码(IaC)实践中,你通常有两类需求:
- 管理管道:创建、更新、删除管道,对应资源
aws_datapipeline_pipeline; - 读取管道:按 ID 获取管道现状,以便在配置中引用
name、description、tags等只读信息,对应本文的数据源aws_datapipeline_pipeline。
数据源的核心价值在于:只需一个pipeline_id参数,Terraform 即可在plan/apply阶段调用 AWS Data Pipeline API 读取管道元数据,无需把名称、描述、标签硬编码在配置里。官方文档对它的定位是 "Provides details about a specific DataPipeline Pipeline",即提供特定管道管道的详细信息。
参数详解(Argument Reference)
数据源的 Schema 定义在 internal/service/datapipeline/pipeline_data_source.go 中,其中pipeline_id是唯一必填参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
pipeline_id | string | 必填 | 目标管道的 ID。AWS Data Pipeline 的管道 ID 形如df-1234567890,可通过aws_datapipeline_pipeline资源的id属性或控制台获取 |
region | string | 可选 | 数据源生效的 AWS 区域。省略时默认使用 Provider 配置中的区域(即provider "aws"的region参数) |
最小可用配置
官方文档给出的最小示例为:
data "aws_datapipeline_pipeline" "example" { pipeline_id = "pipelineID" }将pipelineID替换为真实的管道 ID 即可查询。
更贴近实战的配置:资源与数据源联动
真实项目中,管道通常由 Terraform 管理,数据源直接引用资源的id,从而保证pipeline_id永远与资源状态同步,无需硬编码:
resource "aws_datapipeline_pipeline" "test" { name = "tf-pipeline-default" } data "aws_datapipeline_pipeline" "test" { pipeline_id = aws_datapipeline_pipeline.test.id } # 在输出中引用数据源导出的属性 output "pipeline_name" { value = data.aws_datapipeline_pipeline.test.name }这种写法的标准用法同样出现在项目的测试模板 internal/service/datapipeline/testdata/tmpl/pipeline_data_source.gtpl 与生成型测试配置 internal/service/datapipeline/testdata/Pipeline/data.tags/main_gen.tf 中,后者把pipeline_id = aws_datapipeline_pipeline.test.id与带tags的资源放在一起验证,可见"资源创建 + 数据源读取"是官方认可的惯用法。
属性引用(Attribute Reference)
数据源在返回时,除入参pipeline_id、region外,还会导出以下只读属性:
| 属性 | 类型 | 说明 |
|---|---|---|
name | string | 管道的名称 |
description | string | 管道的描述信息 |
tags | map(string) | 分配给该管道的标签键值对集合 |
id在数据源上下文中即为pipeline_id。从 pipeline_data_source.go 的读取逻辑可以看到,数据源将 API 返回结果逐一写入状态:
d.SetId(pipelineId) d.Set(names.AttrName, v.Name) d.Set(names.AttrDescription, v.Description) setTagsOut(ctx, v.Tags)也就是说,id、name、description、tags四个值都来自 AWSDescribePipelines接口的实时响应,而非配置声明。
底层实现原理:数据源是如何读数的
数据源的完整读取链路如下,全部代码位于 internal/service/datapipeline/pipeline_data_source.go:
- 获取客户端:
meta.(*conns.AWSClient).DataPipelineClient(ctx)从 Provider 连接池中取出 Data Pipeline 的 AWS SDK v2 客户端; - 组装输入:取出
pipeline_id,构造datapipeline.DescribePipelinesInput{PipelineIds: []string{pipelineId}}; - 调用查找函数:调用包内共用的
findPipeline(ctx, conn, pipelineId),该函数定义在 pipeline.go,实现逻辑为调用DescribePipelines,然后在返回的PipelineDescriptionList中按PipelineId匹配目标管道并返回*awstypes.PipelineDescription; - 错误处理:若查询失败,通过
sdkdiag.AppendErrorf返回格式为describing DataPipeline Pipeline (%s): ...的诊断错误,terraform plan/apply会直接报错中止; - 写回状态:将
id、name、description写入 State,标签则通过setTagsOut写入读取上下文。
值得注意的是,findPipeline是资源与数据源共用的查找函数:资源aws_datapipeline_pipeline的 Read(见 pipeline.go)也复用它,并且会额外判断PipelineNotFoundException与PipelineDeletedException,在管道被删除时自动把id置空并从 State 移除。数据源版本则不做删除兜底,因为数据源的语义是"必须存在,否则报错"。
区域(region)参数的来源
region参数属于 AWS Provider 的通用约定:数据源声明了region(可选)字段,但实际网络请求使用的是 Provider 级联解析出的区域。这一点在官方文档中表述为 "Defaults to the Region set in the provider configuration",即不传region时跟随provider "aws"的区域配置。
标签行为:tags 与 default_tags / ignore_tags 的交互
数据源 Schema 中标签字段tags使用tftags.TagsSchemaComputed()(只读、由 API 计算得出)。这意味着数据源不会修改管道标签,只负责如实反映 AWS 侧现状。
标签读取的底层实现在 internal/service/datapipeline/tags.go 中:ListTags根据资源类型Pipeline调用listPipelineTags,后者复用findPipeline获取PipelineDescription并从中提取Tags。整个 Data Pipeline 服务包的标签代码由 generate.go 中的go:generate指令自动生成,涵盖AddTags/RemoveTags/UpdateTags等操作,但数据源侧只读。
从数据源的标签测试 internal/service/datapipeline/pipeline_data_source_tags_gen_test.go 可以归纳出三条关键行为:
- 普通标签:资源上设置的
tags会原样出现在数据源的tags属性中(MapExact精确匹配); - Provider 默认标签:当
provider配置了default_tags时,数据源的tags会同时包含Provider 级默认标签与资源级标签(见TestAccDataPipelinePipelineDataSource_Tags_DefaultTags_nonOverlapping); - ignore_tags:Provider 配置了
ignore_tags时,被忽略的键不会出现在数据源tags中,但通过expectFullPipelineDataSourceTags检查可以看到这些标签在 AWS 侧仍真实存在,只是 Terraform 不管理。
另外,TestAccDataPipelinePipelineDataSource_Tags_nullMap与..._Tags_emptyMap两个用例确认:无标签或显式null时,tags为空的 Map,而不是null。
质量保障:验收测试如何验证数据源
项目对该数据源配备了完整的接收测试(acceptance tests),主要位于 internal/service/datapipeline/pipeline_data_source_test.go:
TestAccDataPipelinePipelineDataSource_basic:创建aws_datapipeline_pipeline.test资源,再以pipeline_id = aws_datapipeline_pipeline.test.id引用数据源,用TestCheckResourceAttrPair断言数据源的pipeline_id、name、description与资源一一对应,并用ExpectKnownValue验证tags为空 Map;- 测试模板配置
testAccPipelineDataSourceConfig_basic正是前文"资源 + 数据源"组合示例的来源; - 标签相关的 5 个测试用例(pipeline_data_source_tags_gen_test.go)覆盖普通标签、null、空 Map、default_tags 非重叠、ignore_tags 重叠等场景。
运行这些测试需要真实的 AWS 凭证,命令形如:
make testacc TESTS=TestAccDataPipelinePipelineDataSource_basic PKG=datapipeline具体测试框架与前置条件可参考仓库文档 docs/running-and-writing-acceptance-tests.md。
使用注意事项
pipeline_id必须真实存在:数据源在Read阶段调用DescribePipelines,如果管道 ID 不存在或已被删除,Terraform 会报错并阻止执行;这与资源在管道缺失时"静默移除 State"的行为不同;- ID 格式:AWS Data Pipeline 的管道 ID 以
df-开头(如df-1234567890),引用资源id是最稳妥的方式,避免手抄出错; - 标签只读:数据源不提供写标签的能力,修改标签请使用
aws_datapipeline_pipeline资源的tags参数;Provider 的default_tags与ignore_tags会直接影响数据源tags的输出内容; - 配套资源:如需同时管理管道的 Pipeline Definition(管道定义),可查阅 pipeline_definition_data_source.go 及对应的
aws_datapipeline_pipeline_definition资源文档(website/docs/r/datapipeline_pipeline_definition.html.markdown); - 区域覆盖:跨区域场景下显式传入
region可覆盖 Provider 默认区域,但需保证该区域内有对应管道。
小结
aws_datapipeline_pipeline数据源是一个参数极简、语义清晰的查询型数据源:必填pipeline_id,可选region,导出name、description、tags。其实现复用资源层findPipeline查找函数并直接透传 AWSDescribePipelines响应,标签读取则复用服务包级ListTags机制,与 Provider 的default_tags/ignore_tags体系无缝衔接。无论是查询现存管道、还是在配置中引用管道元数据,它都是 Data Pipeline 场景下值得优先使用的读取入口。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考