Bird
Raised Fist0
Terraformcloud~5 mins

Splat expressions in Terraform - Commands & Configuration

Choose your learning style10 modes available
Introduction
Sometimes you create many similar resources in Terraform and want to get a list of their attributes easily. Splat expressions help you collect these attributes from multiple resources into one list without writing each one manually.
When you create multiple virtual machines and want to get their IP addresses in a list.
When you have several storage buckets and need to list their names for output.
When you want to pass a list of resource IDs to another resource without typing each ID.
When you want to simplify your code by avoiding repeating similar attribute references.
When you want to output a list of all created resource names for documentation or monitoring.
Config File - main.tf
main.tf
resource "aws_instance" "example" {
  count         = 3
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

output "instance_ids" {
  value = aws_instance.example[*].id
}

This Terraform file creates three AWS EC2 instances using the count feature.

The output instance_ids uses a splat expression aws_instance.example[*].id to collect the IDs of all three instances into a list.

Commands
This command initializes the Terraform working directory, downloads necessary provider plugins, and prepares for deployment.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding latest version of hashicorp/aws... - Installing hashicorp/aws v4.0.0... - Installed hashicorp/aws v4.0.0 (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 command applies the Terraform configuration to create the resources defined in the file without asking for confirmation.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_instance.example[0]: Creating... aws_instance.example[1]: Creating... aws_instance.example[2]: Creating... aws_instance.example[0]: Creation complete after 10s [id=i-0123456789abcdef0] aws_instance.example[1]: Creation complete after 10s [id=i-0123456789abcdef1] aws_instance.example[2]: Creation complete after 10s [id=i-0123456789abcdef2] Apply complete! Resources: 3 added, 0 changed, 0 destroyed. Outputs: instance_ids = [ "i-0123456789abcdef0", "i-0123456789abcdef1", "i-0123456789abcdef2" ]
→
-auto-approve - Skip interactive approval before applying changes
This command shows the list of instance IDs collected by the splat expression in the output.
Terminal
terraform output instance_ids
Expected OutputExpected
["i-0123456789abcdef0", "i-0123456789abcdef1", "i-0123456789abcdef2"]
Key Concept

If you remember nothing else from this pattern, remember: splat expressions let you gather the same attribute from many resources into one simple list.

Common Mistakes
Using dot notation like aws_instance.example.id without the splat operator when multiple resources exist.
This causes an error because Terraform expects a single resource but finds many.
Use the splat expression aws_instance.example[*].id to get a list of all IDs.
Forgetting the asterisk (*) inside the square brackets in the splat expression.
Without the asterisk, Terraform does not treat it as a splat and will fail or return wrong data.
Always include the asterisk like aws_instance.example[*].attribute to collect attributes.
Summary
Use splat expressions with [*] to collect attributes from multiple resources into a list.
Apply Terraform configuration to create resources and see the collected output.
Use terraform output to view the list generated by the splat expression.

Practice

(1/5)
1.

What does a splat expression in Terraform do?

Example: aws_instance.example[*].id

easy
A. Collects the id attribute from all aws_instance.example resources into a list
B. Creates a new resource named id for each instance
C. Deletes all aws_instance.example resources
D. Filters instances with id equal to example

Solution

  1. Step 1: Understand the splat operator *

    The * means 'all items' in the list of resources.
  2. Step 2: Collect attribute values

    The expression aws_instance.example[*].id collects the id attribute from every instance in aws_instance.example.
  3. Final Answer:

    Collects the id attribute from all aws_instance.example resources into a list -> Option A
  4. Quick Check:

    Splat expression collects attributes [OK]
Hint: Remember: * means all items, collect their attributes [OK]
Common Mistakes:
  • Thinking splat creates or deletes resources
  • Confusing splat with filtering
  • Assuming splat returns a single value
2.

Which of the following is the correct syntax for a splat expression to get all name attributes from a resource list aws_s3_bucket.buckets?

easy
A. aws_s3_bucket.buckets[*].name
B. aws_s3_bucket.buckets.name[*]
C. aws_s3_bucket.buckets[].name
D. aws_s3_bucket.buckets.name

Solution

  1. Step 1: Identify splat operator position

    The splat operator * must come immediately after the resource list name inside square brackets.
  2. Step 2: Confirm attribute access

    The correct syntax is resource_list[*].attribute, so aws_s3_bucket.buckets[*].name is correct.
  3. Final Answer:

    aws_s3_bucket.buckets[*].name -> Option A
  4. Quick Check:

    Splat syntax = resource_list[*].attribute [OK]
Hint: Put * inside brackets right after resource list name [OK]
Common Mistakes:
  • Placing * after attribute name
  • Using [] without * inside
  • Omitting brackets for splat
3.

Given the Terraform code snippet:

resource "aws_instance" "web" {
  count = 3
  ami           = "ami-123456"
  instance_type = "t2.micro"
}

output "instance_ids" {
  value = aws_instance.web[*].id
}

What will be the output of instance_ids after deployment?

medium
A. A list of 0 elements because no instances are created
B. A list of 3 instance IDs, one for each created instance
C. An error because splat cannot be used with count
D. A single instance ID of the first instance

Solution

  1. Step 1: Understand resource count creates multiple instances

    The count = 3 creates 3 instances named aws_instance.web[0], aws_instance.web[1], and aws_instance.web[2].
  2. Step 2: Splat expression collects all instance IDs

    The expression aws_instance.web[*].id collects the id attribute from all 3 instances into a list.
  3. Final Answer:

    A list of 3 instance IDs, one for each created instance -> Option B
  4. Quick Check:

    count 3 + splat = list of 3 IDs [OK]
Hint: count creates multiple; splat collects all attributes [OK]
Common Mistakes:
  • Thinking splat fails with count
  • Expecting single ID instead of list
  • Assuming no instances created
4.

Identify the error in this Terraform snippet using splat expressions:

output "bucket_names" {
  value = aws_s3_bucket.buckets.name[*]
}
medium
A. Output blocks cannot use splat expressions
B. The resource name aws_s3_bucket.buckets is invalid
C. Missing quotes around the attribute name
D. The splat operator * is incorrectly placed after the attribute name

Solution

  1. Step 1: Check splat operator position

    The splat operator * must be inside brackets immediately after the resource list, not after the attribute.
  2. Step 2: Correct syntax

    The correct syntax is aws_s3_bucket.buckets[*].name, not aws_s3_bucket.buckets.name[*].
  3. Final Answer:

    The splat operator * is incorrectly placed after the attribute name -> Option D
  4. Quick Check:

    Splat must be after resource list, not attribute [OK]
Hint: Put * right after resource list in brackets, not after attribute [OK]
Common Mistakes:
  • Placing * after attribute name
  • Confusing resource and attribute order
  • Thinking output blocks disallow splat
5.

You have a list of AWS EC2 instances created with count = 4. You want to output a list of their public IPs but only for instances that have a tag Environment set to production. Which Terraform expression correctly uses splat and filtering?

hard
A. aws_instance.web[*].public_ip
B. aws_instance.web[*].tags.Environment == "production" ? aws_instance.web[*].public_ip : []
C. [for i in aws_instance.web : i.public_ip if i.tags.Environment == "production"]
D. aws_instance.web[?tags.Environment=="production"].public_ip

Solution

  1. Step 1: Understand splat collects all attributes without filtering

    The expression aws_instance.web[*].public_ip collects all public IPs, no filtering.
  2. Step 2: Use for-expression with condition for filtering

    The correct way to filter is using a for-expression with an if condition: [for i in aws_instance.web : i.public_ip if i.tags.Environment == "production"].
  3. Final Answer:

    [for i in aws_instance.web : i.public_ip if i.tags.Environment == "production"] -> Option C
  4. Quick Check:

    Filter with for-expression + if, not splat alone [OK]
Hint: Use for-expression with if to filter, splat alone can't filter [OK]
Common Mistakes:
  • Using splat without filtering
  • Trying to filter inside splat syntax
  • Using invalid filter syntax
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard