Updated on 2023-12-13 GMT+08:00

Expressions

Expressions refer to or compute values within a configuration. The simplest expressions are just literal values, like hello world or 5. Terraform allows multiple expressions such as operators, conditional expressions, and built-in functions.

You can experience and test expressions and built-in functions using the Terraform expression console, by running the terraform console command.

Operators

Operators perform specific mathematical or logical operations. Terraform supports the following types of operators:

  • Arithmetic operators: expect number values and produce number values as results, including +, - (subtraction), *, /, %, and - (multiplication by -1).
  • Equality operators: both take two values of any type and produce bool values as results, including == and ! =.
  • Comparison operators: expect number values and produce bool values as results, including >, >=, <, and <=.
  • Logical operators: expect bool values and produce bool values as results, including ||, &&, and !.

When multiple operators are used together in an expression, they are evaluated in the following order of operations:

  1. !, - (multiplication by -1)
  2. *, /, %
  3. +, - (subtraction)
  4. >, >=, <, <=
  5. ==, !=
  6. &&
  7. ||

Conditional Expressions

A conditional expression uses the value of a bool expression to select one of two values. The syntax is as follows:

condition ? true_value : false_value

This statement indicates that if condition is true, the result is true_value. Otherwise, the result is false_value. The result of a conditional expression can be of any type, but the types of true_value and false_value must be the same. A common use of conditional expressions is to define defaults to replace invalid values:

var.a != "" ? var.a : "default-a"

This statement indicates that if var.a is not empty, the actual value of var.a is returned. Otherwise, the result is default-a.

For Expressions

A for expression creates a set type by traversing and transforming each element in another set type (map, list, or set). The type of brackets around the for expression decide what type of result it produces.

  • Using [ and ] will generate a list.
  • Using { and } will generate a map or object.

Assume that the value of mylist is ["AA", "BBB", "CCCC"]. You can use the for expression to convert each string element in mylist to lowercase and output another list.

> [for str in var.mylist : lower(str)]
[
  "aa",    
  "bbb",
  "cccc", 
]

You can also output a map, which is determined by =>:

> {for str in var.mylist : str => lower(str)}
{
  "AA" = "aa"    
  "BBB" = "bbb"
  "CCCC" = "cccc" 
}

The for expression can also convert a map. Assume that the value of mymap is {element1="aaa", element2="bbb", element3="ccc"}. You can convert each value in the map to uppercase.

> {for key, value in var.mymap : key => upper(value)}
{
  "element1 = "AAA"    
  "element2 = "BBB"
  "element3 = "CCC" 
}

In addition, the for expression can use the if clause to filter elements:

> [for str in var.list : upper(str) if length(str) >= 3] 
[
  "bbb",    
  "cccc",
]