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
}

运行与验证

  1. 初始化:terraform init
  2. 预览变更:terraform plan — 确认将创建 1 个存储桶及 3 个配置子资源
  3. 应用配置:terraform apply -auto-approve
  4. 验证配置是否生效:
# 查看版本控制状态
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
Terraform 管理 S3 存储桶资源关系 Terraform 配置 aws_s3_bucket.this tf-demo-{random_id} 版本控制 aws_s3_bucket_versioning status = "Enabled" 默认加密 aws_s3_bucket_server_side_ encryption_configuration 公共访问阻止 aws_s3_bucket_public_access_block 4 项全部 = true 验证方式 aws s3api get-bucket-versioning / get-bucket-encryption / get-public-access-block

常见问题

  • Bucket 名称冲突:S3 桶名全局唯一,若 terraform apply 报 BucketAlreadyExists,重新运行 terraform apply 会生成新的随机后缀,或手动修改 random_id 长度。
  • 配置顺序依赖:Terraform 已通过隐式依赖(bucket = aws_s3_bucket.this.id)保证先创建桶再应用配置,无需额外 depends_on。
  • 销毁限制:若桶中已有对象,terraform destroy 会失败。本案例未上传任何对象,可直接销毁。