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