---
page_title: Type Constraints - Configuration Language
description: >-
  Learn how to use type constraints to validate user inputs to modules and
  resources.
---

# Type Constraints

Terraform module authors and provider developers can use detailed type
constraints to validate user-provided values for their input variables and
resource arguments. This requires some additional knowledge about Terraform's
type system, but allows you to build a more resilient user interface for your
modules and resources.

## Type Keywords and Constructors

Type constraints are expressed using a mixture of _type keywords_ and
function-like constructs called _type constructors._

* Type keywords are unquoted symbols that represent a static type.
* Type constructors are unquoted symbols followed by a pair of
  parentheses, which contain an argument that specifies more information about
  the type. Without its argument, a type constructor does not fully
  represent a type; instead, it represents a _kind_ of similar types.

Type constraints look like other kinds of Terraform
[expressions](/language/expressions), but are a special syntax. Within the
Terraform language, they are only valid in the `type` argument of an
[input variable](/language/values/variables).

## Primitive Types

A _primitive_ type is a simple type that isn't made from any other types. All
primitive types in Terraform are represented by a type keyword. The available
primitive types are:

* `string`: a sequence of Unicode characters representing some text, such
  as `"hello"`.
* `number`: a numeric value. The `number` type can represent both whole
  numbers like `15` and fractional values such as `6.283185`.
* `bool`: either `true` or `false`. `bool` values can be used in conditional
  logic.

### Conversion of Primitive Types

The Terraform language will automatically convert `number` and `bool` values
to `string` values when needed, and vice-versa as long as the string contains
a valid representation of a number or boolean value.

* `true` converts to `"true"`, and vice-versa
* `false` converts to `"false"`, and vice-versa
* `15` converts to `"15"`, and vice-versa

## Complex Types

A _complex_ type is a type that groups multiple values into a single value.
Complex types are represented by type constructors, but several of them
also have shorthand keyword versions.

There are two categories of complex types: collection types (for grouping
similar values), and structural types (for grouping potentially dissimilar
values).

### Collection Types

A _collection_ type allows multiple values of _one_ other type to be grouped
together as a single value. The type of value _within_ a collection is called
its _element type._ All collection types must have an element type, which is
provided as the argument to their constructor.

For example, the type `list(string)` means "list of strings", which is a
different type than `list(number)`, a list of numbers. All elements of a
collection must always be of the same type.

The three kinds of collection type in the Terraform language are:

* `list(...)`: a sequence of values identified by consecutive whole numbers
  starting with zero.

  The keyword `list` is a shorthand for `list(any)`, which accepts any
  element type as long as every element is the same type. This is for
  compatibility with older configurations; for new code, we recommend using
  the full form.
* `map(...)`: a collection of values where each is identified by a string label.

  The keyword `map` is a shorthand for `map(any)`, which accepts any
  element type as long as every element is the same type. This is for
  compatibility with older configurations; for new code, we recommend using
  the full form.

  Maps can be made with braces ({}) and colons (:) or equals signs (=):
  { "foo": "bar", "bar": "baz" } OR { foo = "bar", bar = "baz" }. Quotes
  may be omitted on keys, unless the key starts with a number, in which
  case quotes are required. Commas are required between key/value pairs
  for single line maps. A newline between key/value pairs is sufficient
  in multi-line maps.

  -> **Note:** Although colons are valid delimiters between keys and values, `terraform fmt` ignores them. In contrast, `terraform fmt` attempts to vertically align equals signs.
  
* `set(...)`: a collection of unique values that do not have any secondary
  identifiers or ordering.

### Structural Types

A _structural_ type allows multiple values of _several distinct types_ to be
grouped together as a single value. Structural types require a _schema_ as an
argument, to specify which types are allowed for which elements.

The two kinds of structural type in the Terraform language are:

* `object(...)`: a collection of named attributes that each have their own type.

  The schema for object types is `{ <KEY> = <TYPE>, <KEY> = <TYPE>, ... }` — a
  pair of curly braces containing a comma-separated series of `<KEY> = <TYPE>`
  pairs. Values that match the object type must contain _all_ of the specified
  keys, and the value for each key must match its specified type. (Values with
  _additional_ keys can still match an object type, but the extra attributes
  are discarded during type conversion.)
* `tuple(...)`: a sequence of elements identified by consecutive whole
  numbers starting with zero, where each element has its own type.

  The schema for tuple types is `[<TYPE>, <TYPE>, ...]` — a pair of square
  brackets containing a comma-separated series of types. Values that match the
  tuple type must have _exactly_ the same number of elements (no more and no
  fewer), and the value in each position must match the specified type for
  that position.

For example: an object type of `object({ name=string, age=number })` would match
a value like the following:

```hcl
{
  name = "John"
  age  = 52
}
```

Also, an object type of `object({ id=string, cidr_block=string })` would match
the object produced by a reference to an `aws_vpc` resource, like
`aws_vpc.example_vpc`; although the resource has additional attributes, they
would be discarded during type conversion.

Finally, a tuple type of `tuple([string, number, bool])` would match a value
like the following:

```hcl
["a", 15, true]
```

### Complex Type Literals

The Terraform language has literal expressions for creating tuple and object
values, which are described in
[Expressions: Literal Expressions](/language/expressions/types#literal-expressions) as
"list/tuple" literals and "map/object" literals, respectively.

Terraform does _not_ provide any way to directly represent lists, maps, or sets.
However, due to the automatic conversion of complex types (described below), the
difference between similar complex types is almost never relevant to a normal
user, and most of the Terraform documentation conflates lists with tuples and
maps with objects. The distinctions are only useful when restricting input
values for a module or resource.

### Conversion of Complex Types

Similar kinds of complex types (list/tuple/set and map/object) can usually be
used interchangeably within the Terraform language, and most of Terraform's
documentation glosses over the differences between the kinds of complex type.
This is due to two conversion behaviors:

* Whenever possible, Terraform converts values between similar kinds of complex
  types if the provided value is not the exact type requested. "Similar kinds"
  is defined as follows:
  * Objects and maps are similar.
    * A map (or a larger object) can be converted to an object if it has
      _at least_ the keys required by the object schema. Any additional
      attributes are discarded during conversion, which means map -> object
      -> map conversions can be lossy.
  * Tuples and lists are similar.
    * A list can only be converted to a tuple if it has _exactly_ the
      required number of elements.
  * Sets are _almost_ similar to both tuples and lists:
    * When a list or tuple is converted to a set, duplicate values are
      discarded and the ordering of elements is lost.
    * When a `set` is converted to a list or tuple, the elements will be
      in an arbitrary order. If the set's elements were strings, they will
      be in lexicographical order; sets of other element types do not
      guarantee any particular order of elements.
* Whenever possible, Terraform converts _element values_ within a complex type,
  either by converting complex-typed elements recursively or as described above
  in [Conversion of Primitive Types](#conversion-of-primitive-types).

For example: if a module argument requires a value of type `list(string)` and a
user provides the tuple `["a", 15, true]`, Terraform will internally transform
the value to `["a", "15", "true"]` by converting the elements to the required
`string` element type. Later, if the module uses those elements to set different
resource arguments that require a string, a number, and a bool (respectively),
Terraform will automatically convert the second and third strings back to the
required types at that time, since they contain valid representations of a
number and a bool.

On the other hand, automatic conversion will fail if the provided value
(including any of its element values) is incompatible with the required type. If
an argument requires a type of `map(string)` and a user provides the object
`{name = ["Kristy", "Claudia", "Mary Anne", "Stacey"], age = 12}`, Terraform
will raise a type mismatch error, since a tuple cannot be converted to a string.

## Dynamic Types: The "any" Constraint

The keyword `any` is a special construct that serves as a placeholder for a
type yet to be decided. `any` is not _itself_ a type: when interpreting a
value against a type constraint containing `any`, Terraform will attempt to
find a single actual type that could replace the `any` keyword to produce
a valid result.

For example, given the type constraint `list(any)`, Terraform will examine
the given value and try to choose a replacement for the `any` that would
make the result valid.

If the given value were `["a", "b", "c"]` -- whose physical type is
`tuple([string, string, string])`, Terraform analyzes this as follows:

* Tuple types and list types are _similar_ per the previous section, so the
  tuple-to-list conversion rule applies.
* All of the elements in the tuple are strings, so the type constraint
  `string` would be valid for all of the list elements.
* Therefore in this case the `any` argument is replaced with `string`,
  and the final concrete value type is `list(string)`.

All of the elements of a collection must have the same type, so conversion
to `list(any)` requires that all of the given elements must be convertible
to a common type. This implies some other behaviors that result from the
conversion rules described in earlier sections.

* If the given value were instead `["a", 1, "b"]` then Terraform would still
  select `list(string)`, because of the primitive type conversion rules, and
  the resulting value would be `["a", "1", "b"]` due to the string conversion
  implied by that type constraint.
* If the given value were instead `["a", [], "b"]` then the value cannot
  conform to the type constraint: there is no single type that both a string
  and an empty tuple can convert to. Terraform would reject this value,
  complaining that all elements must have the same type.

Although the above examples use `list(any)`, a similar principle applies to
`map(any)` and `set(any)`.

If you wish to apply absolutely no constraint to the given value, the `any`
keyword can be used in isolation:

```hcl
variable "no_type_constraint" {
  type = any
}
```

In this case, Terraform will replace `any` with the exact type of the given
value and thus perform no type conversion whatsoever.

## Optional Object Type Attributes

Terraform typically returns an error when it does not receive a value for specified object attributes. When you mark an attribute as optional, Terraform instead inserts a default value for the missing attribute. This allows the receiving module to describe an appropriate fallback behavior.

To mark attributes as optional, use the `optional` modifier in the object type constraint. The following example creates optional attribute `b` and optional attribute with a default value `c`.

```hcl
variable "with_optional_attribute" {
  type = object({
    a = string                # a required attribute
    b = optional(string)      # an optional attribute
    c = optional(number, 127) # an optional attribute with default value
  })
}
```

The `optional` modifier takes one or two arguments.
- **Type:** (Required) The first argument
specifies the type of the attribute.
- **Default:** (Optional) The second argument defines the default value that Terraform should use if the attribute is not present. This must be compatible with the attribute type. If not specified, Terraform uses a `null` value of the appropriate type as the default.

An optional attribute with a non-`null` default value is guaranteed to never have the value `null` within the receiving module. Terraform will substitute the default value both when a caller omits the attribute altogether and when a caller explicitly sets it to `null`, thereby avoiding the need for additional checks to handle a possible null value.

Terraform applies object attribute defaults top-down in nested variable types. This means that Terraform applies the default value you specify in the `optional` modifier first and then later applies any nested default values to that attribute.

### Example: Nested Structures with Optional Attributes and Defaults

The following example defines a variable for storage buckets that host a website. This variable type uses several optional attributes, including `website`, which is itself an optional `object` type that has optional attributes and defaults.

```hcl
variable "buckets" {
  type = list(object({
    name    = string
    enabled = optional(bool, true)
    website = optional(object({
      index_document = optional(string, "index.html")
      error_document = optional(string, "error.html")
      routing_rules  = optional(string)
    }), {})
  }))
}
```

The following example `terraform.tfvars` file specifies three bucket configurations for `var.buckets`.

- `production` sets the routing rules to add a redirect
- `archived` uses default configuration, but is disabled
- `docs` overrides the index and error documents to use text files

The `production` bucket does not specify the index and error documents, and the `archived` bucket omits the website configuration entirely. Terraform will use the default values specified in the `bucket` type constraint.

```hcl
buckets = [
  {
    name = "production"
    website = {
      routing_rules = <<-EOT
      [
        {
          "Condition" = { "KeyPrefixEquals": "img/" },
          "Redirect"  = { "ReplaceKeyPrefixWith": "images/" }
        }
      ]
      EOT
    }
  },
  {
    name = "archived"
    enabled = false
  },
  {
    name = "docs"
    website = {
      index_document = "index.txt"
      error_document = "error.txt"
    }
  },
]
```

This configuration produces the following variable values.

- For the `production` and `docs` buckets, Terraform sets `enabled` to `true`. Terraform also supplies default values for `website`, and then the values specified in `docs` override those defaults.
- For the `archived` and `docs` buckets, Terraform sets `routing_rules` to a `null` value. When Terraform does not receive optional attributes and there are no specified defaults, Terraform populates those attributes with a `null` value.
- For the `archived` bucket, Terraform populates the `website` attribute with the default values specified in the `buckets` type constraint.

```hcl
tolist([
  {
    "enabled" = true
    "name" = "production"
    "website" = {
      "error_document" = "error.html"
      "index_document" = "index.html"
      "routing_rules" = <<-EOT
      [
        {
          "Condition" = { "KeyPrefixEquals": "img/" },
          "Redirect"  = { "ReplaceKeyPrefixWith": "images/" }
        }
      ]

      EOT
    }
  },
  {
    "enabled" = false
    "name" = "archived"
    "website" = {
      "error_document" = "error.html"
      "index_document" = "index.html"
      "routing_rules" = tostring(null)
    }
  },
  {
    "enabled" = true
    "name" = "docs"
    "website" = {
      "error_document" = "error.txt"
      "index_document" = "index.txt"
      "routing_rules" = tostring(null)
    }
  },
])
```

### Example: Conditionally setting an optional attribute

Sometimes the decision about whether or not to set a value for an optional argument needs to be made dynamically based on some other data. In that case, the calling `module` block can use a conditional expression with `null` as one of its result arms to represent dynamically leaving the argument unset.

With the `variable "buckets"` declaration shown in the previous section, the following example conditionally overrides the `index_document` and `error_document` settings in the `website` object based on a new variable `var.legacy_filenames`:

```hcl
variable "legacy_filenames" {
  type     = bool
  default  = false
  nullable = false
}

module "buckets" {
  source = "./modules/buckets"

  buckets = [
    {
      name = "maybe_legacy"
      website = {
        error_document = var.legacy_filenames ? "ERROR.HTM" : null
        index_document = var.legacy_filenames ? "INDEX.HTM" : null
      }
    },
  ]
}
```

When `var.legacy_filenames` is set to `true`, the call will override the document filenames. When it is `false`, the call will leave the two filenames unspecified, thereby allowing the module to use its specified default values.
