diff --git a/README.md b/README.md index 462aeac..e01d78d 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,23 @@ Just change: - S3 bucket is private by default - CloudFront serves as the only public entry point - IAM follows least privilege principle +- In in _main.tf_ file inside _terraform/bootstrap_, + +``` +lifecycle { + prevent_destroy = false + } +``` + +is set to _false_ for easy clean-up. In real production environments, I would set _prevent_destroy_ as _true_. This protects the remote state bucket from accidental data loss. + +In addition, + +``` +force_destroy = true +``` + +should be deleted or set as _false_ in real production environments. --- @@ -406,6 +423,7 @@ Writing reusable setup instructions and architecture explanations can improve: - Add custom domain + Route53 automation - ACM SSL certificate provisioning +- Integrate terraform into CI/CD pipeline - Automated performance testing in CI --- diff --git a/terraform/bootstrap/main.tf b/terraform/bootstrap/main.tf index 429a7c4..9f4d48d 100644 --- a/terraform/bootstrap/main.tf +++ b/terraform/bootstrap/main.tf @@ -35,9 +35,11 @@ resource "aws_s3_bucket" "terraform_state" { bucket = "${var.project_name}-${var.backend_bucket_name}-${random_id.suffix.hex}" lifecycle { - prevent_destroy = true + prevent_destroy = false } + force_destroy = true + tags = { Name = "${var.project_name}-terraform-backend" Environment = "Shared" diff --git a/terraform/bootstrap/variables.tf b/terraform/bootstrap/variables.tf index afc7c0f..723768e 100644 --- a/terraform/bootstrap/variables.tf +++ b/terraform/bootstrap/variables.tf @@ -16,4 +16,4 @@ variable "project_name" { variable "s3_encryption_algorithm" { description = "Encryption algorithm for S3 buckets" type = string -} \ No newline at end of file +} diff --git a/terraform/environments/staging/.terraform.lock.hcl b/terraform/environments/staging/.terraform.lock.hcl new file mode 100644 index 0000000..92a2bcc --- /dev/null +++ b/terraform/environments/staging/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "5.100.0" + constraints = "~> 5.0" + hashes = [ + "h1:H3mU/7URhP0uCRGK8jeQRKxx2XFzEqLiOq/L2Bbiaxs=", + "zh:054b8dd49f0549c9a7cc27d159e45327b7b65cf404da5e5a20da154b90b8a644", + "zh:0b97bf8d5e03d15d83cc40b0530a1f84b459354939ba6f135a0086c20ebbe6b2", + "zh:1589a2266af699cbd5d80737a0fe02e54ec9cf2ca54e7e00ac51c7359056f274", + "zh:6330766f1d85f01ae6ea90d1b214b8b74cc8c1badc4696b165b36ddd4cc15f7b", + "zh:7c8c2e30d8e55291b86fcb64bdf6c25489d538688545eb48fd74ad622e5d3862", + "zh:99b1003bd9bd32ee323544da897148f46a527f622dc3971af63ea3e251596342", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:9f8b909d3ec50ade83c8062290378b1ec553edef6a447c56dadc01a99f4eaa93", + "zh:aaef921ff9aabaf8b1869a86d692ebd24fbd4e12c21205034bb679b9caf883a2", + "zh:ac882313207aba00dd5a76dbd572a0ddc818bb9cbf5c9d61b28fe30efaec951e", + "zh:bb64e8aff37becab373a1a0cc1080990785304141af42ed6aa3dd4913b000421", + "zh:dfe495f6621df5540d9c92ad40b8067376350b005c637ea6efac5dc15028add4", + "zh:f0ddf0eaf052766cfe09dea8200a946519f653c384ab4336e2a4a64fdd6310e9", + "zh:f1b7e684f4c7ae1eed272b6de7d2049bb87a0275cb04dbb7cda6636f600699c9", + "zh:ff461571e3f233699bf690db319dfe46aec75e58726636a0d97dd9ac6e32fb70", + ] +} diff --git a/terraform/modules/s3-static-site/main.tf b/terraform/modules/s3-static-site/main.tf index cfcb502..191f05c 100644 --- a/terraform/modules/s3-static-site/main.tf +++ b/terraform/modules/s3-static-site/main.tf @@ -1,6 +1,8 @@ resource "aws_s3_bucket" "site_bucket" { bucket = var.bucket_name + force_destroy = true + tags = { Name = var.bucket_name Environment = var.environment