github.com/grange74/terraform@v0.7.0-rc3.0.20160722171430-8c8803864753/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    * `base64sha256(string)` - Returns a base64-encoded representation of raw
    84      SHA-256 sum of the given string.
    85      **This is not equivalent** of `base64encode(sha256(string))`
    86      since `sha256()` returns hexadecimal representation.
    87  
    88    * `cidrhost(iprange, hostnum)` - Takes an IP address range in CIDR notation
    89      and creates an IP address with the given host number. For example,
    90      ``cidrhost("10.0.0.0/8", 2)`` returns ``10.0.0.2``.
    91  
    92    * `cidrnetmask(iprange)` - Takes an IP address range in CIDR notation
    93      and returns the address-formatted subnet mask format that some
    94      systems expect for IPv4 interfaces. For example,
    95      ``cidrmask("10.0.0.0/8")`` returns ``255.0.0.0``. Not applicable
    96      to IPv6 networks since CIDR notation is the only valid notation for
    97      IPv6.
    98  
    99    * `cidrsubnet(iprange, newbits, netnum)` - Takes an IP address range in
   100      CIDR notation (like ``10.0.0.0/8``) and extends its prefix to include an
   101      additional subnet number. For example,
   102      ``cidrsubnet("10.0.0.0/8", 8, 2)`` returns ``10.2.0.0/16``;
   103      ``cidrsubnet("2607:f298:6051:516c::/64", 8, 2)`` returns
   104      ``2607:f298:6051:516c:200::/72``.
   105  
   106    * `coalesce(string1, string2, ...)` - Returns the first non-empty value from
   107      the given arguments. At least two arguments must be provided.
   108  
   109    * `compact(list)` - Removes empty string elements from a list. This can be
   110       useful in some cases, for example when passing joined lists as module
   111       variables or when parsing module outputs.
   112       Example: `compact(module.my_asg.load_balancer_names)`
   113  
   114    * `concat(list1, list2)` - Combines two or more lists into a single list.
   115       Example: `concat(aws_instance.db.*.tags.Name, aws_instance.web.*.tags.Name)`
   116  
   117    * `distinct(list)` - Removes duplicate items from a list. Keeps the first
   118       occurrence of each element, and removes subsequent occurences.
   119       Example: `distinct(var.usernames)`
   120  
   121    * `element(list, index)` - Returns a single element from a list
   122        at the given index. If the index is greater than the number of
   123        elements, this function will wrap using a standard mod algorithm.
   124        A list is only possible with splat variables from resources with
   125        a count greater than one.
   126        Example: `element(aws_subnet.foo.*.id, count.index)`
   127  
   128    * `file(path)` - Reads the contents of a file into the string. Variables
   129        in this file are _not_ interpolated. The contents of the file are
   130        read as-is. The `path` is interpreted relative to the working directory.
   131        [Path variables](#path-variables) can be used to reference paths relative
   132        to other base locations. For example, when using `file()` from inside a
   133        module, you generally want to make the path relative to the module base,
   134        like this: `file("${path.module}/file")`.
   135  
   136    * `format(format, args...)` - Formats a string according to the given
   137        format. The syntax for the format is standard `sprintf` syntax.
   138        Good documentation for the syntax can be [found here](https://golang.org/pkg/fmt/).
   139        Example to zero-prefix a count, used commonly for naming servers:
   140        `format("web-%03d", count.index + 1)`.
   141  
   142    * `formatlist(format, args...)` - Formats each element of a list
   143        according to the given format, similarly to `format`, and returns a list.
   144        Non-list arguments are repeated for each list element.
   145        For example, to convert a list of DNS addresses to a list of URLs, you might use:
   146        `formatlist("https://%s:%s/", aws_instance.foo.*.public_dns, var.port)`.
   147        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.
   148        Example:
   149        `formatlist("instance %v has private ip %v", aws_instance.foo.*.id, aws_instance.foo.*.private_ip)`.
   150        Passing lists with different lengths to formatlist results in an error.
   151  
   152    * `index(list, elem)` - Finds the index of a given element in a list. Example:
   153        `index(aws_instance.foo.*.tags.Name, "foo-test")`
   154  
   155    * `join(delim, list)` - Joins the list with the delimiter for a resultant string. A list is
   156        only possible with splat variables from resources with a count
   157        greater than one. Example: `join(",", aws_instance.foo.*.id)`
   158  
   159    * `jsonencode(item)` - Returns a JSON-encoded representation of the given
   160      item, which may be a string, list of strings, or map from string to string.
   161      Note that if the item is a string, the return value includes the double
   162      quotes.
   163  
   164    * `keys(map)` - Returns a lexically sorted, JSON-encoded list of the map keys.
   165  
   166    * `length(list)` - Returns a number of members in a given list
   167        or a number of characters in a given string.
   168        * `${length(split(",", "a,b,c"))}` = 3
   169        * `${length("a,b,c")}` = 5
   170  
   171    * `list(items...)` - Returns a list consisting of the arguments to the function.
   172        This function provides a way of representing list literals in interpolation.
   173        * `${list("a", "b", "c")}` returns a list of `"a", "b", "c"`.
   174        * `${list()}` returns an empty list.
   175  
   176    * `lookup(map, key [, default])` - Performs a dynamic lookup into a mapping
   177        variable. The `map` parameter should be another variable, such
   178        as `var.amis`. If `key` does not exist in `map`, the interpolation will
   179        fail unless you specify a third argument, `default`, which should be a
   180        string value to return if no `key` is found in `map.
   181  
   182    * `lower(string)` - Returns a copy of the string with all Unicode letters mapped to their lower case.
   183  
   184    * `md5(string)` - Returns a (conventional) hexadecimal representation of the
   185      MD5 hash of the given string.
   186  
   187    * `replace(string, search, replace)` - Does a search and replace on the
   188        given string. All instances of `search` are replaced with the value
   189        of `replace`. If `search` is wrapped in forward slashes, it is treated
   190        as a regular expression. If using a regular expression, `replace`
   191        can reference subcaptures in the regular expression by using `$n` where
   192        `n` is the index or name of the subcapture. If using a regular expression,
   193        the syntax conforms to the [re2 regular expression syntax](https://code.google.com/p/re2/wiki/Syntax).
   194  
   195    * `sha1(string)` - Returns a (conventional) hexadecimal representation of the
   196      SHA-1 hash of the given string.
   197      Example: `"${sha1("${aws_vpc.default.tags.customer}-s3-bucket")}"`
   198  
   199    * `sha256(string)` - Returns a (conventional) hexadecimal representation of the
   200      SHA-256 hash of the given string.
   201      Example: `"${sha256("${aws_vpc.default.tags.customer}-s3-bucket")}"`
   202  
   203    * `signum(int)` - Returns -1 for negative numbers, 0 for 0 and 1 for positive numbers.
   204        This function is useful when you need to set a value for the first resource and
   205        a different value for the rest of the resources.
   206        Example: `element(split(",", var.r53_failover_policy), signum(count.index))`
   207        where the 0th index points to `PRIMARY` and 1st to `FAILOVER`
   208  
   209    * `sort(list)` - Returns a lexographically sorted list of the strings contained in
   210        the list passed as an argument. Sort may only be used with lists which contain only
   211        strings.
   212        Examples: `sort(aws_instance.foo.*.id)`, `sort(var.list_of_strings)`
   213  
   214    * `split(delim, string)` - Splits the string previously created by `join`
   215        back into a list. This is useful for pushing lists through module
   216        outputs since they currently only support string values. Depending on the
   217        use, the string this is being performed within may need to be wrapped
   218        in brackets to indicate that the output is actually a list, e.g.
   219        `a_resource_param = ["${split(",", var.CSV_STRING)}"]`.
   220        Example: `split(",", module.amod.server_ids)`
   221  
   222    * `trimspace(string)` - Returns a copy of the string with all leading and trailing white spaces removed.
   223  
   224    * `upper(string)` - Returns a copy of the string with all Unicode letters mapped to their upper case.
   225  
   226    * `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.
   227  
   228    * `values(map)` - Returns a JSON-encoded list of the map values, in the order of the keys returned by the `keys` function.
   229  
   230  ## Templates
   231  
   232  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.
   233  
   234  A template resource looks like:
   235  
   236  ```
   237  resource "template_file" "example" {
   238    template = "${hello} ${world}!"
   239    vars {
   240      hello = "goodnight"
   241      world = "moon"
   242    }
   243  }
   244  
   245  output "rendered" {
   246    value = "${template_file.example.rendered}"
   247  }
   248  ```
   249  
   250  Then the rendered value would be `goodnight moon!`.
   251  
   252  You may use any of the built-in functions in your template.
   253  
   254  ### Using Templates with Count
   255  
   256  Here is an example that combines the capabilities of templates with the interpolation
   257  from `count` to give us a parametized template, unique to each resource instance:
   258  
   259  ```
   260  variable "count" {
   261    default = 2
   262  }
   263  
   264  variable "hostnames" {
   265    default = {
   266      "0" = "example1.org"
   267      "1" = "example2.net"
   268    }
   269  }
   270  
   271  resource "template_file" "web_init" {
   272    // here we expand multiple template_files - the same number as we have instances
   273    count    = "${var.count}"
   274    template = "${file("templates/web_init.tpl")}"
   275    vars {
   276      // that gives us access to use count.index to do the lookup
   277      hostname = "${lookup(var.hostnames, count.index)}"
   278    }
   279  }
   280  
   281  resource "aws_instance" "web" {
   282    // ...
   283    count = "${var.count}"
   284    // here we link each web instance to the proper template_file
   285    user_data = "${element(template_file.web_init.*.rendered, count.index)}"
   286  }
   287  ```
   288  
   289  With this, we will build a list of `template_file.web_init` resources which we can
   290  use in combination with our list of `aws_instance.web` resources.
   291  
   292  ## Math
   293  
   294  Simple math can be performed in interpolations:
   295  
   296  ```
   297  variable "count" {
   298    default = 2
   299  }
   300  
   301  resource "aws_instance" "web" {
   302    // ...
   303    count = "${var.count}"
   304  
   305    // tag the instance with a counter starting at 1, ie. web-001
   306    tags {
   307      Name = "${format("web-%03d", count.index + 1)}"
   308    }
   309  }
   310  ```
   311  
   312  The supported operations are:
   313  
   314  - *Add* (`+`), *Subtract* (`-`), *Multiply* (`*`), and *Divide* (`/`) for **float** types
   315  - *Add* (`+`), *Subtract* (`-`), *Multiply* (`*`), *Divide* (`/`), and *Modulo* (`%`) for **integer** types
   316  
   317  -> **Note:** Since Terraform allows hyphens in resource and variable names,
   318  it's best to use spaces between math operators to prevent confusion or unexpected
   319  behavior. For example, `${var.instance-count - 1}` will subtract **1** from the
   320  `instance-count` variable value, while `${var.instance-count-1}` will interpolate
   321  the `instance-count-1` variable value.