github.com/armen/terraform@v0.5.2-0.20150529052519-caa8117a08f1/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-123456" 29 instance_type = "m1.small" 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 ------------- 72 73 Within a resource, you can optionally have a **connection block**. 74 Connection blocks describe to Terraform how to connect to the 75 resource for 76 [provisioning](/docs/provisioners/index.html). This block doesn't 77 need to be present if you're using only local provisioners, or 78 if you're not provisioning at all. 79 80 Resources provide some data on their own, such as an IP address, 81 but other data must be specified by the user. 82 83 The full list of settings that can be specified are listed on 84 the [provisioner connection page](/docs/provisioners/connection.html). 85 86 ------------- 87 88 Within a resource, you can specify zero or more **provisioner 89 blocks**. Provisioner blocks configure 90 [provisioners](/docs/provisioners/index.html). 91 92 Within the provisioner block is provisioner-specific configuration, 93 much like resource-specific configuration. 94 95 Provisioner blocks can also contain a connection block 96 (documented above). This connection block can be used to 97 provide more specific connection info for a specific provisioner. 98 An example use case might be to use a different user to log in 99 for a single provisioner. 100 101 <a id="using-variables-with-count"></a> 102 103 ## Using Variables With `count` 104 105 When declaring multiple instances of a resource using [`count`](#count), it is 106 common to want each instance to have a different value for a given attribute. 107 108 You can use the `${count.index}` 109 [interpolation](/docs/configuration/interpolation.html) along with a mapping [variable](/docs/configuration/variables.html) to accomplish this. 110 111 For example, here's how you could create three [AWS Instances](/docs/providers/aws/r/instance.html) each with their own static IP 112 address: 113 114 ``` 115 variable "instance_ips" { 116 default = { 117 "0" = "10.11.12.100" 118 "1" = "10.11.12.101" 119 "2" = "10.11.12.102" 120 } 121 } 122 123 resource "aws_instance" "app" { 124 count = "3" 125 private_ip = "${lookup(var.instance_ips, count.index)}" 126 # ... 127 } 128 ``` 129 130 ## Multiple Provider Instances 131 132 By default, a resource targets the resource based on its type. For example 133 an `aws_instance` resource will target the "aws" provider. As of Terraform 134 0.5.0, a resource can target any provider by name. 135 136 The primary use case for this is to target a specific configuration of 137 a provider that is configured multiple times to support multiple regions, etc. 138 139 To target another provider, set the `provider` field: 140 141 ``` 142 resource "aws_instance" "foo" { 143 provider = "aws.west" 144 145 # ... 146 } 147 ``` 148 149 The value of the field should be `TYPE` or `TYPE.ALIAS`. The `ALIAS` value 150 comes from the `alias` field value when configuring the 151 [provider](/docs/configuration/providers.html). 152 153 If no `provider` field is specified, the default (provider with no alias) 154 provider is used. 155 156 ## Syntax 157 158 The full syntax is: 159 160 ``` 161 resource TYPE NAME { 162 CONFIG ... 163 [count = COUNT] 164 [depends_on = [RESOURCE NAME, ...]] 165 [provider = PROVIDER] 166 167 [LIFECYCLE] 168 169 [CONNECTION] 170 [PROVISIONER ...] 171 } 172 ``` 173 174 where `CONFIG` is: 175 176 ``` 177 KEY = VALUE 178 179 KEY { 180 CONFIG 181 } 182 ``` 183 184 where `LIFECYCLE` is: 185 186 ``` 187 lifecycle { 188 [create_before_destroy = true|false] 189 } 190 ``` 191 192 where `CONNECTION` is: 193 194 ``` 195 connection { 196 KEY = VALUE 197 ... 198 } 199 ``` 200 201 where `PROVISIONER` is: 202 203 ``` 204 provisioner NAME { 205 CONFIG ... 206 207 [CONNECTION] 208 } 209 ```