github.com/icebourg/terraform@v0.6.5-0.20151015205227-263cc1b85535/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    * `compact(list)` - Removes empty string elements from a list. This can be
    84       useful in some cases, for example when passing joined lists as module
    85       variables or when parsing module outputs.
    86       Example: `compact(module.my_asg.load_balancer_names)`
    87  
    88    * `concat(list1, list2)` - Combines two or more lists into a single list.
    89       Example: `concat(aws_instance.db.*.tags.Name, aws_instance.web.*.tags.Name)`
    90  
    91    * `element(list, index)` - Returns a single element from a list
    92        at the given index. If the index is greater than the number of
    93        elements, this function will wrap using a standard mod algorithm.
    94        A list is only possible with splat variables from resources with
    95        a count greater than one.
    96        Example: `element(aws_subnet.foo.*.id, count.index)`
    97  
    98    * `file(path)` - Reads the contents of a file into the string. Variables
    99        in this file are _not_ interpolated. The contents of the file are
   100        read as-is.
   101  
   102    * `format(format, args...)` - Formats a string according to the given
   103        format. The syntax for the format is standard `sprintf` syntax.
   104        Good documentation for the syntax can be [found here](http://golang.org/pkg/fmt/).
   105        Example to zero-prefix a count, used commonly for naming servers:
   106        `format("web-%03d", count.index + 1)`.
   107  
   108    * `formatlist(format, args...)` - Formats each element of a list
   109        according to the given format, similarly to `format`, and returns a list.
   110        Non-list arguments are repeated for each list element.
   111        For example, to convert a list of DNS addresses to a list of URLs, you might use:
   112        `formatlist("https://%s:%s/", aws_instance.foo.*.public_dns, var.port)`.
   113        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.
   114        Example:
   115        `formatlist("instance %v has private ip %v", aws_instance.foo.*.id, aws_instance.foo.*.private_ip)`.
   116        Passing lists with different lengths to formatlist results in an error.
   117  
   118    * `index(list, elem)` - Finds the index of a given element in a list. Example:
   119        `index(aws_instance.foo.*.tags.Name, "foo-test")`
   120  
   121    * `join(delim, list)` - Joins the list with the delimiter. A list is
   122        only possible with splat variables from resources with a count
   123        greater than one. Example: `join(",", aws_instance.foo.*.id)`
   124  
   125    * `length(list)` - Returns a number of members in a given list
   126        or a number of characters in a given string.
   127        * `${length(split(",", "a,b,c"))}` = 3
   128        * `${length("a,b,c")}` = 5
   129  
   130    * `lookup(map, key)` - Performs a dynamic lookup into a mapping
   131        variable. The `map` parameter should be another variable, such
   132        as `var.amis`.
   133  
   134    * `replace(string, search, replace)` - Does a search and replace on the
   135        given string. All instances of `search` are replaced with the value
   136        of `replace`. If `search` is wrapped in forward slashes, it is treated
   137        as a regular expression. If using a regular expression, `replace`
   138        can reference subcaptures in the regular expression by using `$n` where
   139        `n` is the index or name of the subcapture. If using a regular expression,
   140        the syntax conforms to the [re2 regular expression syntax](https://code.google.com/p/re2/wiki/Syntax).
   141  
   142    * `split(delim, string)` - Splits the string previously created by `join`
   143        back into a list. This is useful for pushing lists through module
   144        outputs since they currently only support string values. Depending on the
   145        use, the string this is being performed within may need to be wrapped
   146        in brackets to indicate that the output is actually a list, e.g.
   147        `a_resource_param = ["${split(",", var.CSV_STRING)}"]`.
   148        Example: `split(",", module.amod.server_ids)`
   149  
   150  ## Templates
   151  
   152  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.
   153  
   154  A template resource looks like:
   155  
   156  ```
   157  resource "template_file" "example" {
   158      filename = "template.txt"
   159      vars {
   160          hello = "goodnight"
   161          world = "moon"
   162      }
   163  }
   164  
   165  output "rendered" {
   166      value = "${template_file.example.rendered}"
   167  }
   168  ```
   169  
   170  Assuming `template.txt` looks like this:
   171  
   172  ```
   173  ${hello} ${world}!
   174  ```
   175  
   176  Then the rendered value would be `goodnight moon!`.
   177  
   178  You may use any of the built-in functions in your template.
   179  
   180  
   181  ### Using Templates with Count
   182  
   183  Here is an example that combines the capabilities of templates with the interpolation
   184  from `count` to give us a parametized template, unique to each resource instance:
   185  
   186  ```
   187  variable "count" {
   188    default = 2
   189  }
   190  
   191  variable "hostnames" {
   192    default = {
   193      "0" = "example1.org"
   194      "1" = "example2.net"
   195    }
   196  }
   197  
   198  resource "template_file" "web_init" {
   199    // here we expand multiple template_files - the same number as we have instances
   200    count = "${var.count}"
   201    filename = "templates/web_init.tpl"
   202    vars {
   203      // that gives us access to use count.index to do the lookup
   204      hostname = "${lookup(var.hostnames, count.index)}"
   205    }
   206  }
   207  
   208  resource "aws_instance" "web" {
   209    // ...
   210    count = "${var.count}"
   211    // here we link each web instance to the proper template_file
   212    user_data = "${element(template_file.web_init.*.rendered, count.index)}"
   213  }
   214  ```
   215  
   216  With this, we will build a list of `template_file.web_init` resources which we can
   217  use in combination with our list of `aws_instance.web` resources.
   218  
   219  ## Math
   220  
   221  Simple math can be performed in interpolations:
   222  
   223  ```
   224  variable "count" {
   225    default = 2
   226  }
   227  
   228  resource "aws_instance" "web" {
   229    // ...
   230    count = "${var.count}"
   231  
   232    // tag the instance with a counter starting at 1, ie. web-001
   233    tags {
   234      Name = "${format("web-%03d", count.index + 1)}"
   235    }
   236  }
   237  ```
   238  
   239  The supported operations are:
   240  
   241  - *Add*, *Subtract*, *Multiply*, and *Divide* for **float** types
   242  - *Add*, *Subtract*, *Multiply*, *Divide*, and *Modulo* for **integer** types
   243  
   244  -> **Note:** Since Terraform allows hyphens in resource and variable names,
   245  it's best to use spaces between math operators to prevent confusion or unexpected
   246  behavior. For example, `${var.instance-count - 1}` will subtract **1** from the
   247  `instance-count` variable value, while `${var.instance-count-1}` will interpolate
   248  the `instance-count-1` variable value.