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资源的前提下,一次性返回满足条件的全部快照列表,配合filter、include_public、include_shared、snapshot_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_identifier | String | 返回由指定 DB 实例创建的快照列表 |
db_snapshot_identifier | String | 返回特定快照 ID 的信息 |
filter | Block | 配置块,使用 AWS 支持的属性过滤快照,详见下文 |
include_public | Bool | 设为true时包含可被任意 AWS 账号复制或恢复的公有手动快照,默认false |
include_shared | Bool | 设为true时包含来自其他 AWS 账号、且当前账号已被授予复制或恢复权限的共享手动快照,默认false |
region | String | 该数据源所管理资源所在的区域,默认为 Provider 配置中设置的 Region |
snapshot_type | String | 要返回的快照类型。不指定时同时返回自动(automated)和手动(manual)快照,且默认不包含共享与公有快照。可选值:automated、manual、shared、public、awsbackup |
这些参数与底层DescribeDBSnapshotsInput的字段一一对应。在 snapshots_data_source.go 的snapshotsDataSourceModel中可以看到:
DBInstanceIdentifier、DBSnapshotIdentifier、IncludePublic、IncludeShared、SnapshotType均为直接映射的标量属性;region通过内嵌的framework.WithRegionModel提供,读取的是 Provider 配置中的区域设置;filter是fwtypes.SetNestedObjectValueOf[snapshotFilterModel]类型的嵌套集合块。
在 Read 流程中(snapshots_data_source.go#L74-L101),Provider 会先读取配置并flex.Expand为rds.DescribeDBSnapshotsInput,再调用findDBSnapshots获取结果,最后flex.Flatten回写状态,全程通过smerr.AddEnrich收集诊断信息以保证错误可追溯。
filter块详解
| 参数 | 类型 | 说明 |
|---|---|---|
name | String(必填) | 过滤字段名称,合法取值可参考 RDSDescribeDBSnapshotsAPI 参考 |
values | Set 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_arn | DB 快照的 ARN |
db_snapshot_identifier | DB 快照的标识符 |
encrypted | 快照是否加密 |
engine | 数据库引擎名称 |
engine_version | 数据库引擎版本 |
iops | 快照创建时 DB 实例的预置 IOPS 值 |
kms_key_id | KMS 加密密钥的 ARN |
license_model | 恢复后 DB 实例的许可模型信息 |
option_group_name | DB 快照的选项组名称 |
original_snapshot_create_time | 快照创建时间(UTC),快照被复制时该值不变 |
port | 快照创建时数据库引擎监听的端口 |
snapshot_create_time | 快照创建时间(UTC),快照被复制时该值会变化 |
snapshot_type | DB 快照的类型 |
source_db_snapshot_identifier | 该快照复制来源的 DB 快照 ARN,仅对跨账号或跨区域复制设置 |
source_region | DB 快照创建或复制的来源区域 |
status | DB 快照的状态 |
storage_type | 与该快照关联的存储类型 |
tag_list | 快照上附加的标签列表,详见下文 |
vpc_id | 与该 DB 快照关联的 VPC ID |
以上字段在 snapshots_data_source.go#L119-L142 的snapshotModel中有完整对应,其中两个时间字段original_snapshot_create_time与snapshot_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。其实现要点如下:
- 使用
rds.NewDescribeDBSnapshotsPaginator创建分页器,通过pages.HasMorePages()与pages.NextPage(ctx)循环拉取所有分页数据——这意味着即使账号下有成百上千个快照,数据源也能完整返回而不会只取第一页; - 当遇到
DBSnapshotNotFoundFault时转换为retry.NotFoundError,交由上层统一处理"未找到"语义; - 每个分页中的快照都会经过传入的
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_identifier、db_snapshot_identifier、snapshot_create_time、status、engine非空,并精确校验tag_list中Name标签的键值;TestAccRDSSnapshotsDataSource_filter:同时创建两个快照(test与test-wrong),用filter { name = "db-snapshot-id" }验证只有精确匹配的快照进入结果列表,证明了filter的"命中才返回"语义。
这两个测试的 HCL 配置还展示了真实联动写法:数据源通过depends_on = [aws_db_snapshot.test]确保快照创建完成后再查询,这在编写自己的 Terraform 配置时同样是避免竞态条件的良好实践。
使用建议与注意事项
- 明确快照范围:
snapshot_type不设置时会同时返回 automated 与 manual 快照,但默认排除共享与公有快照;需要纳入跨账号场景时,必须显式设置include_shared/include_public为true。 - 优先用
filter做服务端过滤:filter由 AWS API 在服务端执行,比在 Terraform 中用for表达式遍历snapshots再筛选更高效、更节省 Provider 处理开销。 original_snapshot_create_time与snapshot_create_time的区别:前者是"最初拍摄时间"(复制后不变),后者是"当前快照的创建时间"(复制后会变化),做备份链路审计时应按需选择。region属性:该数据源支持按区域管理资源,多区域配置时可在数据源块内单独覆盖,无需改动 Provider 级别的区域设置。- 注意该数据源与单快照数据源的区别:若你的业务只需要"一个"确定的快照信息,可考虑使用返回单条记录的
aws_db_snapshot(对应 snapshot_data_source.go);需要"一批"快照时,则使用本文的aws_rds_snapshots。
总结
aws_rds_snapshots是 Terraform AWS Provider 中面向 RDS 快照的批量查询数据源,提供db_instance_identifier、db_snapshot_identifier、filter、include_public、include_shared、region、snapshot_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),仅供参考