5 Best Practices to Control Terraform Destroy and Prevent Accidental Infrastructure Deletion

Rhegisan Jebas
3 min readMar 9, 2023
Terraform destroy command!

Terraform is a popular infrastructure-as-code tool used to provision and manage cloud infrastructure. It provides a powerful way to create and manage resources in a declarative way. However, Terraform is also a double-edged sword that can cause significant damage if not used properly. One of the most dangerous Terraform commands is terraform destroy, which deletes all the resources created by Terraform. If executed accidentally, it can cause data loss and system downtime, leading to costly outages. In this blog, we will discuss some best practices to control Terraform destroy and prevent accidental infrastructure deletion.

1. USE TERRAFORM WORKSPACES

Terraform workspaces enable you to have multiple instances of your infrastructure. This way, you can isolate and manage different environments, such as development, staging, and production. Each workspace has its own state file, which tracks the resources created by Terraform. By using workspaces, you can prevent accidental deletion of resources in a specific environment. For example, if you’re working on the production environment, you can switch to the production workspace and then execute terraform destroy only for that environment.

2. DO NOT SKIP TERRAFORM PLANNING STEP

Before running the terraform destroy command, it’s essential to have a clear understanding of the resources that will be destroyed. Review the Terraform plan to confirm that you’re only destroying the resources you intend to delete. You can use the terraform plan command to see the resources that will be created, updated, or destroyed. This step helps prevent unintended deletion of resources and ensures that you’re aware of the changes that will be made.

3. MAKE USE OF -target OPTION

If you only want to destroy a specific resource or set of resources, use the -target option to specify them. This will limit the scope of the destroy operation to only the targeted resources, reducing the risk of accidental deletion. You can use the -target option with the terraform destroy command to specify the resources you want to delete. For example, terraform destroy -target=aws_instance.example will only delete the aws_instance.example resource.

4. ENABLE STATE FILE BACKUPS

Ensure that you have state file backups enabled to protect against data loss in case of accidental deletion. The Terraform state file contains the current state of your infrastructure, and losing it can result in data loss and downtime. State file backups allow you to quickly recover from a disaster by restoring a previous version of the state file. You can configure a backend that supports backups, such as Amazon S3 or Google Cloud Storage, and enable versioning for the backup bucket.

5. LIMIT USER ACCESS

Limit access to the terraform destroy command to only those who need it and ensure that they understand the risks involved. Restricting access to destructive actions helps prevent accidental deletion of critical resources and reduces the risk of data loss. By limiting user access, you can ensure that only authorized users can perform destructive actions and that they’re aware of the risks involved.

In conclusion, the terraform destroy command is a powerful tool that should be used with caution. By taking these precautions, you can control Terraform destroy and prevent costly infrastructure outages. These best practices can help you ensure the reliability, security, and stability of your infrastructure.

Thanks for reading! I hope you found it helpful and informative.

If you have any questions or comments, please don’t hesitate to leave them in the comments section below. I’ll do my best to respond to each one.

If you’d like to stay up to date on my latest automation-related content, be sure to follow me on LinkedIn. I’d love to connect with you and hear your thoughts on automation in the workplace.

--

--

Rhegisan Jebas

Passionate DevOps engineer sharing insights on building high-quality software through automation, containerization, and continuous delivery.