Terraform dropped its 1.17 alpha on August 27 with one feature that infrastructure teams have been asking for since Terraform became the de facto IaC standard: a way to plan only what’s changing. The new -minimal-refresh flag skips cloud API calls for resources that aren’t in scope for changes. For anyone managing hundreds of resources in a single state, that’s not a minor quality-of-life tweak. That’s minutes back on every plan.
The Performance Fix Terraform Actually Needed
Every terraform plan has always done the same thing: refresh the current state of every resource in your state file before showing you what’s changing. Fifty resources? Fine. Five hundred? You’re waiting. A plan refreshing 500 resources against AWS can run 8–12 minutes in practice — the majority of that spent calling provider APIs for resources that aren’t changing at all.
The existing workarounds were ugly. -refresh=false skips the refresh entirely, meaning you’re flying blind on drift. -target scopes a plan to specific resources, but HashiCorp explicitly warns against using it routinely — it misses dependencies and produces incomplete plans. Neither is a real solution.
-minimal-refresh is. Run terraform plan -minimal-refresh and Terraform only calls the provider for resources that have proposed changes. Everything else uses cached state. You still detect drift in the resources you’re modifying. You just stop paying the API tax for everything you’re leaving alone.
| Approach | What Gets Refreshed | Drift Detection |
|---|---|---|
terraform plan | All resources | Full |
terraform plan -minimal-refresh | Changed resources only | Partial (changed resources) |
terraform plan -refresh=false | Nothing | None |
This is a stable addition in 1.17, not gated behind an experimental flag. Once 1.17 hits GA, you can use it in production workflows immediately.
Import Blocks in Modules: Three Years Later
Terraform introduced declarative import blocks in version 1.5. The idea: instead of running terraform import from the CLI and hoping nobody notices, you write an import block in your config, it shows up in plan output, it goes through code review, and it merges like everything else.
The problem: import blocks only worked at the root module level. If a resource lived inside a child module — which it almost certainly does in any well-organized codebase — you couldn’t use the declarative syntax to import it. You were back to the CLI. GitHub Issue #33474 tracked this gap for three years.
Terraform 1.17 alpha closes it. Import blocks now work inside child modules. You can co-locate an import block with the resource definition it’s importing, targeting the full module path:
import {
to = module.networking.aws_vpc.main
id = "vpc-0abcd1234"
}
That block goes in your root module, targeting the resource address inside module.networking. The import shows up in plan output, your team reviews it, it merges. No hidden CLI state manipulation. This feature arrived in the 1.16 alpha (July 2026) and carries into 1.17 — it’s likely GA-bound when 1.16 ships stable.
Deferred Actions: Plan Now, Apply Later
The third feature is experimental and worth knowing about even if you won’t use it today. Deferred actions, enabled with -allow-deferral, let Terraform handle resources whose count or for_each can’t be resolved at plan time because the value is “known after apply.”
This has always been a hard stop. If your for_each depended on the output of a resource being created in the same plan, Terraform errored. Your only option was two separate applies. With deferred actions enabled, Terraform defers the dependent resources to the next apply automatically, preserving dependency ordering without the manual split.
This is behind an experimental flag, only in alpha builds, and will evolve before stabilizing. But it signals where Terraform is heading: a planner that can reason about multi-stage dependency chains without requiring manual intervention.
Should You Try the Alpha?
The alpha is available on GitHub. If you want to benchmark -minimal-refresh against your existing plan times in a non-production environment, that’s what alpha releases are for. HashiCorp publishes alphas specifically to collect feedback before GA.
Don’t run it in production. Alpha builds can carry breaking changes between releases. The documented, stable plan flags are what the production channel is for.
If you’re on OpenTofu, import-in-modules landed there earlier in 2026. Terraform is catching up on that front. -minimal-refresh is Terraform-specific for now with no OpenTofu equivalent yet. For teams grinding through slow CI plan runs on monolithic states, the import block reference is worth reading while you wait for GA.













