- IaC
- 云原生
- 基础设施
【免费下载链接】terraform-provider-aws
The AWS Provider enables Terraform to manage AWS resources.
本篇技术指南以 关联文档 为核心,系统讲解 Terraform AWS Provider 中数据源aws_s3_bucket_object_lock_configuration的完整用法:从基本查询示例、全部参数与导出属性,到其基于 terraform-plugin-framework 的源码实现原理,并结合仓库内的实现与测试代码(bucket_object_lock_configuration_data_source.go、bucket_object_lock_configuration.go)深入说明其底层调用链。读完本文,你将能熟练使用该数据源读取 S3 桶的 Object Lock 配置状态,并理解其与aws_s3_bucket_object_lock_configuration资源、S3 版本控制、目录桶(S3 Express)之间的协作关系。
数据源概述
aws_s3_bucket_object_lock_configuration是一个只读数据源,用于获取 AWS S3(Simple Storage)桶的Object Lock(对象锁定)配置详细信息。它适用于以下典型场景:
- 在配置管理、合规审计或自动化脚本中,读取某个桶是否开启了 Object Lock;
- 读取桶上配置的默认保留规则(
default_retention),包括保留模式和保留期限; - 在多个 Terraform 配置或模块之间共享桶的 Object Lock 状态,作为其他资源的输入。
该数据源由 S3 服务包注册,通过@FrameworkDataSource注解声明,数据源名称为aws_s3_bucket_object_lock_configuration,实现位于 bucket_object_lock_configuration_data_source.go。
示例用法
基本用法
在 Terraform 配置中声明该数据源,仅需指定桶名即可读取其 Object Lock 配置:
data "aws_s3_bucket_object_lock_configuration" "example" { bucket = "example-bucket" }查询结果可随后通过属性引用使用,例如读取object_lock_enabled、rule块中的默认保留配置等。
参数参考(Argument Reference)
必填参数
| 参数 | 类型 | 说明 |
|---|---|---|
bucket | 字符串 | 桶的名称。 |
可选参数
| 参数 | 类型 | 说明 |
|---|---|---|
expected_bucket_owner | 字符串 | 预期桶所有者的账户 ID。当桶属于其他 AWS 账户时使用,用于校验桶的实际所有者。 |
region | 字符串 | 该数据源所管理资源的区域。默认使用 Provider 配置中设置的区域。 |
从源码实现看(Schema 定义),bucket被标记为Required,expected_bucket_owner为Optional,object_lock_enabled与rule为只读计算属性(Computed)。
属性参考(Attribute Reference)
该数据源除参数外,还导出以下属性:
| 属性 | 类型 | 说明 |
|---|---|---|
object_lock_enabled | 字符串 | 该桶是否已启用 Object Lock 配置,值为Enabled。 |
rule | 块 | 指定对象的 Object Lock 规则,详见下方 Rule 小节。 |
Rule
rule块支持以下属性:
| 属性 | 说明 |
|---|---|
default_retention | 针对放置到桶中的新对象的默认 Object Lock 保留设置,详见下方 Default Retention。 |
Default Retention
default_retention块支持以下属性:
| 属性 | 类型 | 说明 |
|---|---|---|
days | 整数 | 默认保留期限(天数)。 |
mode | 字符串 | 默认 Object Lock 保留模式,合法值为GOVERNANCE和COMPLIANCE。 |
years | 整数 | 默认保留期限(年数)。 |
源码实现原理
基于 terraform-plugin-framework 的数据源
该数据源采用 HashiCorp 的 terraform-plugin-framework 实现,数据源结构体bucketObjectLockConfigurationDataSource内嵌了framework.DataSourceWithModel,其模型字段定义如下(源码):
Bucket、ExpectedBucketOwner:用户输入的参数;ObjectLockEnabled:只读计算结果;Rule:ListNestedObjectValueOf[dataBucketObjectLockConfigRuleModel]嵌套列表,其中DefaultRetention进一步嵌套Days、Mode、Years三个字段。
Read 流程与底层 API 调用链
数据源读取的核心逻辑位于Read方法(源码):
- 从配置中解析
bucket与expected_bucket_owner; - 调用
findObjectLockConfiguration(定义于 bucket_object_lock_configuration.go),该函数构造GetObjectLockConfigurationInput并调用 S3 APIGetObjectLockConfiguration,将expected_bucket_owner(若提供)一并传入请求; - 将 API 返回的
ObjectLockConfiguration通过flex.Flatten扁平化为数据源模型并写入状态; - 当桶不存在(
errCodeNoSuchBucket)或 Object Lock 配置不存在(errCodeObjectLockConfigurationNotFoundError)时,会包装为retry.NotFoundError抛出,这也是测试中期望 "couldn't find resource" 报错的来源。
目录桶(S3 Express)的特殊处理
Read方法中有一个值得注意的细节(源码):当桶名满足目录桶命名规则时,会切换到 S3 Express 专用客户端S3ExpressClient发起请求。目录桶的判断逻辑定义于 directory_bucket.go,其命名后缀匹配--x-s3模式。也就是说,该数据源同时兼容普通 S3 桶与目录桶的查询场景。
与aws_s3_bucket_object_lock_configuration资源配合使用
数据源通常与同名资源配合:先用 资源文档 中的aws_s3_bucket_object_lock_configuration创建/管理 Object Lock 配置,再用本数据源读取验证。仓库中的验收测试给出了一个完整协作示例(bucket_object_lock_configuration_data_source_test.go):
resource "aws_s3_bucket" "test" { bucket = "example" object_lock_enabled = true } resource "aws_s3_bucket_object_lock_configuration" "test" { bucket = aws_s3_bucket.test.id rule { default_retention { mode = "COMPLIANCE" days = 3 } } } data "aws_s3_bucket_object_lock_configuration" "test" { bucket = aws_s3_bucket_object_lock_configuration.test.bucket }几点实践提醒(结合资源侧文档):
- Object Lock 依赖桶版本控制:对已有桶启用 Object Lock 前,需先通过
aws_s3_bucket_versioning资源启用版本控制,必要时使用资源侧的token参数完成授权; - 数据源读取的是桶上当前生效的 Object Lock 配置:若桶仅开启
object_lock_enabled而未配置任何rule,则返回的rule列表为空(rule.# = 0),object_lock_enabled仍为Enabled; - 若桶既未开启 Object Lock 也未配置规则,则读取会报错(测试中表现为
couldn't find resource)。
测试验证
仓库为数据源提供了三个验收测试用例(bucket_object_lock_configuration_data_source_test.go):
TestAccS3BucketObjectLockConfigurationDataSource_basic:验证基本读取,断言object_lock_enabled = Enabled、rule.# = 1、default_retention.days = 3、mode = COMPLIANCE;TestAccS3BucketObjectLockConfigurationDataSource_noRule:验证桶启用了 Object Lock 但未配置规则时,返回rule.# = 0;TestAccS3BucketObjectLockConfigurationDataSource_notConfigured:验证桶未配置 Object Lock 时,读取报错couldn't find resource。
这些用例既印证了数据源的行为边界,也可作为你编写本地测试或排查问题的参考。
小结
aws_s3_bucket_object_lock_configuration数据源是一个轻量、只读的查询入口,用于获取 S3 桶的 Object Lock 配置详情。其参数与属性结构清晰,底层通过 S3GetObjectLockConfigurationAPI 实现,兼容普通桶与目录桶,并能与同名资源、版本控制配置无缝协作,适合在合规审计、配置校验和基础设施即代码(IaC)流程中直接引用。
- IaC
- 云原生
- 基础设施
【免费下载链接】terraform-provider-aws
The AWS Provider enables Terraform to manage AWS resources.
相关推荐
Terraform AWS Provider 数据源 `aws_iam_outbound_web_identity_federation` 完整使用指南
Terraform AWS Provider 数据源 aws_iam_outbound_web_identity_federation 完整使用指南 aws_i
IaC云原生基础设施Terraform AWS Provider 资源标签数据源 `aws_resourcegroupstaggingapi_resources` 使用指南
Terraform AWS Provider 资源标签数据源 aws_resourcegroupstaggingapi_resources 使用指南 aws_r
IaC云原生基础设施Terraform AWS Provider 使用指南:aws_outposts_site 数据源查询 AWS Outposts 站点
Terraform AWS Provider 使用指南:aws_outposts_site 数据源查询 AWS Outposts 站点 aws_outposts
IaC云原生基础设施
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考