# Thanks to https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa resource "aws_s3_bucket" "terraform_state" { bucket = "omnicognate-terraform-state" # Prevent accidental deletion of this S3 bucket lifecycle { prevent_destroy = true } tags = merge( { Name = "${var.resource_name_prefix}-aws_s3_bucket" }, var.common_tags, ) } resource "aws_s3_bucket_versioning" "enabled" { bucket = aws_s3_bucket.terraform_state.bucket versioning_configuration { status = "Enabled" mfa_delete = "Disabled" } } resource "aws_s3_bucket_server_side_encryption_configuration" "default" { bucket = aws_s3_bucket.terraform_state.bucket rule { apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } } resource "aws_s3_bucket_public_access_block" "public_access" { bucket = aws_s3_bucket.terraform_state.bucket block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # DynamoBD CMK resource "aws_kms_key" "dynamodb" { description = "DynamoDB Table Server side encryption" enable_key_rotation = true key_usage = "ENCRYPT_DECRYPT" } resource "aws_kms_alias" "dynamodb" { name = format("alias/%s-dynamodb-CMK", var.resource_name_prefix,) target_key_id = aws_kms_key.dynamodb.key_id } resource "aws_dynamodb_table" "terraform_locks" { name = "omnicognate-terraform-locks" billing_mode = "PAY_PER_REQUEST" hash_key = "LockID" depends_on = [ aws_s3_bucket_versioning.enabled ] attribute { name = "LockID" type = "S" } server_side_encryption { enabled = true kms_key_arn = aws_kms_key.dynamodb.arn } point_in_time_recovery { enabled = true } lifecycle { prevent_destroy = true } tags = merge( { Name = "${var.resource_name_prefix}-aws_dynamodb_table" }, var.common_tags, ) }