github.com/mapuri/terraform@v0.7.6-0.20161012203214-7e0408293f97/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 There are **meta-parameters** available to all resources: 45 46 * `count` (int) - The number of identical resources to create. 47 This doesn't apply to all resources. For details on using variables in 48 conjunction with count, see [Using Variables with 49 `count`](#using-variables-with-count) below. 50 51 * `depends_on` (list of strings) - Explicit dependencies that this 52 resource has. These dependencies will be created before this 53 resource. The dependencies are in the format of `TYPE.NAME`, 54 for example `aws_instance.web`. 55 56 * `lifecycle` (configuration block) - Customizes the lifecycle 57 behavior of the resource. The specific options are documented 58 below. 59 60 The `lifecycle` block allows the following keys to be set: 61 62 * `create_before_destroy` (bool) - This flag is used to ensure 63 the replacement of a resource is created before the original 64 instance is destroyed. As an example, this can be used to 65 create an new DNS record before removing an old record. 66 67 * `prevent_destroy` (bool) - This flag provides extra protection against the 68 destruction of a given resource. When this is set to `true`, any plan 69 that includes a destroy of this resource will return an error message. 70 71 <a id="ignore-changes"></a> 72 73 * `ignore_changes` (list of strings) - Customizes how diffs are evaluated for 74 resources, allowing individual attributes to be ignored through changes. 75 As an example, this can be used to ignore dynamic changes to the 76 resource from external resources. Other meta-parameters cannot be ignored. 77 78 ~> **NOTE on create\_before\_destroy and dependencies:** Resources that utilize 79 the `create_before_destroy` key can only depend on other resources that also 80 include `create_before_destroy`. Referencing a resource that does not include 81 `create_before_destroy` will result in a dependency graph cycle. 82 83 ~> **NOTE on ignore\_changes:** Ignored attribute names can be matched by their 84 name, not state ID. For example, if an `aws_route_table` has two routes defined 85 and the `ignore_changes` list contains "route", both routes will be ignored. 86 Additionally you can also use a single entry with a wildcard (e.g. `"*"`) 87 which will match all attribute names. Using a partial string together with a 88 wildcard (e.g. `"rout*"`) is **not** supported. 89 90 91 ------------- 92 93 Within a resource, you can optionally have a **connection block**. 94 Connection blocks describe to Terraform how to connect to the 95 resource for 96 [provisioning](/docs/provisioners/index.html). This block doesn't 97 need to be present if you're using only local provisioners, or 98 if you're not provisioning at all. 99 100 Resources provide some data on their own, such as an IP address, 101 but other data must be specified by the user. 102 103 The full list of settings that can be specified are listed on 104 the [provisioner connection page](/docs/provisioners/connection.html). 105 106 ------------- 107 108 Within a resource, you can specify zero or more **provisioner 109 blocks**. Provisioner blocks configure 110 [provisioners](/docs/provisioners/index.html). 111 112 Within the provisioner block is provisioner-specific configuration, 113 much like resource-specific configuration. 114 115 Provisioner blocks can also contain a connection block 116 (documented above). This connection block can be used to 117 provide more specific connection info for a specific provisioner. 118 An example use case might be to use a different user to log in 119 for a single provisioner. 120 121 <a id="using-variables-with-count"></a> 122 123 ## Using Variables With `count` 124 125 When declaring multiple instances of a resource using [`count`](#count), it is 126 common to want each instance to have a different value for a given attribute. 127 128 You can use the `${count.index}` 129 [interpolation](/docs/configuration/interpolation.html) along with a map 130 [variable](/docs/configuration/variables.html) to accomplish this. 131 132 For example, here's how you could create three [AWS Instances](/docs/providers/aws/r/instance.html) each with their own static IP 133 address: 134 135 ``` 136 variable "instance_ips" { 137 default = { 138 "0" = "10.11.12.100" 139 "1" = "10.11.12.101" 140 "2" = "10.11.12.102" 141 } 142 } 143 144 resource "aws_instance" "app" { 145 count = "3" 146 private_ip = "${lookup(var.instance_ips, count.index)}" 147 # ... 148 } 149 ``` 150 151 ## Multiple Provider Instances 152 153 By default, a resource targets the provider based on its type. For example 154 an `aws_instance` resource will target the "aws" provider. As of Terraform 155 0.5.0, a resource can target any provider by name. 156 157 The primary use case for this is to target a specific configuration of 158 a provider that is configured multiple times to support multiple regions, etc. 159 160 To target another provider, set the `provider` field: 161 162 ``` 163 resource "aws_instance" "foo" { 164 provider = "aws.west" 165 166 # ... 167 } 168 ``` 169 170 The value of the field should be `TYPE` or `TYPE.ALIAS`. The `ALIAS` value 171 comes from the `alias` field value when configuring the 172 [provider](/docs/configuration/providers.html). 173 174 If no `provider` field is specified, the default (provider with no alias) 175 provider is used. 176 177 ## Syntax 178 179 The full syntax is: 180 181 ``` 182 resource TYPE NAME { 183 CONFIG ... 184 [count = COUNT] 185 [depends_on = [RESOURCE NAME, ...]] 186 [provider = PROVIDER] 187 188 [LIFECYCLE] 189 190 [CONNECTION] 191 [PROVISIONER ...] 192 } 193 ``` 194 195 where `CONFIG` is: 196 197 ``` 198 KEY = VALUE 199 200 KEY { 201 CONFIG 202 } 203 ``` 204 205 where `LIFECYCLE` is: 206 207 ``` 208 lifecycle { 209 [create_before_destroy = true|false] 210 [prevent_destroy = true|false] 211 [ignore_changes = [ATTRIBUTE NAME, ...]] 212 } 213 ``` 214 215 where `CONNECTION` is: 216 217 ``` 218 connection { 219 KEY = VALUE 220 ... 221 } 222 ``` 223 224 where `PROVISIONER` is: 225 226 ``` 227 provisioner NAME { 228 CONFIG ... 229 230 [CONNECTION] 231 } 232 ```