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. Not the full reference manual.
TL;DR: 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. Read the drift note: which attributes change? Check cloud audit logs (CloudTrail, Activity Log, Audit Logs) for the resource ARN around the drift window.
The fix
TL;DR: 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. Read the drift note: which attributes change? Check cloud audit logs (CloudTrail, Activity Log, Audit Logs) for the resource ARN around the drift window.
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.
When to use this
- This covers exactly what the title says: Finding what keeps changing your infra outside Terraform.
- You are setting this up for the first time, or auditing an existing setup.
- You want the key gotchas in one place before you start.
When not to use this
- You are doing a different workflow with Finding; these steps are specific to the title above.
- You need the full reference docs; this is the short path, not the manual.
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 3 · 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>