Terraform Error: 'Invalid ignore_changes' cannot ignore a required argument
Fix Terraform's 'Invalid ignore_changes' error: ignore_changes references an unknown attribute or a required argument, or uses all incorrectly. Diagnose and correct the lifecycle block.
- #terraform
- #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.
Exact Error Message
╷
│ Error: Invalid ignore_changes wildcard
│
│ on main.tf line 14, in resource "aws_instance" "web":
│ 14: ignore_changes = ["all", tags]
│
│ The ignore_changes argument accepts either the keyword "all" as its
│ sole element, or a list of resource attribute references, but not both.
╵
You may also see a closely related variant when the referenced attribute does not exist on the resource:
│ Error: Invalid expression
│
│ on main.tf line 14, in resource "aws_instance" "web":
│ 14: ignore_changes = [tag]
│
│ A single static variable reference is required: only attribute names and
│ object keys are allowed here.
What It Means
The ignore_changes list inside a lifecycle block tells Terraform to stop tracking drift on specific attributes after a resource is created. Terraform validates this list at parse time: each element must be a bare reference to a top-level argument or a nested object key on this resource, and the special keyword all may only appear on its own.
The error fires when you mix all with named attributes, reference an attribute that the provider schema does not expose, misspell an argument, or try to ignore a computed-only (read-only) attribute that you never set. It is a configuration validation error, so it stops plan before any provider calls happen.
Common Causes
- Combining
"all"with named attributes in the same list — only one form is allowed. - A typo in the attribute name (
taginstead oftags,user_datamisspelled). - Referencing a nested block attribute with the wrong path, e.g.
ebs_block_device.volume_sizeinstead of the correct nested key. - Trying to ignore a required argument — the provider still needs a value, so ignoring it is meaningless and rejected.
- Quoting the attribute like a string (
ignore_changes = ["tags"]) on newer providers that expect a bare reference. - Copying a
lifecycleblock between resource types that do not share the attribute.
Diagnostic Commands
Validate the configuration to surface the exact line and reason:
terraform validate
Confirm which attributes the resource type actually supports by inspecting the provider schema:
terraform providers schema -json | jq '.provider_schemas[].resource_schemas."aws_instance".block.attributes | keys'
Check the current state to see what the attribute is really called and whether it is set:
terraform state show aws_instance.web
Run a plan to confirm the fix removes the error and produces the drift-suppression you expect:
terraform plan
Step-by-Step Resolution
-
Read the error’s line number and look at the offending
ignore_changeslist. Decide whether you meant to ignore everything or specific attributes. -
If you want to ignore all attributes, use
allalone and remove every other element:
lifecycle {
ignore_changes = all
}
- If you want to ignore specific attributes, list them as bare references (no quotes on modern Terraform) and drop
all:
resource "aws_instance" "web" {
ami = var.ami_id
instance_type = "t3.micro"
tags = {
Name = "web"
}
lifecycle {
ignore_changes = [tags, user_data]
}
}
-
Fix any misspelled or non-existent attribute names by cross-checking against the schema output from the diagnostic step. For nested blocks, reference the block and key precisely, e.g.
ignore_changes = [ebs_block_device]to ignore the whole block. -
If you were trying to ignore a required argument, remove it from
ignore_changes— you cannot ignore something the provider mandates. Instead, drive that value from a stable input variable so it does not drift. -
Re-validate and plan:
terraform validate && terraform plan
- Confirm the plan no longer proposes changes to the ignored attributes.
Prevention
- Prefer named attributes over
ignore_changes = all; the wildcard hides real drift and makes state divergence dangerous. - Use bare attribute references, not quoted strings, to stay compatible with current Terraform syntax.
- Verify attribute names against
terraform providers schema -jsonbefore adding them. - Keep
lifecycleblocks resource-specific — do not copy them wholesale between different resource types. - Reserve
ignore_changesfor values mutated out-of-band (autoscaling tags, externally manageddesired_count), not for silencing legitimate diffs.
Related Errors
Invalid expression— a malformed reference insideignore_changes, usually a quoting or path mistake.Unsupported attribute— the referenced attribute genuinely does not exist on the resource.Argument is required— you removed a required argument that ignoring cannot substitute for.Objects have changed outside of Terraform— drift you may actually want to review rather than ignore.
Frequently Asked Questions
Can I combine all with specific attributes? No. all must be the sole element of the list. To ignore multiple named attributes, list only those attributes and omit all.
Why is my quoted attribute name rejected? Recent Terraform versions expect bare references (tags, not "tags") inside ignore_changes. Remove the quotes.
Can I ignore a required argument? No. Required arguments must always carry a value, so Terraform rejects ignoring them. Feed the value from a stable variable instead.
How do I ignore a nested block attribute? Reference the nested path with dots or ignore the whole block by its name; check the provider schema for the exact key. For more IaC patterns, browse the prompt library.
Is ignore_changes = all ever a good idea? Rarely — it suppresses all drift detection, so use it only for imported resources you never intend to manage again. See more Terraform guides.
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.