OpenTofu Error: 'Invalid count argument' — Cause, Fix, and Troubleshooting Guide
Fix OpenTofu 'Error: Invalid count argument' when count depends on values not known until apply, using -target, for_each, or static inputs.
- #opentofu
- #iac
- #troubleshooting
- #errors
Fixing errors like this? Get 500 free DevOps AI prompts
500 copy-paste AI prompts for the stack you actually run — one PDF, free.
Overview
count sets how many instances of a resource to create, and OpenTofu must know that number during plan — before anything is created. If count depends on an attribute that is only known after apply (like another resource’s computed ID), OpenTofu cannot expand the resource and stops:
Error: Invalid count argument
on main.tf line 22, in resource "aws_subnet" "app":
22: count = length(data.aws_availability_zones.available.names)
The "count" value depends on resource attributes that cannot be determined
until apply, so OpenTofu cannot predict how many instances will be created.
To work around this, use the -target argument to first apply only the
resources that the count depends on.
Symptoms
tofu planfails withInvalid count argument.- The message says
countdepends on values not known until apply. - Common when
countis derived from a computed attribute of a not-yet-created resource. - Also appears when
countisnullor a non-number.
Common Root Causes
- count depends on computed values — e.g.,
length()of a resource attribute not yet created. - New dependency resource that must exist before its count can be known.
- count from a data source that itself depends on unbuilt infrastructure.
- null/undefined count — a variable resolved to
null. - Dynamic length where a static, known input would work.
How to diagnose
Read which expression feeds count:
tofu plan 2>&1 | sed -n '1,15p'
Determine whether the value is known at plan time using the console:
echo 'length(data.aws_availability_zones.available.names)' | tofu console
Check whether the dependency resource already exists in state:
tofu state list | grep availability_zones
Fixes
Prefer for_each over count when iterating over a set/map — it tolerates keys known at plan time and is stable across changes:
resource "aws_subnet" "app" {
for_each = toset(var.availability_zones)
availability_zone = each.value
cidr_block = cidrsubnet(var.vpc_cidr, 8, index(var.availability_zones, each.value))
}
Use a static, known input for the count instead of a computed one:
variable "az_count" { type = number, default = 3 }
resource "aws_subnet" "app" {
count = var.az_count
}
Two-phase apply with -target when you must depend on computed values — build the dependency first:
tofu apply -target=data.aws_availability_zones.available
tofu apply
What to watch out for
countneeds a plan-time-known number; anything computed by an uncreated resource will not work.for_eachover a static set is usually the right fix and avoids index churn when the list changes.-targetis a workaround, not a habit — it applies a subset and can mask ordering problems.- Guard against
null: give count-driving variables real defaults.
Related
- OpenTofu Error: ‘Invalid function argument’ — Cause, Fix, and Troubleshooting Guide
- OpenTofu Error: ‘Cycle’ — Cause, Fix, and Troubleshooting Guide
- for_each over a set vs. map keys in Terraform
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.