Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Rollback to Previous State in terraform

Tags:

terraform

I am working on terraform tasks and trying to understand how state files work. I have created main.tf file which has

vpc,firewall,subnet,compute_instance

which has to be create in GCP. So i have applied this to GCP environment and a file name terraform.tfstate file got created and i did backup of this file into folder called 1st-run.

Now i have updated my main.tf with

2vpc,2firewalls,2subnets,compute_instance

as i need to add another nic for my vm.Did terraform apply and environment got created and terraform.tfstate file got created. I did backup of this file into folder called 2nd-run.

I want to rollback the environment where i have executed for 1st-run. I have that state file which is in 1st-run folder.

What is the command to rollback by using statefile instead of touching the code so that automatically my GCP environment will have

vpc,firewall,subnet,compute_instance

which i have executed for the 1st time.

like image 574
Bhanu Avatar asked Sep 06 '19 11:09

Bhanu


People also ask

Does Terraform have rollback?

Terraform does not automatically rollback in the face of errors. Instead, your Terraform state file has been partially updated with any resources that successfully completed.

Does Terraform rollback on failure?

Terraform can't rollback after deployment. So, if an error appears in the deployment, the issue should be solved in that moment Also, is possible to destroy the deployment (terraform destroy), but it will destroy everything and not rollback the changes.

What if state file is lost in Terraform?

So if the state file gets lost, Terraform will think it never created those resources in the first place and will try to duplicate everything.

How do I undo Terraform destroy?

Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm.


2 Answers

There is no way to roll back to a previous state as described in a state file in Terraform today. Terraform always plans changes with the goal of moving from the prior state (the latest state snapshot) to the goal state represented by the configuration. Terraform also uses the configuration for information that is not tracked in the state, such as the provider configurations.

The usual way to represent "rolling back" in Terraform is to put your configuration in version control and commit before each change, and then you can use your version control system's features to revert to an older configuration if needed.

Not all changes can be rolled back purely by reverting a VCS change though. For example, if you added a new provider block and resources for that provider all in one commit and then applied the result, in order to roll back you'd need to change the configuration to still include the provider block but not include any of the resource blocks, so you'd need to adjust the configuration during the revert. Terraform will then use the remaining provider block to configure the provider to run the destroy actions, after which you can finally remove the provider block too.

like image 191
Martin Atkins Avatar answered Oct 22 '22 20:10

Martin Atkins


While there are commands to manipulate state, there is no command to rollback to the previous state, i.e. before the last terraform apply.

However, if you use a remote S3 backend with a dynamodb lock table, it is possible to roll back if versioning was enabled on the S3 bucket. For example, you could copy the previous version such that it becomes the latest version. You then must also update the digest in the dynamodb table, otherwise the terraform init will give you a message like:

Error refreshing state: state data in S3 does not have the expected content.

This may be caused by unusually long delays in S3 processing a previous state
update.  Please wait for a minute or two and try again. If this problem
persists, and neither S3 nor DynamoDB are experiencing an outage, you may need
to manually verify the remote state and update the Digest value stored in the
DynamoDB table to the following value: vvvvvvvvvvvvvv

You can just use this value to update the table and the rollback is done. To revert it, simply delete the last state from the S3 bucket so it goes back to its old "latest" and update the dynamodb table back to the corresponding digest.

Note that remote state is shared with your co-workers, so the above procedure should be avoided.

It's important to understand that changing the state files won't change the infrastructure by itself. That should be done by versioning the terraform code and doing terraform plan and terraform apply on the code that describes the desired infrastructure.

like image 30
Nagev Avatar answered Oct 22 '22 21:10

Nagev