如何用Terraform创建私有S3 Bucket?解决创建后自动公开问题
问题描述
我想创建一个私有S3 Bucket,通过AWS控制台创建的私有桶可正常生效,但使用Terraform创建时,桶虽能成功创建却始终显示为公开状态。
代码
resource "aws_s3_bucket" "audio" { bucket = "my-dev-audio" } resource "aws_s3_bucket_acl" "audio" { bucket = aws_s3_bucket.audio.id acl = "private" }
执行日志
[...] # aws_s3_bucket_acl.audio will be created + resource "aws_s3_bucket_acl" "audio" { + acl = "private" + bucket = (known after apply) + id = (known after apply) + access_control_policy { + grant { + permission = (known after apply) + grantee { + display_name = (known after apply) + email_address = (known after apply) + id = (known after apply) + type = (known after apply) + uri = (known after apply) } } + owner { + display_name = (known after apply) + id = (known after apply) } } }
截图说明
- 桶列表中,该桶显示为公开状态:

- 桶的权限标签页中,同样显示为公开状态:

环境信息
- Terraform 1.2.1
- AWS Provider 4.45.0
已做调研
- 查阅了AWS Provider的
aws_s3_bucket_acl资源文档,未发现代码与示例存在差异。
核心问题
如何使用Terraform创建一个真正私有状态的S3 Bucket?
解决方案
原因分析
仅设置ACL为private不足以确保桶完全私有,因为S3的块公共访问设置默认可能未启用,或者桶继承了账户级的公共访问配置,导致控制台显示桶为公开状态,甚至存在实际的公共访问路径。
正确配置代码
需要同时配置私有ACL和块公共访问策略,彻底阻断所有公共访问途径:
resource "aws_s3_bucket" "audio" { bucket = "my-dev-audio" } # 配置私有ACL resource "aws_s3_bucket_acl" "audio" { bucket = aws_s3_bucket.audio.id acl = "private" } # 启用全量块公共访问 resource "aws_s3_bucket_public_access_block" "audio" { bucket = aws_s3_bucket.audio.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true }
注意事项
aws_s3_bucket_public_access_block是确保桶私有核心配置,它会覆盖所有账户级、桶级的公共访问规则,彻底阻止公共访问。- 执行
terraform apply后,刷新S3控制台即可看到桶状态变为私有。 - 若已创建问题桶,单独添加
aws_s3_bucket_public_access_block资源并执行apply即可修复权限问题。
内容的提问来源于stack exchange,提问作者dur
相关产品推荐
相关产品推荐

