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