github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/website/source/docs/configuration/interpolation.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "Interpolation Syntax" 4 sidebar_current: "docs-config-interpolation" 5 description: |- 6 Embedded within strings in Terraform, whether you're using the Terraform syntax or JSON syntax, you can interpolate other values into strings. These interpolations are wrapped in `${}`, such as `${var.foo}`. 7 --- 8 9 # Interpolation Syntax 10 11 Embedded within strings in Terraform, whether you're using the 12 Terraform syntax or JSON syntax, you can interpolate other values 13 into strings. These interpolations are wrapped in `${}`, such as 14 `${var.foo}`. 15 16 The interpolation syntax is powerful and allows you to reference 17 variables, attributes of resources, call functions, etc. 18 19 You can also perform simple math in interpolations, allowing 20 you to write expressions such as `${count.index + 1}`. 21 22 You can escape interpolation with double dollar signs: `$${foo}` 23 will be rendered as a literal `${foo}`. 24 25 ## Available Variables 26 27 **To reference user variables**, use the `var.` prefix followed by the 28 variable name. For example, `${var.foo}` will interpolate the 29 `foo` variable value. If the variable is a mapping, then you 30 can reference static keys in the map with the syntax 31 `var.MAP.KEY`. For example, `${var.amis.us-east-1}` would 32 get the value of the `us-east-1` key within the `amis` variable 33 that is a mapping. 34 35 **To reference attributes of your own resource**, the syntax is 36 `self.ATTRIBUTE`. For example `${self.private_ip_address}` will 37 interpolate that resource's private IP address. Note that this is 38 only allowed/valid within provisioners. 39 40 **To reference attributes of other resources**, the syntax is 41 `TYPE.NAME.ATTRIBUTE`. For example, `${aws_instance.web.id}` 42 will interpolate the ID attribute from the "aws\_instance" 43 resource named "web". If the resource has a `count` attribute set, 44 you can access individual attributes with a zero-based index, such 45 as `${aws_instance.web.0.id}`. You can also use the splat syntax 46 to get a list of all the attributes: `${aws_instance.web.*.id}`. 47 This is documented in more detail in the 48 [resource configuration page](/docs/configuration/resources.html). 49 50 **To reference outputs from a module**, the syntax is 51 `MODULE.NAME.OUTPUT`. For example `${module.foo.bar}` will 52 interpolate the "bar" output from the "foo" 53 [module](/docs/modules/index.html). 54 55 **To reference count information**, the syntax is `count.FIELD`. 56 For example, `${count.index}` will interpolate the current index 57 in a multi-count resource. For more information on count, see the 58 resource configuration page. 59 60 <a id="path-variables"></a> 61 62 **To reference path information**, the syntax is `path.TYPE`. 63 TYPE can be `cwd`, `module`, or `root`. `cwd` will interpolate the 64 cwd. `module` will interpolate the path to the current module. `root` 65 will interpolate the path of the root module. In general, you probably 66 want the `path.module` variable. 67 68 ## Built-in Functions 69 70 Terraform ships with built-in functions. Functions are called with 71 the syntax `name(arg, arg2, ...)`. For example, 72 to read a file: `${file("path.txt")}`. The built-in functions 73 are documented below. 74 75 The supported built-in functions are: 76 77 * `base64decode(string)` - Given a base64-encoded string, decodes it and 78 returns the original string. 79 80 * `base64encode(string)` - Returns a base64-encoded representation of the 81 given string. 82 83 * `sha1(string)` - Returns a SHA-1 hash representation of the 84 given string. 85 Example: `"${sha1(concat(aws_vpc.default.tags.customer, "-s3-bucket"))}"` 86 87 * `sha256(string)` - Returns a SHA-256 hash representation of the 88 given string. 89 Example: `"${sha256(concat(aws_vpc.default.tags.customer, "-s3-bucket"))}"` 90 91 * `cidrhost(iprange, hostnum)` - Takes an IP address range in CIDR notation 92 and creates an IP address with the given host number. For example, 93 ``cidrhost("10.0.0.0/8", 2)`` returns ``10.0.0.2``. 94 95 * `cidrnetmask(iprange)` - Takes an IP address range in CIDR notation 96 and returns the address-formatted subnet mask format that some 97 systems expect for IPv4 interfaces. For example, 98 ``cidrmask("10.0.0.0/8")`` returns ``255.0.0.0``. Not applicable 99 to IPv6 networks since CIDR notation is the only valid notation for 100 IPv6. 101 102 * `cidrsubnet(iprange, newbits, netnum)` - Takes an IP address range in 103 CIDR notation (like ``10.0.0.0/8``) and extends its prefix to include an 104 additional subnet number. For example, 105 ``cidrsubnet("10.0.0.0/8", 8, 2)`` returns ``10.2.0.0/16``. 106 107 * `coalesce(string1, string2, ...)` - Returns the first non-empty value from 108 the given arguments. At least two arguments must be provided. 109 110 * `compact(list)` - Removes empty string elements from a list. This can be 111 useful in some cases, for example when passing joined lists as module 112 variables or when parsing module outputs. 113 Example: `compact(module.my_asg.load_balancer_names)` 114 115 * `concat(list1, list2)` - Combines two or more lists into a single list. 116 Example: `concat(aws_instance.db.*.tags.Name, aws_instance.web.*.tags.Name)` 117 118 * `element(list, index)` - Returns a single element from a list 119 at the given index. If the index is greater than the number of 120 elements, this function will wrap using a standard mod algorithm. 121 A list is only possible with splat variables from resources with 122 a count greater than one. 123 Example: `element(aws_subnet.foo.*.id, count.index)` 124 125 * `file(path)` - Reads the contents of a file into the string. Variables 126 in this file are _not_ interpolated. The contents of the file are 127 read as-is. 128 129 * `format(format, args...)` - Formats a string according to the given 130 format. The syntax for the format is standard `sprintf` syntax. 131 Good documentation for the syntax can be [found here](https://golang.org/pkg/fmt/). 132 Example to zero-prefix a count, used commonly for naming servers: 133 `format("web-%03d", count.index + 1)`. 134 135 * `formatlist(format, args...)` - Formats each element of a list 136 according to the given format, similarly to `format`, and returns a list. 137 Non-list arguments are repeated for each list element. 138 For example, to convert a list of DNS addresses to a list of URLs, you might use: 139 `formatlist("https://%s:%s/", aws_instance.foo.*.public_dns, var.port)`. 140 If multiple args are lists, and they have the same number of elements, then the formatting is applied to the elements of the lists in parallel. 141 Example: 142 `formatlist("instance %v has private ip %v", aws_instance.foo.*.id, aws_instance.foo.*.private_ip)`. 143 Passing lists with different lengths to formatlist results in an error. 144 145 * `index(list, elem)` - Finds the index of a given element in a list. Example: 146 `index(aws_instance.foo.*.tags.Name, "foo-test")` 147 148 * `join(delim, list)` - Joins the list with the delimiter. A list is 149 only possible with splat variables from resources with a count 150 greater than one. Example: `join(",", aws_instance.foo.*.id)` 151 152 * `length(list)` - Returns a number of members in a given list 153 or a number of characters in a given string. 154 * `${length(split(",", "a,b,c"))}` = 3 155 * `${length("a,b,c")}` = 5 156 157 * `lookup(map, key)` - Performs a dynamic lookup into a mapping 158 variable. The `map` parameter should be another variable, such 159 as `var.amis`. 160 161 * `lower(string)` - Returns a copy of the string with all Unicode letters mapped to their lower case. 162 163 * `replace(string, search, replace)` - Does a search and replace on the 164 given string. All instances of `search` are replaced with the value 165 of `replace`. If `search` is wrapped in forward slashes, it is treated 166 as a regular expression. If using a regular expression, `replace` 167 can reference subcaptures in the regular expression by using `$n` where 168 `n` is the index or name of the subcapture. If using a regular expression, 169 the syntax conforms to the [re2 regular expression syntax](https://code.google.com/p/re2/wiki/Syntax). 170 171 * `split(delim, string)` - Splits the string previously created by `join` 172 back into a list. This is useful for pushing lists through module 173 outputs since they currently only support string values. Depending on the 174 use, the string this is being performed within may need to be wrapped 175 in brackets to indicate that the output is actually a list, e.g. 176 `a_resource_param = ["${split(",", var.CSV_STRING)}"]`. 177 Example: `split(",", module.amod.server_ids)` 178 179 * `upper(string)` - Returns a copy of the string with all Unicode letters mapped to their upper case. 180 181 ## Templates 182 183 Long strings can be managed using templates. [Templates](/docs/providers/template/index.html) are [resources](/docs/configuration/resources.html) defined by a filename and some variables to use during interpolation. They have a computed `rendered` attribute containing the result. 184 185 A template resource looks like: 186 187 ``` 188 resource "template_file" "example" { 189 template = "${hello} ${world}!" 190 vars { 191 hello = "goodnight" 192 world = "moon" 193 } 194 } 195 196 output "rendered" { 197 value = "${template_file.example.rendered}" 198 } 199 ``` 200 201 Then the rendered value would be `goodnight moon!`. 202 203 You may use any of the built-in functions in your template. 204 205 ### Using Templates with Count 206 207 Here is an example that combines the capabilities of templates with the interpolation 208 from `count` to give us a parametized template, unique to each resource instance: 209 210 ``` 211 variable "count" { 212 default = 2 213 } 214 215 variable "hostnames" { 216 default = { 217 "0" = "example1.org" 218 "1" = "example2.net" 219 } 220 } 221 222 resource "template_file" "web_init" { 223 // here we expand multiple template_files - the same number as we have instances 224 count = "${var.count}" 225 template = "${file("templates/web_init.tpl")}" 226 vars { 227 // that gives us access to use count.index to do the lookup 228 hostname = "${lookup(var.hostnames, count.index)}" 229 } 230 } 231 232 resource "aws_instance" "web" { 233 // ... 234 count = "${var.count}" 235 // here we link each web instance to the proper template_file 236 user_data = "${element(template_file.web_init.*.rendered, count.index)}" 237 } 238 ``` 239 240 With this, we will build a list of `template_file.web_init` resources which we can 241 use in combination with our list of `aws_instance.web` resources. 242 243 ## Math 244 245 Simple math can be performed in interpolations: 246 247 ``` 248 variable "count" { 249 default = 2 250 } 251 252 resource "aws_instance" "web" { 253 // ... 254 count = "${var.count}" 255 256 // tag the instance with a counter starting at 1, ie. web-001 257 tags { 258 Name = "${format("web-%03d", count.index + 1)}" 259 } 260 } 261 ``` 262 263 The supported operations are: 264 265 - *Add*, *Subtract*, *Multiply*, and *Divide* for **float** types 266 - *Add*, *Subtract*, *Multiply*, *Divide*, and *Modulo* for **integer** types 267 268 -> **Note:** Since Terraform allows hyphens in resource and variable names, 269 it's best to use spaces between math operators to prevent confusion or unexpected 270 behavior. For example, `${var.instance-count - 1}` will subtract **1** from the 271 `instance-count` variable value, while `${var.instance-count-1}` will interpolate 272 the `instance-count-1` variable value.