github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/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 perform [simple math](#math) in interpolations, allowing
    19  you to write expressions such as `${count.index + 1}`. And you can
    20  also use [conditionals](#conditionals) to determine a value based
    21  on some logic.
    22  
    23  You can escape interpolation with double dollar signs: `$${foo}`
    24  will be rendered as a literal `${foo}`.
    25  
    26  ## Available Variables
    27  
    28  There are a variety of available variable references you can use.
    29  
    30  #### User string variables
    31  
    32  Use the `var.` prefix followed by the variable name. For example,
    33  `${var.foo}` will interpolate the `foo` variable value.
    34  
    35  #### User map variables
    36  
    37  The syntax is `var.MAP["KEY"]`. For example, `${var.amis["us-east-1"]}`
    38  would get the value of the `us-east-1` key within the `amis` map
    39  variable.
    40  
    41  #### User list variables
    42  
    43  The syntax is `["${var.LIST}"]`. For example, `["${var.subnets}"]`
    44  would get the value of the `subnets` list, as a list. You can also
    45  return list elements by index: `${var.subnets[idx]}`.
    46  
    47  #### Attributes of your own resource
    48  
    49  The syntax is `self.ATTRIBUTE`. For example `${self.private_ip_address}`
    50  will interpolate that resource's private IP address.
    51  
    52  -> **Note**: The `self.ATTRIBUTE` syntax is only allowed and valid within
    53  provisioners.
    54  
    55  #### Attributes of other resources
    56  
    57  The syntax is `TYPE.NAME.ATTRIBUTE`. For example,
    58  `${aws_instance.web.id}` will interpolate the ID attribute from the
    59  `aws_instance` resource named `web`. If the resource has a `count`
    60  attribute set, you can access individual attributes with a zero-based
    61  index, such as `${aws_instance.web.0.id}`. You can also use the splat
    62  syntax to get a list of all the attributes: `${aws_instance.web.*.id}`.
    63  
    64  #### Outputs from a module
    65  
    66  The syntax is `MODULE.NAME.OUTPUT`. For example `${module.foo.bar}` will
    67  interpolate the `bar` output from the `foo`
    68  [module](/docs/modules/index.html).
    69  
    70  #### Count information
    71  
    72  The syntax is `count.FIELD`. For example, `${count.index}` will
    73  interpolate the current index in a multi-count resource. For more
    74  information on `count`, see the [resource configuration
    75  page](/docs/configuration/resources.html).
    76  
    77  #### Path information
    78  
    79  The syntax is `path.TYPE`. TYPE can be `cwd`, `module`, or `root`.
    80  `cwd` will interpolate the current working directory. `module` will
    81  interpolate the path to the current module. `root` will interpolate the
    82  path of the root module.  In general, you probably want the
    83  `path.module` variable.
    84  
    85  #### Terraform meta information
    86  
    87  The syntax is `terraform.FIELD`. This variable type contains metadata about
    88  the currently executing Terraform run. FIELD can currently only be `env` to
    89  reference the currently active [state environment](/docs/state/environments.html).
    90  
    91  ## Conditionals
    92  
    93  Interpolations may contain conditionals to branch on the final value.
    94  
    95  ```hcl
    96  resource "aws_instance" "web" {
    97    subnet = "${var.env == "production" ? var.prod_subnet : var.dev_subnet}"
    98  }
    99  ```
   100  
   101  The conditional syntax is the well-known ternary operation:
   102  
   103  ```text
   104  CONDITION ? TRUEVAL : FALSEVAL
   105  ```
   106  
   107  The condition can be any valid interpolation syntax, such as variable
   108  access, a function call, or even another conditional. The true and false
   109  value can also be any valid interpolation syntax. The returned types by
   110  the true and false side must be the same.
   111  
   112  The support operators are:
   113  
   114    * Equality: `==` and `!=`
   115    * Numerical comparison: `>`, `<`, `>=`, `<=`
   116    * Boolean logic: `&&`, `||`, unary `!`
   117  
   118  A common use case for conditionals is to enable/disable a resource by
   119  conditionally setting the count:
   120  
   121  ```hcl
   122  resource "aws_instance" "vpn" {
   123    count = "${var.something ? 1 : 0}"
   124  }
   125  ```
   126  
   127  In the example above, the "vpn" resource will only be included if
   128  "var.something" evaluates to true. Otherwise, the VPN resource will
   129  not be created at all.
   130  
   131  ## Built-in Functions
   132  
   133  Terraform ships with built-in functions. Functions are called with the
   134  syntax `name(arg, arg2, ...)`. For example, to read a file:
   135  `${file("path.txt")}`.
   136  
   137  ### Supported built-in functions
   138  
   139  The supported built-in functions are:
   140  
   141    * `basename(path)` - Returns the last element of a path.
   142  
   143    * `base64decode(string)` - Given a base64-encoded string, decodes it and
   144      returns the original string.
   145  
   146    * `base64encode(string)` - Returns a base64-encoded representation of the
   147      given string.
   148  
   149    * `base64sha256(string)` - Returns a base64-encoded representation of raw
   150      SHA-256 sum of the given string.
   151      **This is not equivalent** of `base64encode(sha256(string))`
   152      since `sha256()` returns hexadecimal representation.
   153  
   154    * `ceil(float)` - Returns the least integer value greater than or equal
   155        to the argument.
   156  
   157    * `chomp(string)` - Removes trailing newlines from the given string.
   158  
   159    * `cidrhost(iprange, hostnum)` - Takes an IP address range in CIDR notation
   160      and creates an IP address with the given host number. If given host
   161      number is negative, the count starts from the end of the range.
   162      For example, `cidrhost("10.0.0.0/8", 2)` returns `10.0.0.2` and
   163      `cidrhost("10.0.0.0/8", -2)` returns `10.255.255.254`.
   164  
   165    * `cidrnetmask(iprange)` - Takes an IP address range in CIDR notation
   166      and returns the address-formatted subnet mask format that some
   167      systems expect for IPv4 interfaces. For example,
   168      `cidrnetmask("10.0.0.0/8")` returns `255.0.0.0`. Not applicable
   169      to IPv6 networks since CIDR notation is the only valid notation for
   170      IPv6.
   171  
   172    * `cidrsubnet(iprange, newbits, netnum)` - Takes an IP address range in
   173      CIDR notation (like `10.0.0.0/8`) and extends its prefix to include an
   174      additional subnet number. For example,
   175      `cidrsubnet("10.0.0.0/8", 8, 2)` returns `10.2.0.0/16`;
   176      `cidrsubnet("2607:f298:6051:516c::/64", 8, 2)` returns
   177      `2607:f298:6051:516c:200::/72`.
   178  
   179    * `coalesce(string1, string2, ...)` - Returns the first non-empty value from
   180      the given arguments. At least two arguments must be provided.
   181  
   182    * `coalescelist(list1, list2, ...)` - Returns the first non-empty list from
   183      the given arguments. At least two arguments must be provided.
   184  
   185    * `compact(list)` - Removes empty string elements from a list. This can be
   186       useful in some cases, for example when passing joined lists as module
   187       variables or when parsing module outputs.
   188       Example: `compact(module.my_asg.load_balancer_names)`
   189  
   190    * `concat(list1, list2, ...)` - Combines two or more lists into a single list.
   191       Example: `concat(aws_instance.db.*.tags.Name, aws_instance.web.*.tags.Name)`
   192  
   193    * `dirname(path)` - Returns all but the last element of path, typically the path's directory.
   194  
   195    * `distinct(list)` - Removes duplicate items from a list. Keeps the first
   196       occurrence of each element, and removes subsequent occurrences. This
   197       function is only valid for flat lists. Example: `distinct(var.usernames)`
   198  
   199    * `element(list, index)` - Returns a single element from a list
   200        at the given index. If the index is greater than the number of
   201        elements, this function will wrap using a standard mod algorithm.
   202        This function only works on flat lists. Examples:
   203        * `element(aws_subnet.foo.*.id, count.index)`
   204        * `element(var.list_of_strings, 2)`
   205  
   206    * `file(path)` - Reads the contents of a file into the string. Variables
   207        in this file are _not_ interpolated. The contents of the file are
   208        read as-is. The `path` is interpreted relative to the working directory.
   209        [Path variables](#path-variables) can be used to reference paths relative
   210        to other base locations. For example, when using `file()` from inside a
   211        module, you generally want to make the path relative to the module base,
   212        like this: `file("${path.module}/file")`.
   213  
   214    * `matchkeys(values, keys, searchset)` - For two lists `values` and `keys` of
   215        equal length, returns all elements from `values` where the corresponding
   216        element from `keys` exists in the `searchset` list.  E.g.
   217        `matchkeys(aws_instance.example.*.id,
   218        aws_instance.example.*.availability_zone, list("us-west-2a"))` will return a
   219        list of the instance IDs of the `aws_instance.example` instances in
   220        `"us-west-2a"`. No match will result in empty list. Items of `keys` are
   221        processed sequentially, so the order of returned `values` is preserved.
   222  
   223    * `floor(float)` - Returns the greatest integer value less than or equal to
   224        the argument.
   225  
   226    * `format(format, args, ...)` - Formats a string according to the given
   227        format. The syntax for the format is standard `sprintf` syntax.
   228        Good documentation for the syntax can be [found here](https://golang.org/pkg/fmt/).
   229        Example to zero-prefix a count, used commonly for naming servers:
   230        `format("web-%03d", count.index + 1)`.
   231  
   232    * `formatlist(format, args, ...)` - Formats each element of a list
   233        according to the given format, similarly to `format`, and returns a list.
   234        Non-list arguments are repeated for each list element.
   235        For example, to convert a list of DNS addresses to a list of URLs, you might use:
   236        `formatlist("https://%s:%s/", aws_instance.foo.*.public_dns, var.port)`.
   237        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.
   238        Example:
   239        `formatlist("instance %v has private ip %v", aws_instance.foo.*.id, aws_instance.foo.*.private_ip)`.
   240        Passing lists with different lengths to formatlist results in an error.
   241  
   242    * `index(list, elem)` - Finds the index of a given element in a list.
   243        This function only works on flat lists.
   244        Example: `index(aws_instance.foo.*.tags.Name, "foo-test")`
   245  
   246    * `join(delim, list)` - Joins the list with the delimiter for a resultant string.
   247        This function works only on flat lists.
   248        Examples:
   249        * `join(",", aws_instance.foo.*.id)`
   250        * `join(",", var.ami_list)`
   251  
   252    * `jsonencode(item)` - Returns a JSON-encoded representation of the given
   253      item, which may be a string, list of strings, or map from string to string.
   254      Note that if the item is a string, the return value includes the double
   255      quotes.
   256  
   257    * `keys(map)` - Returns a lexically sorted list of the map keys.
   258  
   259    * `length(list)` - Returns the number of members in a given list or map, or the number of characters in a given string.
   260        * `${length(split(",", "a,b,c"))}` = 3
   261        * `${length("a,b,c")}` = 5
   262        * `${length(map("key", "val"))}` = 1
   263  
   264    * `list(items, ...)` - Returns a list consisting of the arguments to the function.
   265        This function provides a way of representing list literals in interpolation.
   266        * `${list("a", "b", "c")}` returns a list of `"a", "b", "c"`.
   267        * `${list()}` returns an empty list.
   268  
   269    * `lookup(map, key, [default])` - Performs a dynamic lookup into a map
   270        variable. The `map` parameter should be another variable, such
   271        as `var.amis`. If `key` does not exist in `map`, the interpolation will
   272        fail unless you specify a third argument, `default`, which should be a
   273        string value to return if no `key` is found in `map`. This function
   274        only works on flat maps and will return an error for maps that
   275        include nested lists or maps.
   276  
   277    * `lower(string)` - Returns a copy of the string with all Unicode letters mapped to their lower case.
   278  
   279    * `map(key, value, ...)` - Returns a map consisting of the key/value pairs
   280      specified as arguments. Every odd argument must be a string key, and every
   281      even argument must have the same type as the other values specified.
   282      Duplicate keys are not allowed. Examples:
   283      * `map("hello", "world")`
   284      * `map("us-east", list("a", "b", "c"), "us-west", list("b", "c", "d"))`
   285  
   286    * `max(float1, float2, ...)` - Returns the largest of the floats.
   287  
   288    * `merge(map1, map2, ...)` - Returns the union of 2 or more maps. The maps
   289  	are consumed in the order provided, and duplicate keys overwrite previous
   290  	entries.
   291  	* `${merge(map("a", "b"), map("c", "d"))}` returns `{"a": "b", "c": "d"}`
   292  
   293    * `min(float1, float2, ...)` - Returns the smallest of the floats.
   294  
   295    * `md5(string)` - Returns a (conventional) hexadecimal representation of the
   296      MD5 hash of the given string.
   297  
   298    * `pathexpand(string)` - Returns a filepath string with `~` expanded to the home directory. Note:
   299      This will create a plan diff between two different hosts, unless the filepaths are the same.
   300  
   301    * `replace(string, search, replace)` - Does a search and replace on the
   302        given string. All instances of `search` are replaced with the value
   303        of `replace`. If `search` is wrapped in forward slashes, it is treated
   304        as a regular expression. If using a regular expression, `replace`
   305        can reference subcaptures in the regular expression by using `$n` where
   306        `n` is the index or name of the subcapture. If using a regular expression,
   307        the syntax conforms to the [re2 regular expression syntax](https://github.com/google/re2/wiki/Syntax).
   308  
   309    * `sha1(string)` - Returns a (conventional) hexadecimal representation of the
   310      SHA-1 hash of the given string.
   311      Example: `"${sha1("${aws_vpc.default.tags.customer}-s3-bucket")}"`
   312  
   313    * `sha256(string)` - Returns a (conventional) hexadecimal representation of the
   314      SHA-256 hash of the given string.
   315      Example: `"${sha256("${aws_vpc.default.tags.customer}-s3-bucket")}"`
   316  
   317    * `signum(int)` - Returns `-1` for negative numbers, `0` for `0` and `1` for positive numbers.
   318        This function is useful when you need to set a value for the first resource and
   319        a different value for the rest of the resources.
   320        Example: `element(split(",", var.r53_failover_policy), signum(count.index))`
   321        where the 0th index points to `PRIMARY` and 1st to `FAILOVER`
   322  
   323    * `slice(list, from, to)` - Returns the portion of `list` between `from` (inclusive) and `to` (exclusive).
   324        Example: `slice(var.list_of_strings, 0, length(var.list_of_strings) - 1)`
   325  
   326    * `sort(list)` - Returns a lexographically sorted list of the strings contained in
   327        the list passed as an argument. Sort may only be used with lists which contain only
   328        strings.
   329        Examples: `sort(aws_instance.foo.*.id)`, `sort(var.list_of_strings)`
   330  
   331    * `split(delim, string)` - Splits the string previously created by `join`
   332        back into a list. This is useful for pushing lists through module
   333        outputs since they currently only support string values. Depending on the
   334        use, the string this is being performed within may need to be wrapped
   335        in brackets to indicate that the output is actually a list, e.g.
   336        `a_resource_param = ["${split(",", var.CSV_STRING)}"]`.
   337        Example: `split(",", module.amod.server_ids)`
   338  
   339    * `substr(string, offset, length)` - Extracts a substring from the input string. A negative offset is interpreted as being equivalent to a positive offset measured backwards from the end of the string. A length of `-1` is interpreted as meaning "until the end of the string".
   340  
   341    * `timestamp()` - Returns a UTC timestamp string in RFC 3339 format. This string will change with every
   342     invocation of the function, so in order to prevent diffs on every plan & apply, it must be used with the
   343     [`ignore_changes`](/docs/configuration/resources.html#ignore-changes) lifecycle attribute.
   344  
   345    * `title(string)` - Returns a copy of the string with the first characters of all the words capitalized.
   346  
   347    * `trimspace(string)` - Returns a copy of the string with all leading and trailing white spaces removed.
   348  
   349    * `upper(string)` - Returns a copy of the string with all Unicode letters mapped to their upper case.
   350  
   351    * `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.
   352  
   353    * `values(map)` - Returns a list of the map values, in the order of the keys
   354      returned by the `keys` function. This function only works on flat maps and
   355      will return an error for maps that include nested lists or maps.
   356  
   357    * `zipmap(list, list)` - Creates a map from a list of keys and a list of
   358        values. The keys must all be of type string, and the length of the lists
   359        must be the same.
   360        For example, to output a mapping of AWS IAM user names to the fingerprint
   361        of the key used to encrypt their initial password, you might use:
   362        `zipmap(aws_iam_user.users.*.name, aws_iam_user_login_profile.users.*.key_fingerprint)`.
   363  
   364  ## Templates
   365  
   366  Long strings can be managed using templates.
   367  [Templates](/docs/providers/template/index.html) are
   368  [data-sources](/docs/configuration/data-sources.html) defined by a
   369  filename and some variables to use during interpolation. They have a
   370  computed `rendered` attribute containing the result.
   371  
   372  A template data source looks like:
   373  
   374  ```hcl
   375  data "template_file" "example" {
   376    template = "$${hello} $${world}!"
   377    vars {
   378      hello = "goodnight"
   379      world = "moon"
   380    }
   381  }
   382  
   383  output "rendered" {
   384    value = "${data.template_file.example.rendered}"
   385  }
   386  ```
   387  
   388  Then the rendered value would be `goodnight moon!`.
   389  
   390  You may use any of the built-in functions in your template. For more
   391  details on template usage, please see the
   392  [template_file documentation](/docs/providers/template/d/file.html).
   393  
   394  ### Using Templates with Count
   395  
   396  Here is an example that combines the capabilities of templates with the interpolation
   397  from `count` to give us a parameterized template, unique to each resource instance:
   398  
   399  ```hcl
   400  variable "count" {
   401    default = 2
   402  }
   403  
   404  variable "hostnames" {
   405    default = {
   406      "0" = "example1.org"
   407      "1" = "example2.net"
   408    }
   409  }
   410  
   411  data "template_file" "web_init" {
   412    # Expand multiple template files - the same number as we have instances
   413    count    = "${var.count}"
   414    template = "${file("templates/web_init.tpl")}"
   415    vars {
   416      # that gives us access to use count.index to do the lookup
   417      hostname = "${lookup(var.hostnames, count.index)}"
   418    }
   419  }
   420  
   421  resource "aws_instance" "web" {
   422    # ...
   423    count = "${var.count}"
   424  
   425    # Link each web instance to the proper template_file
   426    user_data = "${element(data.template_file.web_init.*.rendered, count.index)}"
   427  }
   428  ```
   429  
   430  With this, we will build a list of `template_file.web_init` data sources which
   431  we can use in combination with our list of `aws_instance.web` resources.
   432  
   433  ## Math
   434  
   435  Simple math can be performed in interpolations:
   436  
   437  ```hcl
   438  variable "count" {
   439    default = 2
   440  }
   441  
   442  resource "aws_instance" "web" {
   443    # ...
   444  
   445    count = "${var.count}"
   446  
   447    # Tag the instance with a counter starting at 1, ie. web-001
   448    tags {
   449      Name = "${format("web-%03d", count.index + 1)}"
   450    }
   451  }
   452  ```
   453  
   454  The supported operations are:
   455  
   456  - *Add* (`+`), *Subtract* (`-`), *Multiply* (`*`), and *Divide* (`/`) for **float** types
   457  - *Add* (`+`), *Subtract* (`-`), *Multiply* (`*`), *Divide* (`/`), and *Modulo* (`%`) for **integer** types
   458  
   459  Operator precedences is the standard mathematical order of operations:
   460  *Multiply* (`*`), *Divide* (`/`), and *Modulo* (`%`) have precedence over
   461  *Add* (`+`) and *Subtract* (`-`). Parenthesis can be used to force ordering.
   462  
   463  ```text
   464  "${2 * 4 + 3 * 3}" # computes to 17
   465  "${3 * 3 + 2 * 4}" # computes to 17
   466  "${2 * (4 + 3) * 3}" # computes to 42
   467  ```
   468  
   469  You can use the [terraform console](/docs/commands/console.html) command to
   470  try the math operations.
   471  
   472  -> **Note:** Since Terraform allows hyphens in resource and variable names,
   473  it's best to use spaces between math operators to prevent confusion or unexpected
   474  behavior. For example, `${var.instance-count - 1}` will subtract **1** from the
   475  `instance-count` variable value, while `${var.instance-count-1}` will interpolate
   476  the `instance-count-1` variable value.