forgejo/terraform/s3.tf
Adam Moussa 530bd7210e
feat(terraform): migrate forgejo to HCP Terraform
Move the prod host onto workspace forgejo-prod in the After Hours VPC and freeze CDK push deploys so cutover can happen without applying into seahaven-prod.
2026-09-29 18:36:17 -04:00

246 lines
4.7 KiB
HCL

resource "aws_s3_bucket" "backups" {
bucket = local.backup_bucket_name
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket_versioning" "backups" {
bucket = aws_s3_bucket.backups.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "backups" {
bucket = aws_s3_bucket.backups.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_s3_bucket_public_access_block" "backups" {
bucket = aws_s3_bucket.backups.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_ownership_controls" "backups" {
bucket = aws_s3_bucket.backups.id
rule {
object_ownership = "BucketOwnerEnforced"
}
}
resource "aws_s3_bucket_lifecycle_configuration" "backups" {
bucket = aws_s3_bucket.backups.id
rule {
id = "archive-to-glacier"
status = "Enabled"
filter {}
transition {
days = 30
storage_class = "GLACIER"
}
}
rule {
id = "cleanup-noncurrent-versions"
status = "Enabled"
filter {}
noncurrent_version_expiration {
noncurrent_days = 90
}
}
depends_on = [aws_s3_bucket_versioning.backups]
}
resource "aws_s3_bucket" "replica" {
provider = aws.replica
bucket = local.replica_bucket_name
object_lock_enabled = true
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket_versioning" "replica" {
provider = aws.replica
bucket = aws_s3_bucket.replica.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_object_lock_configuration" "replica" {
provider = aws.replica
bucket = aws_s3_bucket.replica.id
rule {
default_retention {
mode = "GOVERNANCE"
days = 90
}
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "replica" {
provider = aws.replica
bucket = aws_s3_bucket.replica.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_s3_bucket_public_access_block" "replica" {
provider = aws.replica
bucket = aws_s3_bucket.replica.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_ownership_controls" "replica" {
provider = aws.replica
bucket = aws_s3_bucket.replica.id
rule {
object_ownership = "BucketOwnerEnforced"
}
}
resource "aws_s3_bucket_lifecycle_configuration" "replica" {
provider = aws.replica
bucket = aws_s3_bucket.replica.id
rule {
id = "archive-to-glacier"
status = "Enabled"
filter {}
transition {
days = 30
storage_class = "GLACIER"
}
}
rule {
id = "cleanup-noncurrent-versions"
status = "Enabled"
filter {}
noncurrent_version_expiration {
noncurrent_days = 90
}
}
depends_on = [aws_s3_bucket_versioning.replica]
}
resource "aws_s3_bucket_replication_configuration" "backups" {
bucket = aws_s3_bucket.backups.id
role = aws_iam_role.replication.arn
rule {
id = "replicate-to-west"
status = "Enabled"
priority = 1
filter {}
delete_marker_replication {
status = "Disabled"
}
destination {
bucket = aws_s3_bucket.replica.arn
storage_class = "STANDARD"
}
}
depends_on = [
aws_s3_bucket_versioning.backups,
aws_s3_bucket_versioning.replica,
]
}
resource "aws_s3_bucket" "artifacts" {
bucket = local.artifacts_bucket_name
}
resource "aws_s3_bucket_versioning" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_s3_bucket_public_access_block" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_ownership_controls" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
rule {
object_ownership = "BucketOwnerEnforced"
}
}
resource "aws_s3_bucket_lifecycle_configuration" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
rule {
id = "expire-noncurrent-packages"
status = "Enabled"
filter {}
noncurrent_version_expiration {
noncurrent_days = 30
}
}
depends_on = [aws_s3_bucket_versioning.artifacts]
}