I've migrated a few real environments from Terraform to OpenTofu now, and the good news is that a careful migration is almost boring. The state format is compatible, the CLI is a near drop-in, and the whole thing can be done with a rollback path at every step. The bad news is that "almost boring" still has a couple of sharp edges, and the teams that get hurt are the ones who skip the parity check and go straight to apply. Here's the calm, low-risk playbook I actually follow.

Step 0: Know what "low-risk" means here

The core insight that makes this safe: OpenTofu reads the same HCL and the same state file that Terraform does. A migration is not a rewrite — it's swapping which binary talks to your existing state. That means at almost every step, your rollback is just "keep using the terraform binary." As long as you don't trigger a one-way-door feature (more on those later), you can walk back.

So the whole strategy is: prove parity before you change anything real, change one thing at a time, and keep the old binary installed until you're confident.

Step 1: Check and pin your Terraform version first