github.com/loicalbertin/terraform@v0.6.15-0.20170626182346-8e2583055467/website/docs/internals/lifecycle.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "Resource Lifecycle" 4 sidebar_current: "docs-internals-lifecycle" 5 description: |- 6 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. 7 --- 8 9 # Resource Lifecycle 10 11 Resources have a strict lifecycle, and can be thought of as basic 12 state machines. Understanding this lifecycle can help better understand 13 how Terraform generates an execution plan, how it safely executes that 14 plan, and what the resource provider is doing throughout all of this. 15 16 ~> **Advanced Topic!** This page covers technical details 17 of Terraform. You don't need to understand these details to 18 effectively use Terraform. The details are documented here for 19 those who wish to learn about them without having to go 20 spelunking through the source code. 21 22 ## Lifecycle 23 24 A resource roughly follows the steps below: 25 26 1. `ValidateResource` is called to do a high-level structural 27 validation of a resource's configuration. The configuration 28 at this point is raw and the interpolations have not been processed. 29 The value of any key is not guaranteed and is just meant to be 30 a quick structural check. 31 32 1. `Diff` is called with the current state and the configuration. 33 The resource provider inspects this and returns a diff, outlining 34 all the changes that need to occur to the resource. The diff includes 35 details such as whether or not the resource is being destroyed, what 36 attribute necessitates the destroy, old values and new values, whether 37 a value is computed, etc. It is up to the resource provider to 38 have this knowledge. 39 40 1. `Apply` is called with the current state and the diff. Apply does 41 not have access to the configuration. This is a safety mechanism 42 that limits the possibility that a provider changes a diff on the 43 fly. `Apply` must apply a diff as prescribed and do nothing else 44 to remain true to the Terraform execution plan. Apply returns the 45 new state of the resource (or nil if the resource was destroyed). 46 47 1. If a resource was just created and did not exist before, and the 48 apply succeeded without error, then the provisioners are executed 49 in sequence. If any provisioner errors, the resource is marked as 50 _tainted_, so that it will be destroyed on the next apply. 51 52 ## Partial State and Error Handling 53 54 If an error happens at any stage in the lifecycle of a resource, 55 Terraform stores a partial state of the resource. This behavior is 56 critical for Terraform to ensure that you don't end up with any 57 _zombie_ resources: resources that were created by Terraform but 58 no longer managed by Terraform due to a loss of state.