DevOps
Terraform Safety - Keep Resources Safe from Accidental Deletion
Learn how to protect Terraform resources from accidental deletion using lifecycle.prevent_destroy and enable_deletion_protection. A must-read guide for DevOps engineers who value safe and stable infrastructure.
Introduction
As DevOps engineers, we’ve all had that heart-stopping moment when Terraform unexpectedly wipes out a piece of infrastructure we spent hours fine-tuning. It’s like watching a helpful robot knock over the entire Jenga tower, Terraform not at fault but without caution, its actions might become destructive.
Luckily, Terraform equips us with some solid defenses like lifecycle.prevent_destroy and enable_deletion_protection to help us keep our infrastructure safe from accidental mistakes, surprise recreations, or unintended changes.
Two Solid Ways to Protect Terraform Resources
Lifecycle with prevent_destroy
Within a lifecycle block, setting prevent_destroy = true tells Terraform to flat-out refuse to delete the resource. It’s Terraform’s way of politely saying, “Nope, at this time!”.
Best For: Protecting critical resources like databases or stateful resources where accidental deletion could cause catastrophic data loss.
Usage:
resource "aws_instance" "example" { ami = "ami-12345678" instance_type = "t2.micro" lifecycle { prevent_destroy = true }}
Suggestion:
Combine it with other lifecycle controls like ignore_changes and create_before_destroy for tighter safety.
-
ignore_changes: Helps Terraform “look away” from changes it shouldn’t react to. -
create_before_destroy: Makes Terraform build a new house before tearing down the old one.
Cloud Provider Specific: enable_deletion_protection
This setting leverages built-in deletion protection offered by various cloud providers - AWS, Azure, GCP - like AWS’s RDS and EC2, or Google’s Cloud SQL. Think of it as Terraform delegating protection duties directly to the cloud - smart move!
Best For: Resources directly supported by cloud provider’s API for deletion protection. It gives us an extra layer of defense at the cloud provider level.
Usage:
resource "aws_db_instance" "example" { engine = "mysql" instance_class = "db.t2.micro" allocated_storage = 20 storage_type = "gp2" engine_version = "5.7" name = "mydb" enable_deletion_protection = true}
Quick Recommendations
-
lifecycle.prevent_destroy: Our go-to for protecting irreplaceable infrastructure. -
enable_deletion_protection: Use where supported to add cloud-level defense.
Terraform is powerful - We need to just make sure it doesn’t “helpfully” clean up more than what’s needed! Let’s keep our infrastructure safe and our sanity intact.
Happy Terraforming!