github.com/loicalbertin/terraform@v0.6.15-0.20170626182346-8e2583055467/website/docs/state/purpose.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "State" 4 sidebar_current: "docs-state-purpose" 5 description: |- 6 Terraform must store state about your managed infrastructure and configuration. This state is used by Terraform to map real world resources to your configuration, keep track of metadata, and to improve performance for large infrastructures. 7 --- 8 9 # Purpose of Terraform State 10 11 State is a necessary requirement for Terraform to function. It is often 12 asked if it is possible for Terraform to work without state, or for Terraform 13 to not use state and just inspect cloud resources on every run. This page 14 will help explain why Terraform state is required. 15 16 As you'll see from the reasons below, state is required. And in the scenarios 17 where Terraform may be able to get away without state, doing so would require 18 shifting massive amounts of complexity from one place (state) to another place 19 (the replacement concept). 20 21 ## Mapping to the Real World 22 23 Terraform requires some sort of database to map Terraform config to the real 24 world. When you have a resource `resource "aws_instance" "foo"` in your 25 configuration, Terraform uses this map to know that instance `i-abcd1234` 26 is that resource. 27 28 For some providers like AWS, Terraform could theoretically use something like 29 AWS tags. Early prototypes of Terraform actually had no state files and used 30 this method. However, we quickly ran into problems. The first major issue was 31 a simple one: not all resources support tags, and not all cloud providers 32 support tags. 33 34 Therefore, for mapping configuration to resources in the real world, 35 Terraform requires states. 36 37 ## Metadata 38 39 Terraform needs to store more than just resource mappings. Terraform 40 must keep track of metadata such as dependencies. 41 42 Terraform typically uses the configuration to determine dependency order. 43 However, when you delete a resource from a Terraform configuration, Terraform 44 must know how to delete that resource. Terraform can see that a mapping exists 45 for a resource not in your configuration and plan to destroy. However, since 46 the configuration no longer exists, it no longer knows the proper destruction 47 order. 48 49 To work around this, Terraform stores the creation-time dependencies within 50 the state. Now, when you delete one or more items from the configuration, 51 Terraform can still build the correct destruction ordering based only 52 on the state. 53 54 One idea to avoid this is for Terraform to understand the proper ordering 55 of resources. For example, Terraform could know that servers must be deleted 56 before the subnets they are a part of. The complexity for this approach 57 quickly explodes, however: in addition to Terraform having to understand the 58 ordering semantics of every resource for every cloud, Terraform must also 59 understand the ordering _across providers_. 60 61 In addition to dependencies, Terraform will store more metadata in the 62 future such as last run time, creation time, update time, lifecycle options 63 such as prevent destroy, etc. 64 65 ## Performance 66 67 In addition to basic mapping, Terraform stores a cache of the attribute 68 values for all resources in the state. This is the most optional feature of 69 Terraform state and is done only as a performance improvement. 70 71 When running a `terraform plan`, Terraform must know the current state of 72 resources in order to effectively determine the changes that it needs to make 73 to reach your desired configuration. 74 75 For small infrastructures, Terraform can query your providers and sync the 76 latest attributes from all your resources. This is the default behavior 77 of Terraform: for every plan and apply, Terraform will sync all resources in 78 your state. 79 80 For larger infrastructures, querying every resource is too slow. Many cloud 81 providers do not provide APIs to query multiple resources at once, and the 82 round trip time for each resource is hundreds of milliseconds. On top of this, 83 cloud providers almost always have API rate limiting so Terraform can only 84 request a certain number of resources in a period of time. Larger users 85 of Terraform make heavy use of the `-refresh=false` flag as well as the 86 `-target` flag in order to work around this. In these scenarios, the cached 87 state is treated as the record of truth. 88 89 ## Syncing 90 91 The primary motivation people have for using remote state files is in an attempt 92 to improve using Terraform with teams. State files can easily result in 93 conflicts when two people modify infrastructure at the same time. 94 95 [Remote state](/docs/state/remote.html) is the recommended solution 96 to this problem. At the time of writing, remote state works well but there 97 are still scenarios that can result in state conflicts. A priority for future 98 versions of Terraform is to improve this.