| --- |
| page_title: Forcing Re-creation of Resources - Terraform CLI |
| description: Commands that allow you to destroy and re-create resources manually. |
| --- |
| |
| # Forcing Re-creation of Resources |
| |
| During planning, by default Terraform retrieves the latest state of each |
| existing object and compares it with the current configuration, planning |
| actions only against objects whose current state does not match the |
| configuration. |
| |
| However, in some cases a remote object may become damaged or degraded in a |
| way that Terraform cannot automatically detect. For example, if software |
| running inside a virtual machine crashes but the virtual machine itself is |
| still running then Terraform will typically have no way to detect and respond |
| to the problem, because Terraform only directly manages the machine as a whole. |
| |
| If you know that an object is damaged, or if you want to force Terraform to |
| replace it for any other reason, you can override Terraform's default behavior |
| using [the `-replace=...` planning option](/cli/commands/plan#replace-address) |
| when you run either `terraform plan` or `terraform apply`: |
| |
| ```shellsession |
| $ terraform apply -replace=aws_instance.example |
| # ... |
| |
| # aws_instance.example will be replaced, as requested |
| -/+ resource "aws_instance" "example" { |
| # ... |
| } |
| ``` |
| |
| ## The "tainted" status |
| |
| Sometimes Terraform is able to infer automatically that an object is in an |
| incomplete or degraded state. For example, if creation of a complex object |
| fails in such a way that parts of it already exist in the remote system, or |
| if object creation succeeded but a provisioner step subsequently failed, |
| Terraform must remember that the object exists but may not be fully-functional. |
| |
| Terraform represents this situation by marking an object in the state as |
| "tainted". When an object is marked with this status, the next plan will force |
| replacing that object in a similar way to if you had specified that object's |
| address using `-replace=...` as described above. |
| |
| ``` |
| # aws_instance.example is tainted, so must be replaced |
| -/+ resource "aws_instance" "example" { |
| # ... |
| } |
| ``` |
| |
| If Terraform has marked an object as tainted but you consider it to be working |
| correctly and do not want to replace it, you can override Terraform's |
| determination using [the `terraform untaint` command](/cli/commands/untaint), |
| after which Terraform will consider the object to be ready for use by any |
| downstream resource declarations. |
| |
| You can also _force_ Terraform to mark a particular object as tainted using |
| [the `terraform taint` command](/cli/commands/taint), but that approach is |
| deprecated in favor of the `-replace=...` option, which avoids the need to |
| create an interim state snapshot with a tainted object. |