| --- |
| page_title: Resource Lifecycle |
| description: >- |
| Resources have a strict lifecycle, and can be thought of as basic state |
| machines. Understanding this lifecycle can help better understand how |
| Terraform generates an execution plan, how it safely executes that plan, and |
| what the resource provider is doing throughout all of this. |
| --- |
| |
| # Resource Lifecycle |
| |
| Resources have a strict lifecycle, and can be thought of as basic |
| state machines. Understanding this lifecycle can help better understand |
| how Terraform generates an execution plan, how it safely executes that |
| plan, and what the resource provider is doing throughout all of this. |
| |
| ~> **Advanced Topic!** This page covers technical details |
| of Terraform. You don't need to understand these details to |
| effectively use Terraform. The details are documented here for |
| those who wish to learn about them without having to go |
| spelunking through the source code. |
| |
| ## Lifecycle |
| |
| A resource roughly follows the steps below: |
| |
| 1. `ValidateResource` is called to do a high-level structural |
| validation of a resource's configuration. The configuration |
| at this point is raw and the interpolations have not been processed. |
| The value of any key is not guaranteed and is just meant to be |
| a quick structural check. |
| |
| 1. `Diff` is called with the current state and the configuration. |
| The resource provider inspects this and returns a diff, outlining |
| all the changes that need to occur to the resource. The diff includes |
| details such as whether or not the resource is being destroyed, what |
| attribute necessitates the destroy, old values and new values, whether |
| a value is computed, etc. It is up to the resource provider to |
| have this knowledge. |
| |
| 1. `Apply` is called with the current state and the diff. Apply does |
| not have access to the configuration. This is a safety mechanism |
| that limits the possibility that a provider changes a diff on the |
| fly. `Apply` must apply a diff as prescribed and do nothing else |
| to remain true to the Terraform execution plan. Apply returns the |
| new state of the resource (or nil if the resource was destroyed). |
| |
| 1. If a resource was just created and did not exist before, and the |
| apply succeeded without error, then the provisioners are executed |
| in sequence. If any provisioner errors, the resource is marked as |
| _tainted_, so that it will be destroyed on the next apply. |
| |
| ## Partial State and Error Handling |
| |
| If an error happens at any stage in the lifecycle of a resource, |
| Terraform stores a partial state of the resource. This behavior is |
| critical for Terraform to ensure that you don't end up with any |
| _zombie_ resources: resources that were created by Terraform but |
| no longer managed by Terraform due to a loss of state. |