| --- |
| page_title: Recreate resources |
| description: The -replace flag and taint command help you replace infrastructure objects. Learn how the -replace flag and taint command can help you recreate resources. |
| --- |
| |
| # Recreate resources overview |
| |
| This topic provides an overview of how to recreate resources in Terraform. |
| |
| ## Introduction |
| |
| By default, Terraform retrieves the latest state of each existing object and compares it with the current configuration when you run the `terraform apply` command. Terraform only takes action on objects that do not match the configuration. |
| |
| When remote objects become damaged or degraded, such as when software |
| running inside a virtual machine crashes but the virtual machine is |
| still running, Terraform does not have no way to detect and respond |
| to the problem. This is because Terraform only directly manages the machine as a whole. |
| |
| In some cases, Terraform can automatically infer that an object is in an |
| incomplete or degraded state. For example, when a complex object is partially created in the remote system or |
| when a provisioner step failed. When this occurs, Terraform automatically flags resources to recreate. |
| |
| You can manually replace objects when Terraform is unable to infer that an object should be replaced. |
| |
| ## Workflows |
| |
| When you meed to replace an object, you can use the following methods. |
| |
| ### Manually replace resources |
| |
| Add the [`-replace` flag](/terraform/cli/commands/plan#replace-address) |
| to your `terraform plan` or `terraform apply` command: |
| |
| ```shellsession |
| $ terraform apply -replace="aws_instance.example" |
| # ... |
| |
| # aws_instance.example will be replaced, as requested |
| -/+ resource "aws_instance" "example" { |
| # ... |
| } |
| ``` |
| |
| ### Replace resource in `tainted` state |
| |
| Terraform applies the `tainted` status to objects in the state data when Terraform is able to infer that the object is in a degraded or damaged state. This status indicates that the object exists but may not be fully-functional. Terraform replaces objects in a `tainted` states during the next `plan` or `apply` operation. |
| |
| ``` |
| # 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](/terraform/cli/commands/untaint), |
| after which Terraform will consider the object to be ready for use by any |
| downstream resource declarations. |
| |
| You can force Terraform to mark a particular object as tainted using |
| [the `terraform taint` command](/terraform/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. |