2. 管理AWS S3存储桶
任务目标
使用 Terraform 在 AWS 上创建一个 S3 存储桶,并完成三项核心配置:启用版本控制(versioning)、启用服务端默认加密(SSE-S3)、阻止所有公共访问(public access block)。本案例提供可直接运行的完整配置与验证路径。
环境依赖
- Terraform ≥ 1.5(推荐 1.6+)
- AWS Provider ≥ 5.0
- 已配置 AWS 凭证(环境变量
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY,或~/.aws/credentials)
完整实现
创建 main.tf,内容如下:
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.0"
}
}
}
provider "aws" {
region = "us-east-1"
}
# 存储桶名称需全局唯一,建议添加随机后缀
resource "random_id" "suffix" {
byte_length = 4
}
resource "aws_s3_bucket" "this" {
bucket = "tf-demo-${random_id.suffix.hex}"
}
# 启用版本控制
resource "aws_s3_bucket_versioning" "this" {
bucket = aws_s3_bucket.this.id
versioning_configuration {
status = "Enabled"
}
}
# 启用默认加密(SSE-S3)
resource "aws_s3_bucket_server_side_encryption_configuration" "this" {
bucket = aws_s3_bucket.this.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
# 阻止所有公共访问
resource "aws_s3_bucket_public_access_block" "this" {
bucket = aws_s3_bucket.this.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
# 输出存储桶名称,便于验证
output "bucket_name" {
value = aws_s3_bucket.this.bucket
}
运行与验证
- 初始化:
terraform init - 预览变更:
terraform plan— 确认将创建 1 个存储桶及 3 个配置子资源 - 应用配置:
terraform apply -auto-approve - 验证配置是否生效:
# 查看版本控制状态
aws s3api get-bucket-versioning --bucket $(terraform output -raw bucket_name)
# 查看加密配置
aws s3api get-bucket-encryption --bucket $(terraform output -raw bucket_name)
# 查看公共访问阻止配置
aws s3api get-public-access-block --bucket $(terraform output -raw bucket_name)
通过条件:三条命令均返回对应配置且无报错——版本控制返回 Status: Enabled;加密返回 SSEAlgorithm: AES256;公共访问阻止返回四个字段均为 true。
清理资源
terraform destroy -auto-approve
常见问题
- Bucket 名称冲突:S3 桶名全局唯一,若
terraform apply报BucketAlreadyExists,重新运行terraform apply会生成新的随机后缀,或手动修改random_id长度。 - 配置顺序依赖:Terraform 已通过隐式依赖(
bucket = aws_s3_bucket.this.id)保证先创建桶再应用配置,无需额外depends_on。 - 销毁限制:若桶中已有对象,
terraform destroy会失败。本案例未上传任何对象,可直接销毁。