Bird
Raised Fist0
Terraformcloud~5 mins

Object type definition in Terraform - Commands & Configuration

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Sometimes you want to group related settings together in Terraform. Object type lets you define a fixed structure with named fields. This helps keep your configuration clear and organized.
When you want to pass multiple related values as one input to a module.
When you want to define a variable with specific named properties.
When you want to output a structured set of values from your Terraform code.
When you want to validate that input values have the right shape and types.
When you want to avoid errors by enforcing a fixed format for complex data.
Config File - main.tf
main.tf
variable "server_config" {
  type = object({
    name    = string
    cpu     = number
    memory  = number
    enabled = bool
  })
  default = {
    name    = "my-server"
    cpu     = 2
    memory  = 4096
    enabled = true
  }
}

output "server_name" {
  value = var.server_config.name
}

This file defines a variable named server_config with an object type. The object has four fields: name (text), cpu (number), memory (number), and enabled (true/false).

The default block sets example values for these fields.

The output server_name shows how to access a field from the object.

Commands
This command sets up Terraform in the current folder. It downloads any needed plugins and prepares to run your configuration.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding latest version of hashicorp/random... - Installing hashicorp/random v3.4.3... - Installed hashicorp/random v3.4.3 (signed by HashiCorp) Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure.
This checks your Terraform files for syntax errors and type mistakes before applying changes.
Terminal
terraform validate
Expected OutputExpected
Success! The configuration is valid.
This command applies your Terraform configuration to create or update infrastructure. The flag skips the confirmation prompt.
Terminal
terraform apply -auto-approve
Expected OutputExpected
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # null_resource.example will be created + resource "null_resource" "example" { + id = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. null_resource.example: Creating... null_resource.example: Creation complete after 0s [id=1234567890] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
-auto-approve - Skip manual approval prompt
This shows the value of the output named server_name, which reads the name field from the object variable.
Terminal
terraform output server_name
Expected OutputExpected
my-server
Key Concept

If you remember nothing else from this pattern, remember: object type lets you group related values with fixed names and types for clearer, safer Terraform code.

Common Mistakes
Defining an object variable but missing a required field in the input.
Terraform will error because the object expects all fields to be present and correctly typed.
Always provide all fields defined in the object type with the correct data types.
Using a map or list instead of an object when fixed field names are needed.
Maps and lists do not enforce field names, so you lose structure and safety.
Use object type when you want fixed named fields with specific types.
Summary
Define an object type variable with named fields and their types.
Initialize Terraform and validate your configuration to catch errors early.
Apply the configuration to create or update infrastructure.
Use outputs to access specific fields from the object variable.

Practice

(1/5)
1. What is the main purpose of defining an object type in Terraform?
easy
A. To group related values with specific names and types
B. To create a list of strings
C. To define a single integer value
D. To write shell scripts inside Terraform

Solution

  1. Step 1: Understand object type concept

    An object type groups multiple related values, each with a name and a type.
  2. Step 2: Compare with other types

    Unlike lists or single values, objects organize structured data clearly.
  3. Final Answer:

    To group related values with specific names and types -> Option A
  4. Quick Check:

    Object type = group related named values [OK]
Hint: Objects group named values, not single or list values [OK]
Common Mistakes:
  • Confusing object with list or map types
  • Thinking object holds only one value
  • Assuming object is for scripting
2. Which of the following is the correct syntax to define an object type with a string field name and a number field age in Terraform?
easy
A. object({ name string, age number })
B. object({ name: string, age: number })
C. object({ "name" = string, "age" = number })
D. object({ name = string, age = number })

Solution

  1. Step 1: Recall object type syntax

    Terraform object types use curly braces with unquoted identifier keys and equal signs: object({ key = type, ... })
  2. Step 2: Check each option

    object({ name = string, age = number }) correctly uses unquoted keys and equal signs. Others use invalid syntax like colons, quoted keys for simple identifiers, or missing equals.
  3. Final Answer:

    object({ name = string, age = number }) -> Option D
  4. Quick Check:

    Object keys unquoted with = sign [OK]
Hint: Object keys use unquoted identifiers with = type [OK]
Common Mistakes:
  • Using colons instead of equal signs
  • Quoting keys in object type
  • Omitting commas or using wrong separators
3. Given this variable definition in Terraform:
variable "person" {
  type = object({
    name = string
    age  = number
  })
  default = {
    name = "Alice"
    age  = 30
  }
}
What will be the value of var.person.age?
medium
A. "30"
B. 30
C. null
D. Error: type mismatch

Solution

  1. Step 1: Analyze variable type and default

    The variable is an object with fields name (string) and age (number). Default sets age to 30 (number).
  2. Step 2: Determine var.person.age value

    Accessing var.person.age returns the number 30 as defined.
  3. Final Answer:

    30 -> Option B
  4. Quick Check:

    Object field age = 30 number [OK]
Hint: Object fields keep their defined types and values [OK]
Common Mistakes:
  • Thinking number becomes string automatically
  • Expecting null if not accessed
  • Confusing default with no value
4. Identify the error in this Terraform object type definition:
variable "config" {
  type = object({
    "enabled" = bool
    "count" = int
  })
  default = {
    enabled = true
    count = 3
  }
}
medium
A. The type int is invalid; should be number
B. Keys in object type should not be quoted
C. Default values must be strings
D. Boolean values cannot be used in objects

Solution

  1. Step 1: Check type names in object

    Terraform uses number for numeric types, not int.
  2. Step 2: Validate other syntax

    Quoted keys are allowed, default values match types, booleans are valid.
  3. Final Answer:

    The type int is invalid; should be number -> Option A
  4. Quick Check:

    Use number, not int, for numeric types [OK]
Hint: Use 'number' type, not 'int' in Terraform objects [OK]
Common Mistakes:
  • Using 'int' instead of 'number'
  • Thinking keys cannot be quoted
  • Believing booleans are invalid in objects
5. You want to define a Terraform variable that accepts an object with a name (string), tags (map of strings), and an optional count (number). Which is the correct way to define this object type?
hard
A. object({ name = string, tags = map(string), count = number })
B. object({ "name" = string, "tags" = map(string), "count" = optional(number) })
C. object({ name = string, tags = map(string), count = optional(number) })
D. object({ name = string, tags = map(string), count = optional number })

Solution

  1. Step 1: Recall optional attribute syntax

    Terraform uses optional(type) without quotes for optional fields inside object types.
  2. Step 2: Check key quoting rules

    Keys in object type definitions use unquoted identifiers for standard names; quoting simple keys is incorrect.
  3. Step 3: Evaluate options

    object({ name = string, tags = map(string), count = optional(number) }) correctly uses unquoted keys and optional(number) syntax. object({ "name" = string, "tags" = map(string), "count" = optional(number) }) quotes keys incorrectly. object({ name = string, tags = map(string), count = number }) misses optional. object({ name = string, tags = map(string), count = optional number }) has invalid syntax.
  4. Final Answer:

    object({ name = string, tags = map(string), count = optional(number) }) -> Option C
  5. Quick Check:

    Optional fields use optional(type) with unquoted keys [OK]
Hint: Use optional(type) without quotes and unquoted keys [OK]
Common Mistakes:
  • Quoting keys in object type
  • Missing optional() for optional fields
  • Using invalid syntax like 'optional number'