Bird
Raised Fist0
Terraformcloud~30 mins

Splat expressions in Terraform - Mini Project: Build & Apply

Choose your learning style10 modes available
Using Splat Expressions in Terraform
📖 Scenario: You are managing cloud infrastructure using Terraform. You have multiple virtual machines (VMs) defined, and you want to collect their public IP addresses easily.
🎯 Goal: Create a Terraform configuration that defines three virtual machines with specific names and public IPs. Then, use a splat expression to extract all their public IP addresses into a list variable.
📋 What You'll Learn
Define a list variable vm_names with three VM names: "vm1", "vm2", "vm3"
Create three aws_instance resources using a for_each loop over vm_names
Each instance must have a public_ip attribute set to a unique IP string
Use a splat expression to create a list variable public_ips containing all public IPs from the instances
💡 Why This Matters
🌍 Real World
Splat expressions help you gather information from multiple cloud resources easily, such as collecting all IP addresses or IDs for further use.
💼 Career
Cloud engineers often need to manage many resources and extract their attributes efficiently; splat expressions simplify this process in Terraform.
Progress0 / 4 steps
1
Define the VM names list variable
Create a Terraform variable called vm_names as a list with these exact values: "vm1", "vm2", "vm3".
Terraform
Hint

Use variable "vm_names" with type = list(string) and set default to the list of names.

2
Create aws_instance resources using for_each
Create aws_instance resources named example using for_each over var.vm_names. Set the public_ip attribute to "10.0.0.${index(toset(var.vm_names), each.key) + 1}" for each instance.
Terraform
Hint

Use for_each = toset(var.vm_names) and set public_ip using the index of each key plus 1.

3
Use a splat expression to get all public IPs
Create a local variable called public_ips that uses a splat expression to collect all public_ip values from aws_instance.example resources.
Terraform
Hint

Use locals block and assign public_ips = aws_instance.example[*].public_ip.

4
Output the list of public IPs
Add an output block named all_public_ips that outputs the local variable public_ips.
Terraform
Hint

Use output "all_public_ips" block with value = local.public_ips.

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