Bird
Raised Fist0
Terraformcloud~10 mins

Splat expressions in Terraform - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Splat expressions
Start with list of objects
↓
Apply splat expression: *.attribute
↓
Terraform extracts attribute from each object
↓
Create new list with extracted values
↓
Use new list in configuration or output
Splat expressions take a list of objects and extract a specific attribute from each, producing a new list of those attribute values.
Execution Sample
Terraform
resource "aws_instance" "example" {
  count = 3
  ami           = "ami-123456"
  instance_type = "t2.micro"
}

output "instance_ids" {
  value = aws_instance.example[*].id
}
This code creates 3 AWS instances and outputs a list of their IDs using a splat expression.
Process Table
StepActionInput ListSplat ExpressionResulting List
1Create 3 instances[]N/A[instance0, instance1, instance2]
2Apply splat expression[instance0, instance1, instance2]*.id[id0, id1, id2]
3Output list of IDs[id0, id1, id2]N/A["i-abc123", "i-def456", "i-ghi789"]
4EndN/AN/AOutput ready with 3 instance IDs
💡 All instances created and their IDs extracted into a list for output.
Status Tracker
VariableStartAfter Step 1After Step 2Final
aws_instance.example[][instance0, instance1, instance2][instance0, instance1, instance2][instance0, instance1, instance2]
aws_instance.example[*].idN/AN/A[id0, id1, id2]["i-abc123", "i-def456", "i-ghi789"]
output.instance_idsN/AN/AN/A["i-abc123", "i-def456", "i-ghi789"]
Key Moments - 3 Insights
Why does aws_instance.example[*].id produce a list instead of a single value?
Because aws_instance.example is a list of instances, the splat expression *.id extracts the id attribute from each instance, resulting in a list of IDs as shown in execution_table step 2.
Can splat expressions be used on single objects?
No, splat expressions work on lists. If you use them on a single object, Terraform will return an error or unexpected result. See execution_table step 1 where the input is a list.
What happens if one instance does not have an id attribute?
Terraform will fail during apply because the splat expression expects all objects to have the attribute. This is implied in execution_table step 2 where all instances have ids.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what does the splat expression aws_instance.example[*].id return?
AA list of instance IDs
BA single instance ID
CA list of instance objects
DAn error
💡 Hint
Refer to the 'Resulting List' column in step 2 of execution_table.
At which step does Terraform create the actual instances?
AStep 3
BStep 2
CStep 1
DStep 4
💡 Hint
Check the 'Action' column in execution_table for instance creation.
If the count was changed to 2, how would the output list change in the variable_tracker?
AIt would have 3 IDs
BIt would have 2 IDs
CIt would be empty
DIt would cause an error
💡 Hint
Look at the 'After Step 2' and 'Final' columns for aws_instance.example[*].id in variable_tracker.
Concept Snapshot
Splat expressions in Terraform extract attributes from each object in a list.
Syntax: resource_list[*].attribute
Returns a list of attribute values.
Useful for outputs or passing lists of values.
Works only on lists, not single objects.
Full Transcript
Splat expressions let you take a list of resources and get a list of one attribute from each. For example, if you create multiple AWS instances, you can get all their IDs in one list using aws_instance.example[*].id. This works because the splat expression applies the attribute extraction to each item in the list. The execution steps show creating instances, applying the splat, and outputting the list of IDs. Variables track the list of instances and their IDs as they change. Key points include that splat expressions only work on lists and that all objects must have the attribute. The quizzes check understanding of what the splat returns, when instances are created, and how changing count affects the output list.

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