github.com/rhenning/terraform@v0.8.0-beta2/website/source/docs/configuration/resources.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "Configuring Resources" 4 sidebar_current: "docs-config-resources" 5 description: |- 6 The most important thing you'll configure with Terraform are resources. Resources are a component of your infrastructure. It might be some low level component such as a physical server, virtual machine, or container. Or it can be a higher level component such as an email provider, DNS record, or database provider. 7 --- 8 9 # Resource Configuration 10 11 The most important thing you'll configure with Terraform are 12 resources. Resources are a component of your infrastructure. 13 It might be some low level component such as a physical server, 14 virtual machine, or container. Or it can be a higher level 15 component such as an email provider, DNS record, or database 16 provider. 17 18 This page assumes you're familiar with the 19 [configuration syntax](/docs/configuration/syntax.html) 20 already. 21 22 ## Example 23 24 A resource configuration looks like the following: 25 26 ``` 27 resource "aws_instance" "web" { 28 ami = "ami-408c7f28" 29 instance_type = "t1.micro" 30 } 31 ``` 32 33 ## Description 34 35 The `resource` block creates a resource of the given `TYPE` (first 36 parameter) and `NAME` (second parameter). The combination of the type 37 and name must be unique. 38 39 Within the block (the `{ }`) is configuration for the resource. The 40 configuration is dependent on the type, and is documented for each 41 resource type in the 42 [providers section](/docs/providers/index.html). 43 44 <a id="meta-parameters"></a> 45 ### Meta-parameters 46 47 There are **meta-parameters** available to all resources: 48 49 * `count` (int) - The number of identical resources to create. 50 This doesn't apply to all resources. For details on using variables in 51 conjunction with count, see [Using Variables with 52 `count`](#using-variables-with-count) below. 53 54 * `depends_on` (list of strings) - Explicit dependencies that this 55 resource has. These dependencies will be created before this 56 resource. For syntax and other details, see the section below on 57 [explicit dependencies](#explicit-dependencies). 58 59 * `provider` (string) - The name of a specific provider to use for 60 this resource. The name is in the format of `TYPE.ALIAS`, for example, 61 `aws.west`. Where `west` is set using the `alias` attribute in a 62 provider. See [multiple provider instances](#multi-provider-instances). 63 64 * `lifecycle` (configuration block) - Customizes the lifecycle 65 behavior of the resource. The specific options are documented 66 below. 67 68 The `lifecycle` block allows the following keys to be set: 69 70 * `create_before_destroy` (bool) - This flag is used to ensure 71 the replacement of a resource is created before the original 72 instance is destroyed. As an example, this can be used to 73 create an new DNS record before removing an old record. 74 75 * `prevent_destroy` (bool) - This flag provides extra protection against the 76 destruction of a given resource. When this is set to `true`, any plan 77 that includes a destroy of this resource will return an error message. 78 79 <a id="ignore-changes"></a> 80 81 * `ignore_changes` (list of strings) - Customizes how diffs are evaluated for 82 resources, allowing individual attributes to be ignored through changes. 83 As an example, this can be used to ignore dynamic changes to the 84 resource from external resources. Other meta-parameters cannot be ignored. 85 86 ~> **NOTE on create\_before\_destroy and dependencies:** Resources that utilize 87 the `create_before_destroy` key can only depend on other resources that also 88 include `create_before_destroy`. Referencing a resource that does not include 89 `create_before_destroy` will result in a dependency graph cycle. 90 91 ~> **NOTE on ignore\_changes:** Ignored attribute names can be matched by their 92 name, not state ID. For example, if an `aws_route_table` has two routes defined 93 and the `ignore_changes` list contains "route", both routes will be ignored. 94 Additionally you can also use a single entry with a wildcard (e.g. `"*"`) 95 which will match all attribute names. Using a partial string together with a 96 wildcard (e.g. `"rout*"`) is **not** supported. 97 98 <a id="explicit-dependencies"></a> 99 100 ### Explicit Dependencies 101 102 Terraform ensures that dependencies are successfully created before a 103 resource is created. During a destroy operation, Terraform ensures that 104 this resource is destroyed before its dependencies. 105 106 A resource automatically depends on anything it references via 107 [interpolations](/docs/configuration/interpolation.html). The automatically 108 determined dependencies are all that is needed most of the time. You can also 109 use the `depends_on` parameter to explicitly define a list of additional 110 dependencies. 111 112 The primary use case of explicit `depends_on` is to depend on a _side effect_ 113 of another operation. For example: if a provisioner creates a file, and your 114 resource reads that file, then there is no interpolation reference for Terraform 115 to automatically connect the two resources. However, there is a causal 116 ordering that needs to be represented. This is an ideal case for `depends_on`. 117 In most cases, however, `depends_on` should be avoided and Terraform should 118 be allowed to determine dependencies automatically. 119 120 The syntax of `depends_on` is a list of resources and modules: 121 122 * Resources are `TYPE.NAME`, such as `aws_instance.web`. 123 * Modules are `module.NAME`, such as `module.foo`. 124 125 When a resource depends on a module, _everything_ in that module must be 126 created before the resource is created. 127 128 An example of a resource depending on both a module and resource is shown 129 below. Note that `depends_on` can contain any number of dependencies: 130 131 ``` 132 resource "aws_instance" "web" { 133 depends_on = ["aws_instance.leader", "module.vpc"] 134 } 135 ``` 136 137 -> **Use sparingly!** `depends_on` is rarely necessary. 138 In almost every case, Terraform's automatic dependency system is the best-case 139 scenario by having your resources depend only on what they explicitly use. 140 Please think carefully before you use `depends_on` to determine if Terraform 141 could automatically do this a better way. 142 143 <a id="connection-block"></a> 144 145 ### Connection block 146 147 Within a resource, you can optionally have a **connection block**. 148 Connection blocks describe to Terraform how to connect to the 149 resource for 150 [provisioning](/docs/provisioners/index.html). This block doesn't 151 need to be present if you're using only local provisioners, or 152 if you're not provisioning at all. 153 154 Resources provide some data on their own, such as an IP address, 155 but other data must be specified by the user. 156 157 The full list of settings that can be specified are listed on 158 the [provisioner connection page](/docs/provisioners/connection.html). 159 160 <a id="provisioners"></a> 161 162 ### Provisioners 163 164 Within a resource, you can specify zero or more **provisioner 165 blocks**. Provisioner blocks configure 166 [provisioners](/docs/provisioners/index.html). 167 168 Within the provisioner block is provisioner-specific configuration, 169 much like resource-specific configuration. 170 171 Provisioner blocks can also contain a connection block 172 (documented above). This connection block can be used to 173 provide more specific connection info for a specific provisioner. 174 An example use case might be to use a different user to log in 175 for a single provisioner. 176 177 <a id="using-variables-with-count"></a> 178 179 ## Using Variables With `count` 180 181 When declaring multiple instances of a resource using [`count`](#count), it is 182 common to want each instance to have a different value for a given attribute. 183 184 You can use the `${count.index}` 185 [interpolation](/docs/configuration/interpolation.html) along with a map 186 [variable](/docs/configuration/variables.html) to accomplish this. 187 188 For example, here's how you could create three [AWS 189 Instances](/docs/providers/aws/r/instance.html) each with their own 190 static IP address: 191 192 ``` 193 variable "instance_ips" { 194 default = { 195 "0" = "10.11.12.100" 196 "1" = "10.11.12.101" 197 "2" = "10.11.12.102" 198 } 199 } 200 201 resource "aws_instance" "app" { 202 count = "3" 203 private_ip = "${lookup(var.instance_ips, count.index)}" 204 # ... 205 } 206 ``` 207 208 <a id="multi-provider-instances"></a> 209 210 ## Multiple Provider Instances 211 212 By default, a resource targets the provider based on its type. For example 213 an `aws_instance` resource will target the "aws" provider. As of Terraform 214 0.5.0, a resource can target any provider by name. 215 216 The primary use case for this is to target a specific configuration of 217 a provider that is configured multiple times to support multiple regions, etc. 218 219 To target another provider, set the `provider` field: 220 221 ``` 222 resource "aws_instance" "foo" { 223 provider = "aws.west" 224 225 # ... 226 } 227 ``` 228 229 The value of the field should be `TYPE` or `TYPE.ALIAS`. The `ALIAS` value 230 comes from the `alias` field value when configuring the 231 [provider](/docs/configuration/providers.html). 232 233 ``` 234 provider "aws" { 235 alias = "west" 236 237 # ... 238 } 239 ``` 240 241 If no `provider` field is specified, the default provider is used. 242 243 ## Syntax 244 245 The full syntax is: 246 247 ``` 248 resource TYPE NAME { 249 CONFIG ... 250 [count = COUNT] 251 [depends_on = [NAME, ...]] 252 [provider = PROVIDER] 253 254 [LIFECYCLE] 255 256 [CONNECTION] 257 [PROVISIONER ...] 258 } 259 ``` 260 261 where `CONFIG` is: 262 263 ``` 264 KEY = VALUE 265 266 KEY { 267 CONFIG 268 } 269 ``` 270 271 where `LIFECYCLE` is: 272 273 ``` 274 lifecycle { 275 [create_before_destroy = true|false] 276 [prevent_destroy = true|false] 277 [ignore_changes = [ATTRIBUTE NAME, ...]] 278 } 279 ``` 280 281 where `CONNECTION` is: 282 283 ``` 284 connection { 285 KEY = VALUE 286 ... 287 } 288 ``` 289 290 where `PROVISIONER` is: 291 292 ``` 293 provisioner NAME { 294 CONFIG ... 295 296 [CONNECTION] 297 } 298 ```