
IaC云原生基础设施【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址https://gitcode.com/GitHub_Trending/te/terraform-provider-aws点击查看免费下载aws_s3_account_public_access_block是 terraform-provider-aws 提供的数据源用于读取某个 AWS 账户级别的 S3 公共访问阻止Public Access Block配置。本文以官方数据源文档为骨架结合仓库中 S3 Control 服务的源码实现与验收测试讲解该数据源的使用方式、参数与导出属性、底层 API 调用链以及与同名资源aws_s3_account_public_access_block的配合场景。读完本文你将掌握如何在 Terraform 配置中查询账户级 S3 公共访问阻止状态并能理解其背后的实现原理。数据源概述S3 公共访问阻止Public Access Block是 AWS 提供的一组账户级安全开关用于阻止通过 ACL 或存储桶策略向公众开放 S3 数据。aws_s3_account_public_access_block数据源返回当前或指定AWS 账户级别的公共访问阻止配置属于 S3 Controls3control服务范畴在文档中归类于 S3 Control 子类别。该数据源与同名资源互补资源 aws_s3_account_public_access_block 资源文档 负责写入/管理配置而数据源负责读取配置二者都作用于账户级配置而非单个存储桶。如果你需要的是某个具体桶的公共访问阻止配置应使用数据源aws_s3_bucket_public_access_block。从源码结构看该数据源注册于 internal/service/s3control/account_public_access_block_data_source.go通过SDKDataSource(aws_s3_account_public_access_block, nameAccount Public Access Block)注解声明并标注Region(globaltrue)表示该配置是**全局性非区域性**的与具体 Region 无关。快速开始最小示例数据源的最小用法非常简单不传任何参数即可读取当前 Terraform Provider 所配置 AWS 账户的公共访问阻止配置data aws_s3_account_public_access_block example { }在读取到配置后可以在其他资源中引用导出属性例如data aws_s3_account_public_access_block example {} output current_block_public_acls { value data.aws_s3_account_public_access_block.example.block_public_acls } output current_block_public_policy { value data.aws_s3_account_public_access_block.example.block_public_policy }当账户从未设置过公共访问阻止配置时AWS 会返回NoSuchPublicAccessBlockConfiguration错误Terraform 读取该数据源时会报错并提示reading S3 Account Public Access Block此时可以先用资源设置配置再通过数据源读取。Argument Reference参数说明该数据源仅支持一个可选参数参数类型是否必填说明account_idString否要查询的 AWS 账户 ID。默认为 Terraform AWS Provider 自动确定的账户 ID即当前凭据所属账户源码中该参数的实现位于 account_public_access_block_data_source.go它被声明为Optional且不Computed并挂接了verify.ValidAccountID校验函数因此传入非法格式的账户 ID 会在配置校验阶段直接被拒绝而不是等到 API 调用时才报错。指定其他账户的示例data aws_s3_account_public_access_block other { account_id 123456789012 }Attribute Reference导出属性该数据源在参数之外导出以下属性属性类型说明idStringAWS 账户 IDblock_public_aclsBool是否已启用阻止公共 ACL返回true或falseblock_public_policyBool是否已启用阻止公共存储桶策略返回true或falseignore_public_aclsBool是否已启用忽略公共 ACL返回true或falserestrict_public_bucketsBool是否已启用限制公共存储桶策略返回true或false这四个布尔开关的含义与同名资源文档 website/docs/r/s3_account_public_access_block.html.markdown 中的描述一致如下block_public_acls阻止通过公共 ACL 公开访问。启用后若 ACL 允许公共访问PUT Bucket acl和PUT Object acl调用将失败若请求携带公共 ACLPUT Object调用也会失败。该设置不影响已存在的 ACL。block_public_policy阻止通过公共存储桶策略公开访问。启用后若存储桶策略允许公共访问Amazon S3 将拒绝PUT Bucket policy调用。该设置不影响已存在的存储桶策略。ignore_public_acls忽略桶内已有的公共 ACL。启用后Amazon S3 会忽略该账户下所有存储桶及其对象的公共 ACL但不会清除已有 ACL也不阻止新的公共 ACL 被写入。restrict_public_buckets限制公共存储桶策略的生效范围。启用后只有存储桶所有者和 AWS 服务可以访问带公共策略的存储桶且公共策略中的公共访问和跨账户访问包括对特定账户的非公共委托都会被阻止。该设置不影响此前存储的策略。在数据源的 schema 中这四个属性全部被声明为Computed且类型为Bool源码 L32-L47即只能读取、不能由用户设置。与同名资源的配合使用一个 AWS 账户最多只能存在一份S3 公共访问阻止配置。因此在实际项目中典型的用法是先通过资源声明并管理配置再通过数据源读取当前生效值用于审计或派生配置resource aws_s3_account_public_access_block example { block_public_acls true block_public_policy true ignore_public_acls true restrict_public_buckets true } data aws_s3_account_public_access_block example { depends_on [aws_s3_account_public_access_block.example] } output verified_block_public_acls { value data.aws_s3_account_public_access_block.example.block_public_acls }这里使用depends_on确保数据源在资源写入配置之后才读取避免读到变更前的旧状态。仓库中的验收测试 account_public_access_block_data_source_test.go 正是采用这一配对模式先用资源aws_s3_account_public_access_block.test写入配置全部设置为false再声明数据源data.aws_s3_account_public_access_block.test读取并通过resource.TestCheckResourceAttrPair逐一断言资源与数据源的block_public_acls、block_public_policy、ignore_public_acls、restrict_public_buckets四个属性值完全一致见 测试源码 L26-L31。该测试同时也验证了数据源从真实 API 返回值到 Terraform 状态字段的映射是正确的。源码级原理数据源是如何读取配置的账户 ID 的确定逻辑数据源的读取函数dataSourceAccountPublicAccessBlockReadaccount_public_access_block_data_source.go L53-L75执行以下步骤通过meta.(*conns.AWSClient).S3ControlClient(ctx)获取 S3 Control 服务的 AWS SDK for Go v2 客户端默认取meta.(*conns.AWSClient).AccountID(ctx)作为账户 ID即当前 Provider 凭据所属账户如果配置中显式设置了account_id则用其覆盖默认值调用findPublicAccessBlockByAccountID发起底层查询。底层 API 调用链findPublicAccessBlockByAccountID实现在 account_public_access_block.go L198-L220构造GetPublicAccessBlockInput{AccountId: ...}并调用 S3 Control 的GetPublicAccessBlockAPI。该函数对错误做了两类特殊处理当返回码为NoSuchPublicAccessBlockConfiguration时错误码常量定义在 internal/service/s3control/errors.go将其包装为retry.NotFoundError表示该账户尚未配置公共访问阻止当响应或PublicAccessBlockConfiguration字段为空时返回tfresource.NewEmptyResultError()同样视为未找到。查询成功后读取函数依次执行d.SetId(accountID)和四个布尔字段的d.Set把 AWS 返回的PublicAccessBlockConfiguration结构体字段BlockPublicAcls、BlockPublicPolicy、IgnorePublicAcls、RestrictPublicBuckets映射进 Terraform 状态从而完成数据源读取。读写双方共享同一套查找逻辑值得注意的是数据源与同名资源共用findPublicAccessBlockByAccountID这一查找函数该函数在 internal/service/s3control/exports_test.go 中被导出供测试使用。资源的 Create 流程在调用PutPublicAccessBlock后会通过retry.Op(...).UntilFoundN(inARow)等待配置连续两次可被读取account_public_access_block.go L103-L112Update 流程则使用waitPublicAccessBlockEqual轮询直到读取到的配置与目标完全一致reflect.DeepEqual比较见 L222-L255。这些等待逻辑都基于 S3 控制面最终一致性模型其传播超时定义为 2 分钟s3PropagationTimeout见 internal/service/s3control/consts.go。数据源虽然本身不需要写入等待但理解这套轮询机制有助于解释刚配置完立刻读取数据源可能短暂不一致的现象。注意事项账户级单例约束每个 AWS 账户只能有一份 S3 公共访问阻止配置因此请勿在同一账户上重复声明多个aws_s3_account_public_access_block资源否则会产生永久性 diff详见资源文档中的 NOTE 提示。全局资源与 Region该数据源及其对应资源带Region(globaltrue)标记是全局生效的配置不随某个特定 Region 变化。关于全局资源在增强 Region 支持机制下的行为可参考 enhanced-region-support 指南。自定义端点如果需要为该数据源配置自定义 API 端点应使用 Provider 的s3control端点配置对应 website/docs/index.html.markdown 中关于端点配置的说明而不是s3端点配置。数据源与资源职责分离数据源只读不写任何对配置的修改都应通过资源aws_s3_account_public_access_block完成数据源适合用于查询、审计、以及在配置之间传递状态如组织内多账户策略检查。小结aws_s3_account_public_access_block数据源是查询 AWS 账户级 S3 公共访问阻止状态的轻量入口它接受可选的account_id参数导出block_public_acls、block_public_policy、ignore_public_acls、restrict_public_buckets四个布尔属性以及作为 ID 的账户 ID。在仓库中它由 S3 Control 服务的 SDKv2 数据源实现支撑底层通过GetPublicAccessBlockAPI 读取配置并与同名资源共享查找与错误处理逻辑。将它与同名资源配合使用可以构建声明配置 读取验证的完整安全治理工作流。赞分享IaC云原生基础设施【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址https://gitcode.com/GitHub_Trending/te/terraform-provider-aws点击查看免费下载相关推荐使用 aws_iam_account_alias 数据源读取 AWS 账户别名使用 aws_iam_account_alias 数据源读取 AWS 账户别名 在 Terraform 配置中很多场景如构建 IAM 用户登录 URL、S3IaC云原生基础设施Terraform AWS Provider 数据源 aws_elb_service_account精准获取 ELB Classic 服务账户 ID 以配置 S3 访问日志桶策略Terraform AWS Provider 数据源 aws_elb_service_account 精准获取 ELB Classic 服务账户 ID 以配置IaC云原生基础设施使用 Terraform AWS Provider 数据源 aws_cognito_user_pool 读取 Cognito 用户池配置使用 Terraform AWS Provider 数据源 aws_cognito_user_pool 读取 Cognito 用户池配置 本指南基于 terraIaC云原生基础设施创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考