# S3 for clinical documents / CMS artifacts: SSE-KMS, versioned (staging+), # all public access blocked. resource "aws_s3_bucket" "this" { bucket = var.bucket_name force_destroy = var.force_destroy tags = merge(var.tags, { Name = var.bucket_name }) } 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 } resource "aws_s3_bucket_versioning" "this" { count = var.versioned ? 1 : 0 bucket = aws_s3_bucket.this.id versioning_configuration { status = "Enabled" } } resource "aws_s3_bucket_server_side_encryption_configuration" "this" { bucket = aws_s3_bucket.this.id rule { apply_server_side_encryption_by_default { sse_algorithm = var.sse_kms ? "aws:kms" : "AES256" kms_master_key_id = var.sse_kms ? var.kms_key_arn : null } bucket_key_enabled = true } } resource "aws_s3_bucket_lifecycle_configuration" "this" { count = var.versioned ? 1 : 0 bucket = aws_s3_bucket.this.id rule { id = "expire-noncurrent" status = "Enabled" filter {} # match all objects (prefix-less rules are deprecated) noncurrent_version_expiration { noncurrent_days = 90 } } }