github.com/kwoods/terraform@v0.6.11-0.20160809170336-13497db7138e/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. These 13 interpolations are wrapped in `${}`, such as `${var.foo}`. 14 15 The interpolation syntax is powerful and allows you to reference 16 variables, attributes of resources, call functions, etc. 17 18 You can also perform [simple math](#math) in interpolations, allowing 19 you to write expressions such as `${count.index + 1}`. 20 21 You can escape interpolation with double dollar signs: `$${foo}` 22 will be rendered as a literal `${foo}`. 23 24 ## Available Variables 25 26 **To reference user variables**, use the `var.` prefix followed by the 27 variable name. For example, `${var.foo}` will interpolate the 28 `foo` variable value. If the variable is a map, then you 29 can reference static keys in the map with the syntax 30 `var.MAP.KEY`. For example, `${var.amis.us-east-1}` would 31 get the value of the `us-east-1` key within the `amis` variable 32 that is a map. 33 34 **To reference attributes of your own resource**, the syntax is 35 `self.ATTRIBUTE`. For example `${self.private_ip_address}` will 36 interpolate that resource's private IP address. Note that this is 37 only allowed/valid within provisioners. 38 39 **To reference attributes of other resources**, the syntax is 40 `TYPE.NAME.ATTRIBUTE`. For example, `${aws_instance.web.id}` 41 will interpolate the ID attribute from the "aws\_instance" 42 resource named "web". If the resource has a `count` attribute set, 43 you can access individual attributes with a zero-based index, such 44 as `${aws_instance.web.0.id}`. You can also use the splat syntax 45 to get a list of all the attributes: `${aws_instance.web.*.id}`. 46 This is documented in more detail in the 47 [resource configuration page](/docs/configuration/resources.html). 48 49 **To reference outputs from a module**, the syntax is 50 `MODULE.NAME.OUTPUT`. For example `${module.foo.bar}` will 51 interpolate the "bar" output from the "foo" 52 [module](/docs/modules/index.html). 53 54 **To reference count information**, the syntax is `count.FIELD`. 55 For example, `${count.index}` will interpolate the current index 56 in a multi-count resource. For more information on count, see the 57 resource configuration page. 58 59 <a id="path-variables"></a> 60 61 **To reference path information**, the syntax is `path.TYPE`. 62 TYPE can be `cwd`, `module`, or `root`. `cwd` will interpolate the 63 cwd. `module` will interpolate the path to the current module. `root` 64 will interpolate the path of the root module. In general, you probably 65 want the `path.module` variable. 66 67 ## Built-in Functions 68 69 Terraform ships with built-in functions. Functions are called with 70 the syntax `name(arg, arg2, ...)`. For example, 71 to read a file: `${file("path.txt")}`. The built-in functions 72 are documented below. 73 74 The supported built-in functions are: 75 76 * `base64decode(string)` - Given a base64-encoded string, decodes it and 77 returns the original string. 78 79 * `base64encode(string)` - Returns a base64-encoded representation of the 80 given string. 81 82 * `base64sha256(string)` - Returns a base64-encoded representation of raw 83 SHA-256 sum of the given string. 84 **This is not equivalent** of `base64encode(sha256(string))` 85 since `sha256()` returns hexadecimal representation. 86 87 * `cidrhost(iprange, hostnum)` - Takes an IP address range in CIDR notation 88 and creates an IP address with the given host number. For example, 89 ``cidrhost("10.0.0.0/8", 2)`` returns ``10.0.0.2``. 90 91 * `cidrnetmask(iprange)` - Takes an IP address range in CIDR notation 92 and returns the address-formatted subnet mask format that some 93 systems expect for IPv4 interfaces. For example, 94 ``cidrmask("10.0.0.0/8")`` returns ``255.0.0.0``. Not applicable 95 to IPv6 networks since CIDR notation is the only valid notation for 96 IPv6. 97 98 * `cidrsubnet(iprange, newbits, netnum)` - Takes an IP address range in 99 CIDR notation (like ``10.0.0.0/8``) and extends its prefix to include an 100 additional subnet number. For example, 101 ``cidrsubnet("10.0.0.0/8", 8, 2)`` returns ``10.2.0.0/16``; 102 ``cidrsubnet("2607:f298:6051:516c::/64", 8, 2)`` returns 103 ``2607:f298:6051:516c:200::/72``. 104 105 * `coalesce(string1, string2, ...)` - Returns the first non-empty value from 106 the given arguments. At least two arguments must be provided. 107 108 * `compact(list)` - Removes empty string elements from a list. This can be 109 useful in some cases, for example when passing joined lists as module 110 variables or when parsing module outputs. 111 Example: `compact(module.my_asg.load_balancer_names)` 112 113 * `concat(list1, list2, ...)` - Combines two or more lists into a single list. 114 Example: `concat(aws_instance.db.*.tags.Name, aws_instance.web.*.tags.Name)` 115 116 * `distinct(list)` - Removes duplicate items from a list. Keeps the first 117 occurrence of each element, and removes subsequent occurences. This 118 function is only valid for flat lists. Example: `distinct(var.usernames)` 119 120 * `element(list, index)` - Returns a single element from a list 121 at the given index. If the index is greater than the number of 122 elements, this function will wrap using a standard mod algorithm. 123 This function only works on flat lists. Examples: 124 * `element(aws_subnet.foo.*.id, count.index)` 125 * `element(var.list_of_strings, 2)` 126 127 * `file(path)` - Reads the contents of a file into the string. Variables 128 in this file are _not_ interpolated. The contents of the file are 129 read as-is. The `path` is interpreted relative to the working directory. 130 [Path variables](#path-variables) can be used to reference paths relative 131 to other base locations. For example, when using `file()` from inside a 132 module, you generally want to make the path relative to the module base, 133 like this: `file("${path.module}/file")`. 134 135 * `format(format, args, ...)` - Formats a string according to the given 136 format. The syntax for the format is standard `sprintf` syntax. 137 Good documentation for the syntax can be [found here](https://golang.org/pkg/fmt/). 138 Example to zero-prefix a count, used commonly for naming servers: 139 `format("web-%03d", count.index + 1)`. 140 141 * `formatlist(format, args, ...)` - Formats each element of a list 142 according to the given format, similarly to `format`, and returns a list. 143 Non-list arguments are repeated for each list element. 144 For example, to convert a list of DNS addresses to a list of URLs, you might use: 145 `formatlist("https://%s:%s/", aws_instance.foo.*.public_dns, var.port)`. 146 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. 147 Example: 148 `formatlist("instance %v has private ip %v", aws_instance.foo.*.id, aws_instance.foo.*.private_ip)`. 149 Passing lists with different lengths to formatlist results in an error. 150 151 * `index(list, elem)` - Finds the index of a given element in a list. 152 This function only works on flat lists. 153 Example: `index(aws_instance.foo.*.tags.Name, "foo-test")` 154 155 * `join(delim, list)` - Joins the list with the delimiter for a resultant string. 156 This function works only on flat lists. 157 Examples: 158 * `join(",", aws_instance.foo.*.id)` 159 * `join(",", var.ami_list)` 160 161 * `jsonencode(item)` - Returns a JSON-encoded representation of the given 162 item, which may be a string, list of strings, or map from string to string. 163 Note that if the item is a string, the return value includes the double 164 quotes. 165 166 * `keys(map)` - Returns a lexically sorted list of the map keys. 167 168 * `length(list)` - Returns a number of members in a given list or map, or a number of characters in a given string. 169 * `${length(split(",", "a,b,c"))}` = 3 170 * `${length("a,b,c")}` = 5 171 * `${length(map("key", "val"))}` = 1 172 173 * `list(items, ...)` - Returns a list consisting of the arguments to the function. 174 This function provides a way of representing list literals in interpolation. 175 * `${list("a", "b", "c")}` returns a list of `"a", "b", "c"`. 176 * `${list()}` returns an empty list. 177 178 * `lookup(map, key [, default])` - Performs a dynamic lookup into a map 179 variable. The `map` parameter should be another variable, such 180 as `var.amis`. If `key` does not exist in `map`, the interpolation will 181 fail unless you specify a third argument, `default`, which should be a 182 string value to return if no `key` is found in `map`. This function 183 only works on flat maps and will return an error for maps that 184 include nested lists or maps. 185 186 * `lower(string)` - Returns a copy of the string with all Unicode letters mapped to their lower case. 187 188 * `map(key, value, ...)` - Returns a map consisting of the key/value pairs 189 specified as arguments. Every odd argument must be a string key, and every 190 even argument must have the same type as the other values specified. 191 Duplicate keys are not allowed. Examples: 192 * `map("hello", "world")` 193 * `map("us-east", list("a", "b", "c"), "us-west", list("b", "c", "d"))` 194 195 * `merge(map1, map2, ...)` - Returns the union of 2 or more maps. The maps 196 are consumed in the order provided, and duplciate keys overwrite previous 197 entries. 198 * `${merge(map("a", "b"), map("c", "d"))}` returns `{"a": "b", "c": "d"}` 199 200 * `md5(string)` - Returns a (conventional) hexadecimal representation of the 201 MD5 hash of the given string. 202 203 * `replace(string, search, replace)` - Does a search and replace on the 204 given string. All instances of `search` are replaced with the value 205 of `replace`. If `search` is wrapped in forward slashes, it is treated 206 as a regular expression. If using a regular expression, `replace` 207 can reference subcaptures in the regular expression by using `$n` where 208 `n` is the index or name of the subcapture. If using a regular expression, 209 the syntax conforms to the [re2 regular expression syntax](https://code.google.com/p/re2/wiki/Syntax). 210 211 * `sha1(string)` - Returns a (conventional) hexadecimal representation of the 212 SHA-1 hash of the given string. 213 Example: `"${sha1("${aws_vpc.default.tags.customer}-s3-bucket")}"` 214 215 * `sha256(string)` - Returns a (conventional) hexadecimal representation of the 216 SHA-256 hash of the given string. 217 Example: `"${sha256("${aws_vpc.default.tags.customer}-s3-bucket")}"` 218 219 * `signum(int)` - Returns -1 for negative numbers, 0 for 0 and 1 for positive numbers. 220 This function is useful when you need to set a value for the first resource and 221 a different value for the rest of the resources. 222 Example: `element(split(",", var.r53_failover_policy), signum(count.index))` 223 where the 0th index points to `PRIMARY` and 1st to `FAILOVER` 224 225 * `sort(list)` - Returns a lexographically sorted list of the strings contained in 226 the list passed as an argument. Sort may only be used with lists which contain only 227 strings. 228 Examples: `sort(aws_instance.foo.*.id)`, `sort(var.list_of_strings)` 229 230 * `split(delim, string)` - Splits the string previously created by `join` 231 back into a list. This is useful for pushing lists through module 232 outputs since they currently only support string values. Depending on the 233 use, the string this is being performed within may need to be wrapped 234 in brackets to indicate that the output is actually a list, e.g. 235 `a_resource_param = ["${split(",", var.CSV_STRING)}"]`. 236 Example: `split(",", module.amod.server_ids)` 237 238 * `trimspace(string)` - Returns a copy of the string with all leading and trailing white spaces removed. 239 240 * `upper(string)` - Returns a copy of the string with all Unicode letters mapped to their upper case. 241 242 * `uuid()` - Returns a UUID string in RFC 4122 v4 format. This string will change with every invocation of the function, so in order to prevent diffs on every plan & apply, it must be used with the [`ignore_changes`](/docs/configuration/resources.html#ignore-changes) lifecycle attribute. 243 244 * `values(map)` - Returns a list of the map values, in the order of the keys 245 returned by the `keys` function. This function only works on flat maps and 246 will return an error for maps that include nested lists or maps. 247 248 ## Templates 249 250 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. 251 252 A template resource looks like: 253 254 ``` 255 resource "template_file" "example" { 256 template = "${hello} ${world}!" 257 vars { 258 hello = "goodnight" 259 world = "moon" 260 } 261 } 262 263 output "rendered" { 264 value = "${template_file.example.rendered}" 265 } 266 ``` 267 268 Then the rendered value would be `goodnight moon!`. 269 270 You may use any of the built-in functions in your template. 271 272 ### Using Templates with Count 273 274 Here is an example that combines the capabilities of templates with the interpolation 275 from `count` to give us a parametized template, unique to each resource instance: 276 277 ``` 278 variable "count" { 279 default = 2 280 } 281 282 variable "hostnames" { 283 default = { 284 "0" = "example1.org" 285 "1" = "example2.net" 286 } 287 } 288 289 resource "template_file" "web_init" { 290 // here we expand multiple template_files - the same number as we have instances 291 count = "${var.count}" 292 template = "${file("templates/web_init.tpl")}" 293 vars { 294 // that gives us access to use count.index to do the lookup 295 hostname = "${lookup(var.hostnames, count.index)}" 296 } 297 } 298 299 resource "aws_instance" "web" { 300 // ... 301 count = "${var.count}" 302 // here we link each web instance to the proper template_file 303 user_data = "${element(template_file.web_init.*.rendered, count.index)}" 304 } 305 ``` 306 307 With this, we will build a list of `template_file.web_init` resources which we can 308 use in combination with our list of `aws_instance.web` resources. 309 310 ## Math 311 312 <a id="math"></a> 313 314 Simple math can be performed in interpolations: 315 316 ``` 317 variable "count" { 318 default = 2 319 } 320 321 resource "aws_instance" "web" { 322 // ... 323 count = "${var.count}" 324 325 // tag the instance with a counter starting at 1, ie. web-001 326 tags { 327 Name = "${format("web-%03d", count.index + 1)}" 328 } 329 } 330 ``` 331 332 The supported operations are: 333 334 - *Add* (`+`), *Subtract* (`-`), *Multiply* (`*`), and *Divide* (`/`) for **float** types 335 - *Add* (`+`), *Subtract* (`-`), *Multiply* (`*`), *Divide* (`/`), and *Modulo* (`%`) for **integer** types 336 337 -> **Note:** Since Terraform allows hyphens in resource and variable names, 338 it's best to use spaces between math operators to prevent confusion or unexpected 339 behavior. For example, `${var.instance-count - 1}` will subtract **1** from the 340 `instance-count` variable value, while `${var.instance-count-1}` will interpolate 341 the `instance-count-1` variable value.