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.