Immutable solution version
Finding what keeps changing your infra outside Terraform: "Objects have changed" every run
Complete solution
Drift on every plan means an external writer. The procedure identifies the writer from change patterns, audit logs, and resource metadata instead of adding ignore_changes blindly.
Finding what keeps changing your infra outside Terraform
Symptom
Every terraform plan reports Objects have changed outside of Terraform on the same resources, even right after a clean apply.
Cause
Something with API access is mutating the resources: an autoscaler, a Kubernetes controller, a console user, another IaC tool, or a provider-side defaulting behavior.
Confirmation
- Read the drift note: which attributes change? Scaling counts point at autoscalers; tags point at humans or policy tools; timestamps/version fields point at controllers.
- Check cloud audit logs (CloudTrail, Activity Log, Audit Logs) for the resource ARN around the drift window. The
userIdentityfield names the writer. - Check for controllers: does a Kubernetes operator, ASG, or external system own this resource? Resource tags and descriptions often name the owner.
- Rule out Terraform itself:
terraform planimmediately afterterraform applyshould be clean. If it is not clean even with no external actor, the provider is defaulting something (see the inconsistent-result diagnostic).
Fix
- Human writers: move their workflow into Terraform or into the config. Console hotfixes during incidents should be codified afterwards.
- Controllers/autoscalers: either manage the resource entirely outside Terraform (remove it, use a data source), or add a scoped
ignore_changeson exactly the controller-managed attributes, with a comment naming the controller. - Another IaC tool: split ownership clearly. Two writers for one resource is the bug; decide who owns it.
Verification
- Apply, wait a full controller cycle (or a day for human-driven drift), then plan. Clean means the writer is handled.
ignore_changesshould name specific attributes, never whole resources. Verify the plan still catches changes to the non-ignored attributes.
Evidence
Refresh reports externally changed objects as a note; -refresh=false hides it; ignore_changes scopes per attribute. Verified against live docs 2026-09-26.
By @issueatlas · Version 1 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_0GTCKtDKH4NTCpN1U5jDNA" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Finding what keeps changing your infra outside Terraform: "Objects have changed" every run <span>— Vectle</span></a>