terraform-provider-aws 的 aws_s3_bucket_objects 数据源:列出 S3 桶对象键与元数据(含弃用迁移指南) 📅 发布时间:2026/9/20 5:21:54 👁 浏览次数: terraform-provider-aws 的 aws_s3_bucket_objects 数据源列出 S3 桶对象键与元数据含弃用迁移指南【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_s3_bucket_objects是 terraform-provider-aws 提供的 S3 数据源用于一次性返回某个 S3 桶内全部或按前缀/分隔符过滤后的对象键key即文件名以及可选的属主信息。本文以 website/docs/d/s3_bucket_objects.html.markdown 为核心结合 internal/service/s3/bucket_objects_data_source.go 的实现与测试完整讲解其参数、属性、底层调用链并给出迁移到替代数据源aws_s3_objects的实操方案。读完本文你将掌握如何用 Terraform 枚举 S3 对象键、如何用prefix/delimiter模拟目录浏览、如何控制返回数量上限以及为什么必须尽快弃用该数据源。⚠️弃用警告aws_s3_bucket_objects数据源已被弃用DEPRECATED并将在未来版本中被移除。新功能与缺陷修复只会发生在替代数据源aws_s3_objects上详见 website/docs/d/s3_objects.html.markdown。源码 bucket_objects_data_source.go 顶部明确注释“不要对该文件中的数据源应用修复或增强请将修复与增强应用到 objects_data_source.go”且其 Schema 上直接带有DeprecationMessage: use the aws_s3_objects data source instead。数据源功能概述该数据源返回 S3 桶中对象的键keys即文件名以及其他元数据。其核心语义是“列举对象名清单”而非读取对象内容——如果你需要读取单个对象的元数据或内容如body、etag、version_id应使用单对象数据源aws_s3_object见 website/docs/d/s3_object.html.markdown。⚠️关于max_keys的性能警告检索非常大量的键会显著影响 Terraform 的执行性能配置时需谨慎设置上限。基础用法示例以下示例获取 S3 桶中全部对象键的列表并为每个键创建对应的aws_s3_object数据源用于后续读取单个对象的元数据data aws_s3_bucket_objects my_objects { bucket ourcorp } data aws_s3_object object_info { count length(data.aws_s3_bucket_objects.my_objects.keys) key element(data.aws_s3_bucket_objects.my_objects.keys, count.index) bucket data.aws_s3_bucket_objects.my_objects.id }这里展示了该数据源最典型的应用模式先通过keys得到对象名数组再用countelement批量构造下游引用如批量拉取元数据、批量生成资源配置。注意bucket属性同时复用了数据源的id属性其值即桶名。参数参考Argument Reference该数据源支持以下参数参数必填说明默认值bucket是已弃用要列出对象键的 S3 桶名也可以指定 S3 访问点Access Point的 ARN。应改用aws_s3_objects数据源无delimiter否用于对键分组的字符无不分组encoding_type否键的编码方式无除url外无其他可选值fetch_owner否是否填充属主owner列表的布尔值falsemax_keys否返回的对象键最大数量1000prefix否将结果限制为带此前缀的对象键无region否该数据源所在区域默认取 Provider 配置中的区域Provider 配置start_after否只返回在指定对象键之后按字典序的键名无S3 按 UTF-8 编码的字典序列出键关键参数深入解析delimiter分组符配合prefix使用可模拟“目录浏览”。例如prefix arch/、delimiter /时所有一级“子目录”会被折叠进common_prefixes属性而keys只包含该层直接的“文件”。这与 S3 API 中ListObjectsV2的Delimiter语义一致。encoding_type编码方式唯一合法值是url。当对象键包含空格或特殊字符如arch/ru b ic on时S3 会以 URL 编码形式返回空格编码为避免键中的不可打印字符破坏 Terraform 状态。max_keys数量上限默认 1000既是单页请求大小也是返回总数上限。注意与 S3 APIMaxKeys语义的细微差别见下文源码解析。start_after起点键用于“从某键之后开始”的分页续传场景配合prefix可按字典序遍历桶内容。fetch_owner拉取属主置为true时owners属性会填充对象属主 ID。注意仅当桶开启了相关权限或为已认证请求时才返回属主信息。属性参考Attribute Reference除上述参数外数据源还导出以下属性属性说明common_prefixesprefix到下一次出现delimiter之间的所有键即prefix“目录”下的子目录仅在指定delimiter时返回idS3 桶名keys对象键字符串列表owners对象属主 ID 字符串列表依赖fetch_owner源码级解析底层实现与调用链数据源定义与弃用标记在 internal/service/s3/bucket_objects_data_source.go 中数据源通过SDKDataSource(aws_s3_bucket_objects, nameBucket Objects)注解注册Schema 中bucket参数带有Deprecated: bucket is deprecated. Use the aws_s3_objects data source instead.整个 Resource 上还挂载了DeprecationMessage。这意味着 Terraform 在配置校验阶段就会提示弃用帮助用户平滑迁移。底层 APIListObjectsV2 分页器读取逻辑在dataSourceBucketObjectsReadbucket_objects_data_source.go中通过meta.(*conns.AWSClient).S3Client(ctx)获取 S3 客户端构造s3.ListObjectsV2Input按配置依次写入Bucket、Delimiter、EncodingType、Prefix、StartAfter、FetchOwner使用s3.NewListObjectsV2Paginator(conn, input)分页拉取全部结果每页遍历page.Contents收集键遇到page.CommonPrefixes收集公共前缀若object.Owner ! nil则收集属主 ID最后d.SetId(bucket)并以桶名作为id写入common_prefixes、keys、owners。max_keys的真实语义重要源码注释揭示了最容易踩坑的一点// listInput.MaxKeys refers to max keys returned in a single request // (i.e., page size), not the total number of keys returned if you page // through the results. maxKeys does refer to total keys returned. maxKeys : int64(d.Get(max_keys).(int)) if maxKeys keyRequestPageSize { input.MaxKeys aws.Int32(int32(maxKeys)) }当max_keys 1000常量keyRequestPageSize定义于 objects_data_source.go时该值同时作为单次请求的MaxKeys传入无论配置值多大外层循环在累积到nKeys maxKeys时通过break pageLoop强制停止因此max_keys始终是返回总数上限即便桶内有海量对象只要超过max_keys就立即停止翻页这正是文档警告“检索大量键会影响性能”的机制根源——配置过大的max_keys会迫使 Terraform 连续发起多次网络请求直至拉满。实战进阶更多筛选组合以下示例展示如何结合prefix与delimiter实现“按目录层级列举”并同时拿到公共前缀与直接子对象data aws_s3_bucket_objects archives { bucket ourcorp prefix arch/ delimiter / } output subdirectories { value data.aws_s3_bucket_objects.archives.common_prefixes } output files_under_arch { value data.aws_s3_bucket_objects.archives.keys }再比如配合start_after实现“跳过前 N 个键继续列举”的分页场景data aws_s3_bucket_objects next_page { bucket ourcorp start_after arch/navajo/north_window }迁移指南切换到 aws_s3_objects由于aws_s3_bucket_objects将被移除新代码应直接使用aws_s3_objects。两者参数、属性几乎一一对应迁移成本极低维度aws_s3_bucket_objects弃用aws_s3_objects推荐bucket已标记弃用正常使用支持桶名与访问点 ARNencoding_type任意字符串增加ValidateDiagFunc: enum.Validate[types.EncodingType]()枚举校验request_payer不支持支持唯一合法值requesterrequest_charged属性不支持支持反映请求是否已计费目录桶Directory Bucket不支持支持内部自动切换 S3 Express 客户端见 objects_data_source.go访问点 ARN 区域匹配无特殊处理当客户端区域为aws-global时自动启用UseARNRegion见 objects_data_source.go最小迁移示例# 旧写法弃用 # data aws_s3_bucket_objects my_objects { # bucket ourcorp # } # 新写法 data aws_s3_objects my_objects { bucket ourcorp } data aws_s3_object object_info { count length(data.aws_s3_objects.my_objects.keys) key element(data.aws_s3_objects.my_objects.keys, count.index) bucket data.aws_s3_objects.my_objects.id }测试佐证行为如何被验证仓库中的接受测试Acceptance Tests直接验证了本文描述的行为bucket_objects_data_source_test.go 覆盖了旧数据源场景basicprefix delimiter 过滤、all列举全部 7 个键、prefixes验证common_prefixes为 4 个目录、encodedencoding_type url下空格键被编码为arch/rubicon、maxKeys只返回前 2 个键、startAfter、fetchOwner、basicViaAccessPoint通过访问点 ARN 列举objects_data_source_test.go 则额外验证了新数据源的能力如TestAccS3ObjectsDataSource_maxKeysLarge向桶中注入 1500 个对象后断言max_keys 1002恰好返回 1002 个键跨越多个 API 分页TestAccS3ObjectsDataSource_directoryBucket验证目录桶支持。这些测试用例的配置模板如testAccObjectsDataSourceConfig_basic中prefix prefix1/delimiter /可作为编写真实 Terraform 配置的可靠参照。总结aws_s3_bucket_objects提供了一种声明式枚举 S3 对象键的方式其prefix、delimiter、start_after、max_keys组合足以覆盖目录浏览、分页与数量控制的常见需求但该数据源已进入弃用倒计时。新项目应一律使用aws_s3_objects存量配置也应尽快迁移——两者接口高度兼容迁移只需替换数据源类型名并能额外获得访问点区域处理、目录桶、请求方付费request_payer等新能力。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考