What are splat expressions, and how do they relate to `for` expressions?

4 minintermediateterraformsplathcl

Quick Answer

The splat operator `[*]` is shorthand for the most common `for` expression pattern — pulling one attribute out of every element of a list. `aws_instance.web[*].id` is equivalent to `[for i in aws_instance.web : i.id]`, returning a list of every instance's ID when the resource uses `count`. It only handles this one shape (get one attribute from every item); anything requiring filtering, key transformation, or map output needs a full `for` expression instead. Splat is a readability shortcut for the simple case, not a replacement for `for` expressions generally.

Detailed Answer

The splat operator ([*]) shows up constantly in configurations using count, and it's easy to use without realizing it's really just a special case of the more general for expression.

Basic usage

resource "aws_instance" "web" {
  count = 3
  ami   = var.ami_id
}

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

aws_instance.web[*].id returns a list of every instance's id attribute — ["i-aaa", "i-bbb", "i-ccc"] — one entry per count index.

The equivalent for expression

output "instance_ids" {
  value = [for i in aws_instance.web : i.id]
}

These two produce identical results. Splat is purely a shorthand for "give me this one attribute from every element" — nothing more.

What splat can't do

  • Filtering: aws_instance.web[*].id always includes every instance; there's no if clause equivalent. To get only some instances' IDs, you need a real for expression.
  • Key transformation / map output: splat only ever produces a list. If you need a map (e.g., keyed by instance name), you must use {for ... : key => value}.
  • Nested attribute chains beyond simple property access: more complex per-element transformations (string formatting, combining multiple fields) generally read more clearly as an explicit for expression than a splat chain.

Legacy syntax note

Older Terraform configurations sometimes use the "legacy" splat form aws_instance.web.*.id (dot-based rather than bracket-based) — functionally equivalent to [*], but the bracket form is the modern, recommended syntax.

Interview-ready summary

Splat is a convenience shorthand covering the single most common for-expression pattern (pluck one attribute from every element of a list); reach for a full for expression the moment you need filtering, a map result, or any transformation beyond a plain attribute lookup.

Related Resources