Terraform AWS Provider 数据源 aws_rds_snapshots 完全指南:查询 RDS 快照列表的正确姿势
2026/9/19 4:40:35 网站建设 项目流程

Terraform AWS Provider 数据源 aws_rds_snapshots 完全指南:查询 RDS 快照列表的正确姿势

【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws

导读

aws_rds_snapshots是 Terraform AWS Provider 中用于批量查询 RDS 数据库快照信息的官方数据源。它可以在不手动创建aws_db_snapshot资源的前提下,一次性返回满足条件的全部快照列表,配合filterinclude_publicinclude_sharedsnapshot_type等参数可精确圈定查询范围,是编写灾难恢复、跨账号审计、按快照重建实例等 Terraform 配置时的基础组件。读完本文,你将掌握该数据源的完整参数体系、过滤策略、返回字段含义,以及它在 Provider 源码中的实际调用链路。

数据源概述

aws_rds_snapshots数据源(Data Source)对应 RDS 服务的DescribeDBSnapshotsAPI 调用,用于获取一个或多个 DB 快照的详细信息。与单快照数据源aws_db_snapshot不同,它返回的是一个快照列表,适合需要遍历全部快照(如自动化清理、容量汇总、按引擎版本筛选)的场景。

在 Provider 源码中,该数据源被注册为 Framework 类型的数据源:

  • 注册入口:internal/service/rds/service_package_gen.go#L50 中的TypeName: "aws_rds_snapshots"
  • 核心实现:internal/service/rds/snapshots_data_source.go,其中标注了@FrameworkDataSource("aws_rds_snapshots", name="Snapshots"),说明它是基于 terraform-plugin-framework 构建的现代数据源。

从源码结构看,该数据源内部持有framework.DataSourceWithModel[snapshotsDataSourceModel]结构体,并通过flex.Expand/flex.Flatten在 Terraform 配置模型与 AWS SDK for Go v2 的DescribeDBSnapshotsInput之间完成双向转换,最终将结果写入snapshots列表属性。

示例用法

基础用法:按 DB 实例查询

最常用的场景是传入db_instance_identifier,获取某个数据库实例创建的全部快照:

data "aws_rds_snapshots" "example" { db_instance_identifier = "my-db-instance" }

按快照 ID 过滤

使用filter块按 AWS 支持的属性精确筛选,下面的配置只返回db-snapshot-id等于my-snapshot-id的快照:

data "aws_rds_snapshots" "example" { filter { name = "db-snapshot-id" values = ["my-snapshot-id"] } }

filter的匹配语义是"集合内的任一值命中即选中",因此values中可以传入多个快照 ID 实现"多选一"效果。

组合用法:综合场景实战

将多种参数组合使用,可以精确锁定"某实例下、手动类型、且只含当前账号自有快照"的列表:

data "aws_rds_snapshots" "example" { db_instance_identifier = "my-db-instance" snapshot_type = "manual" include_public = false include_shared = false filter { name = "status" values = ["available"] } } output "snapshot_ids" { value = [for s in data.aws_rds_snapshots.example.snapshots : s.db_snapshot_identifier] }

参数参考(Argument Reference)

该数据源支持以下参数,全部为可选:

参数类型说明
db_instance_identifierString返回由指定 DB 实例创建的快照列表
db_snapshot_identifierString返回特定快照 ID 的信息
filterBlock配置块,使用 AWS 支持的属性过滤快照,详见下文
include_publicBool设为true时包含可被任意 AWS 账号复制或恢复的公有手动快照,默认false
include_sharedBool设为true时包含来自其他 AWS 账号、且当前账号已被授予复制或恢复权限的共享手动快照,默认false
regionString该数据源所管理资源所在的区域,默认为 Provider 配置中设置的 Region
snapshot_typeString要返回的快照类型。不指定时同时返回自动(automated)和手动(manual)快照,且默认不包含共享与公有快照。可选值:automatedmanualsharedpublicawsbackup

这些参数与底层DescribeDBSnapshotsInput的字段一一对应。在 snapshots_data_source.go 的snapshotsDataSourceModel中可以看到:

  • DBInstanceIdentifierDBSnapshotIdentifierIncludePublicIncludeSharedSnapshotType均为直接映射的标量属性;
  • region通过内嵌的framework.WithRegionModel提供,读取的是 Provider 配置中的区域设置;
  • filterfwtypes.SetNestedObjectValueOf[snapshotFilterModel]类型的嵌套集合块。

在 Read 流程中(snapshots_data_source.go#L74-L101),Provider 会先读取配置并flex.Expandrds.DescribeDBSnapshotsInput,再调用findDBSnapshots获取结果,最后flex.Flatten回写状态,全程通过smerr.AddEnrich收集诊断信息以保证错误可追溯。

filter块详解

参数类型说明
nameString(必填)过滤字段名称,合法取值可参考 RDSDescribeDBSnapshotsAPI 参考
valuesSet of String(必填)该过滤字段接受的值集合,任意一个值匹配即选中结果

在源码中,filter块被定义为schema.SetNestedBlock(snapshots_data_source.go#L54-L70),values使用fwtypes.SetOfStringType自定义类型,保证配置中的字符串集合能被正确转换为 AWS API 所需的[]string

属性参考(Attribute Reference)

除上述参数外,该数据源还会导出snapshots属性——快照列表,其每个元素包含以下字段:

属性说明
allocated_storage分配存储容量(GB)
availability_zone快照创建时 DB 实例所在的可用区
db_instance_identifier快照来源 DB 实例的标识符
db_snapshot_arnDB 快照的 ARN
db_snapshot_identifierDB 快照的标识符
encrypted快照是否加密
engine数据库引擎名称
engine_version数据库引擎版本
iops快照创建时 DB 实例的预置 IOPS 值
kms_key_idKMS 加密密钥的 ARN
license_model恢复后 DB 实例的许可模型信息
option_group_nameDB 快照的选项组名称
original_snapshot_create_time快照创建时间(UTC),快照被复制时该值不变
port快照创建时数据库引擎监听的端口
snapshot_create_time快照创建时间(UTC),快照被复制时该值会变化
snapshot_typeDB 快照的类型
source_db_snapshot_identifier该快照复制来源的 DB 快照 ARN,仅对跨账号或跨区域复制设置
source_regionDB 快照创建或复制的来源区域
statusDB 快照的状态
storage_type与该快照关联的存储类型
tag_list快照上附加的标签列表,详见下文
vpc_id与该 DB 快照关联的 VPC ID

以上字段在 snapshots_data_source.go#L119-L142 的snapshotModel中有完整对应,其中两个时间字段original_snapshot_create_timesnapshot_create_time使用timetypes.RFC3339类型,在 Terraform 状态中以 RFC3339 时间格式呈现,可直接被time相关函数解析使用。

tag_list

属性说明
key标签键
value标签值

tag_list与资源上的tags不同,它是快照创建时实际写入 AWS 侧的标签快照(读操作导出属性),可通过tag_list判断快照的归属、来源或生命周期策略标记。

底层实现:分页查询与过滤逻辑

该数据源的查询核心是findDBSnapshots函数,位于 internal/service/rds/snapshot.go#L303-L328。其实现要点如下:

  1. 使用rds.NewDescribeDBSnapshotsPaginator创建分页器,通过pages.HasMorePages()pages.NextPage(ctx)循环拉取所有分页数据——这意味着即使账号下有成百上千个快照,数据源也能完整返回而不会只取第一页;
  2. 当遇到DBSnapshotNotFoundFault时转换为retry.NotFoundError,交由上层统一处理"未找到"语义;
  3. 每个分页中的快照都会经过传入的tfslices.Predicate[*rdstypes.DBSnapshot]谓词过滤,再汇总进最终输出切片。当前数据源传入的是tfslices.PredicateTrue(全量接受),即过滤逻辑完全交由 API 参数与filter块在服务端完成。

同文件中的 findDBSnapshot 则是单快照查询版本,通过tfresource.AssertSingleValueResult保证只返回一个结果,供aws_db_snapshot单快照数据源使用,二者形成了"单个/列表"的查询能力互补。

测试验证:接受测试如何校验数据源行为

仓库为aws_rds_snapshots提供了完整的接受测试(Acceptance Test),见 internal/service/rds/snapshots_data_source_test.go,覆盖两个核心场景:

  • TestAccRDSSnapshotsDataSource_basic:创建真实 DB 实例与aws_db_snapshot,再通过db_instance_identifier查询,使用statecheck.ExpectKnownValue断言snapshots列表中的db_instance_identifierdb_snapshot_identifiersnapshot_create_timestatusengine非空,并精确校验tag_listName标签的键值;
  • TestAccRDSSnapshotsDataSource_filter:同时创建两个快照(testtest-wrong),用filter { name = "db-snapshot-id" }验证只有精确匹配的快照进入结果列表,证明了filter的"命中才返回"语义。

这两个测试的 HCL 配置还展示了真实联动写法:数据源通过depends_on = [aws_db_snapshot.test]确保快照创建完成后再查询,这在编写自己的 Terraform 配置时同样是避免竞态条件的良好实践。

使用建议与注意事项

  1. 明确快照范围snapshot_type不设置时会同时返回 automated 与 manual 快照,但默认排除共享与公有快照;需要纳入跨账号场景时,必须显式设置include_shared/include_publictrue
  2. 优先用filter做服务端过滤filter由 AWS API 在服务端执行,比在 Terraform 中用for表达式遍历snapshots再筛选更高效、更节省 Provider 处理开销。
  3. original_snapshot_create_timesnapshot_create_time的区别:前者是"最初拍摄时间"(复制后不变),后者是"当前快照的创建时间"(复制后会变化),做备份链路审计时应按需选择。
  4. region属性:该数据源支持按区域管理资源,多区域配置时可在数据源块内单独覆盖,无需改动 Provider 级别的区域设置。
  5. 注意该数据源与单快照数据源的区别:若你的业务只需要"一个"确定的快照信息,可考虑使用返回单条记录的aws_db_snapshot(对应 snapshot_data_source.go);需要"一批"快照时,则使用本文的aws_rds_snapshots

总结

aws_rds_snapshots是 Terraform AWS Provider 中面向 RDS 快照的批量查询数据源,提供db_instance_identifierdb_snapshot_identifierfilterinclude_publicinclude_sharedregionsnapshot_type七类过滤维度,并导出包含存储、加密、引擎、标签、来源区域等在内的 21 个快照属性。在实现层面,它以 terraform-plugin-framework 构建,底层通过DescribeDBSnapshots分页器全量拉取快照列表,并配有完整的接受测试保障行为正确性。无论是构建备份清理自动化、多账号共享快照审计,还是按条件批量重建实例,该数据源都能以声明式配置轻松完成快照发现与信息采集。

【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询