CloudInfrastructure as code

Terraform 1.17 explained: what's new, who it touches and how we'd upgrade

Terraform 1.17.0 is out. It's a small upgrade for most teams, with variables in provider requirements, a faster -minimal-refresh plan that can hide drift, and Terraform Policy GA in the CLI. What it means, who does what, and how to roll back if the upgrade goes wrong.

Cohash Cloud Engineering Practice October 2026 updated October 2026 17 min read 6 chapters 3-question check
part 3 of 38 · Platform releases, explained from scratch
TERRAFORM 1.16 Fixed providerstrings Refresh everything Policy flagexperimental TERRAFORM 1.17 Vars in providersources -minimal-refreshoption Policy GA in the CLI

the ideaSmall release, faster plans, one catch: the fast plan can miss drift.

after reading, you can
  • Sort the 1.17 changes into ones that touch your pipelines and ones that can wait. Then plan around the first lot.
  • Spot when -minimal-refresh is safe and when it'll hide drift you need to see
  • Set up an upgrade to 1.17 that checks pins, parsers and certificate paths first

Terraform 1.17.0 came out on October 21, 2026. It's a small, safe upgrade for most teams, but test it in a lower environment first, and don't let the new fast-plan option be the last check before a production change. If your business runs on cloud infrastructure that someone manages with Terraform, this post tells you what to ask them.

in plain wordsRelease: plan the upgrade

Terraform builds your cloud from written files, and 1.17 changes how a plan gets checked

Most companies no longer click through a cloud console to set up servers, networks and databases. An engineer writes down what should exist in text files, and Terraform makes the cloud match. Before it changes anything, Terraform asks every cloud service what's really there and shows a preview. Version 1.17 lets teams skip part of that check to get the preview faster. It also lets one set of files point at different private plugin stores, and it makes rule checks (policy) a normal feature of the tool. Nothing here is urgent for security, but a careless upgrade can still break the pipelines that change your production systems.

think of it like this

Think of a builder working from blueprints. Before each job, a careful builder walks the whole site to see what's changed since the last visit. The new option lets the builder check only the rooms on today's job list. That's faster, but if someone knocked down a wall in another room, nobody notices until it matters.

who should care
  • Companies whose cloud is built with Terraform
  • Platform and DevOps teams
  • Teams on HCP Terraform or Enterprise
  • Security and compliance owners
  • Agencies running infrastructure for clients
  • Engineers write down the infrastructure they want in HCL, HashiCorp's configuration format. Those files go through code review like any other code.
  • Providers are plugins that talk to each service's API, like AWS, Azure, Snowflake or Okta. Terraform downloads them at init, so a broken registry stops everything.
  • A state file records what Terraform already manages. Lose it or corrupt it, and Terraform no longer knows what it built.
  • terraform plan previews a change, and terraform apply makes it. Most teams have someone read the plan in a pull request before anyone applies it.
  • IBM has owned HashiCorp since February 2025. Terraform moved to the BSL licence in August 2023, which your lawyers care about more than your pipelines do.
chapter 01

Why it matters to you

For a business owner, the risk sits in the pipeline that changes production. If an upgrade goes badly, deployments stop or a preview misses a change someone made by hand, and the next apply quietly overwrites it. Neither is dramatic, but both cost a day of engineering time and can leave a security setting different from what your auditors were told.

There's no attack to worry about in the 1.17 release itself. It's a 1.x minor release that keeps HashiCorp's compatibility promises, so most teams can move when it suits them. The one change that can break things on day one is the Go 1.26.10 certificate update, which also arrived in 1.16.7. If your private registry or proxy uses a certificate chain HashiCorp's new build stops trusting, both versions will fail to connect.

Oct 21, 2026Terraform 1.17.0 published on GitHub
3items under New Features in the 1.17.0 changelog
1.16.71.16 patch shipped the next day, October 22, 2026
Go 1.26.10toolchain for 1.17.0 and 1.16.7, which drops trust in compromised eMudhra intermediates

Most of what's in 1.17 helps platform teams that run Terraform for other teams. If you write a few modules for one account, you can take this release at your own pace.

  • Platform teams with one codebase and several private registries or organizations: set the provider source per environment and stop copying terraform blocks or patching them with scripts.
  • Teams whose large states run into provider rate limits get a supported halfway house between a full refresh and -refresh=false when they just want a quick plan.
  • If you write guardrails, you can run HCL policies from the Terraform CLI in CI now. Policies see a replacement as a create and a delete.
  • Anyone wrapping the CLI in scripts gets versioned JSON from terraform version, which makes it easier to notice when the format changes later.
  • Teams staying on 1.16 for now still get the Go 1.26.10 certificate change through 1.16.7.

If you run self-managed Terraform Enterprise or a shared terraform-mcp-server, check the two bulletins above first. They matter more than anything in the 1.17 changelog.

what changesWhat changes in a Terraform run from 1.16 to 1.17The run still goes from your files to a preview to the cloud. 1.17 changes three decisions along the way.
  1. 01 An engineer edits the files

    An engineer edits the files and opens a pull request. On 1.17 the provider address can come from a constant variable, so dev and prod stop needing separate copies.

  2. 02 terraform init installs plugins

    terraform init reads the provider list and downloads each plugin. init's log messages now include provider versions, which helps when an install fails.

  3. 03 Plan checks what's real

    Normally the plan asks the cloud about every resource. With -minimal-refresh it only asks about the ones you're changing, and drift elsewhere stays hidden.

  4. 04 Policy checks the preview

    Rules written as Terraform Policy can now run with -policies in a normal build. A replaced resource reaches them as a separate create and delete.

  5. 05 Apply changes the cloud

    Apply makes the change and updates the state file. That last step is the same as in 1.16, so a full-refresh plan before production still protects you.

chapter 02

What changed

Not much to read this time: three new features, three enhancements, seven bug fixes and two notes. Tags are HashiCorp's, except the notes, which we marked changed.

Terraform 1.17.0 at a glance

newVariables and locals in provider requirements

You can now take the source and version in required_providers from constant input variables and locals. Same rules as 1.15's dynamic module sources: nothing may depend on plan results.

newplan -minimal-refresh

Refreshes only the resource instances Terraform plans to change, so plans on big states make fewer API calls. Drift on unchanged resources goes unseen.

newTerraform Policy is GA in the CLI

The -policies flag for plan, apply and query no longer needs an experimental build or -allow-experimental-features. Query policies check resources that list blocks discover.

enhancedinit logs show provider versions

Log lines from terraform init now name the provider versions. Handy when you're working out why an install failed.

enhancedMock providers cover ephemeral resources

terraform test's mock_provider can now fake ephemeral resources, so a test of a module that uses them can run on mocks.

fixedEphemeral renewal diagnostics surface

Terraform used to drop warnings and errors from ephemeral resource renewals. It shows them now, so a few new warnings may turn up.

fixedlog and pow stop at infinity

No more panics from log and pow when the result isn't a number. They also error out now on plus or minus infinity, which nothing downstream could use anyway.

changedterraform version JSON gets format_version

There's a format_version field in terraform version -json now. If your tooling ignores unknown fields you're fine, but watch the field in later releases.

Provider requirements can now use variables, within limits. This builds on 1.15 (April 29, 2026), where module source and version started reading variables marked const = true and locals built from them. Now required_providers can too. Don't be thrown by HashiCorp's reference page for the terraform block, which still says it won't take input variables. The pull request's example uses an organization variable inside a private registry address and keeps the version in a local. Set the values with -var, a var file or environment variables.

This is useful if one codebase runs against more than one private registry or organization. Until now, teams in that position kept near-identical copies of the terraform block, or rewrote it with scripts before init. One limit doesn't move. The value has to be known before planning starts, so it can't come from a resource or a data source. Terraform 1.15 rejects that case at init for module sources with an "Invalid module source" error, and provider sources follow the same constraints.

A faster plan for big states, if you accept the trade-off. Normally a plan refreshes every resource it manages before doing anything else, which costs at least one read call each. On a state with thousands of resources, that's the slow part, and it's also when providers start rate limiting. Issue 35290 asked for a fix back in 2024, from someone who found -refresh=false too risky. -minimal-refresh has Terraform compare configuration with the prior state first. Instances with no planned change skip the refreshdefinitionBefore planning, Terraform asks each API what really exists and updates state to match. That's the refresh, and on big states it's the slow part., and the ones with changes are refreshed and planned again. Each one decides for itself, so refreshing one resource doesn't pull in the ones that depend on it.

The documentation is frank about the cost. Like -refresh=false, it ignores changes made outside Terraform to anything you didn't touch, so the plan can be incomplete or wrong. You can't combine it with refresh-only mode or with -refresh=false. HashiCorp also says to avoid it when you upgrade provider versions, so Terraform can write schema changes into state. We'd use it for fast feedback on pull requests and keep a full-refresh plan in front of every production apply.

Terraform Policy is out of experimental status in the CLI. For anyone who hasn't tried it, it's HashiCorp's HCL-based policy as code: .policy.hcl files with provider, resource and module blocks. HCP Terraform can evaluate them at setup time, before providers or modules download, at plan time and after apply, when IDs and ARNs exist. Enforcement is Advisory, Mandatory_overridable or Mandatory. Sentinel and Open Policy Agent haven't gone away.

From 1.17, -policies works on plan, apply and query in a normal build. Query policies check what your list blocks find and report as text or JSON. Before you call it production-ready, though, look at the docs too. HashiCorp's Terraform PolicydefinitionHashiCorp's policy as code, written in HCL and kept in .policy.hcl files. Someone writes a rule like no public storage buckets, and a plan that breaks a mandatory rule gets stopped before anything changes. docs (v0.5.x) still said "this functionality is in beta" when we checked on October 22, 2026. Easy to miss: the pull request the GA entry links to changes how policies see a replacement. It now arrives as a separate create and delete, each with its own attribute values. It used to be one update.

Smaller changes that can still show up in your pipeline. Two fixes could change output you're used to. Diagnostics from renewing ephemeral resources now appear, and HashiCorp doesn't expect that to break anything. log and pow now fail instead of returning infinity. If a wrapper parses terraform version -json, check that it tolerates the new format_version field. And if anything in your build trusts certificates through the compromised eMudhra intermediates, the Go 1.26.10 change in 1.17.0 and 1.16.7 will make those connections fail.

A quick sense of pace: a minor release every few months, a patch to the current one most weeks. Here's 1.17 next to the two before it, headline items only. The changelogs have everything else.

tableHeadline items from each changelog, so you can see what you skip if you jump straight from 1.15
Item1.151.161.17
ReleasedApril 29, 2026August 26, 2026October 21, 2026
Latest patch (Oct 22, 2026)1.15.9 (August 19, 2026)1.16.7 (October 22, 2026)1.17.0
Dynamic sources from const valuesModule source and version from const variables and localsNo change in the changelogProvider source and version from const variables and locals
ImportNo headline changeimport blocks work inside modulesNo headline change
Refresh and planningNo headline changeNo headline change-minimal-refresh option
PolicyNo mention in the changelogHCP Terraform policy summaries in the CLI; plugin credentials from the backendTerraform Policy GA for -policies on plan, apply and query
Lifecycle and actionsNo headline changelifecycle destroy = false; on_failure modes halt, taint, continueNo headline change
Platforms, output and syntaxWindows ARM64 builds; deprecated attribute on variables and outputsLinux s390x builds; graph -format=mermaid; state show -jsonformat_version in version JSON
Upgrade notesS3 backend FIPS and dual-stack env vars accept only true or falseProvisioners now apply bastion_host_key; check itNone listed; upgrade guide cites the 1.x promises

How long will 1.16 be supported? Nobody has published a date we can point you to. What we can see is that 1.16 is still getting patches: 1.16.7 arrived the day after 1.17.0. The support-period article now redirects to IBM's support portal, which didn't load for us without a sign-in, and the public 1.x compatibility promise only says the series gets at least 18 months of maintenance after 1.0. If you need a date for an audit or a contract, ask HashiCorp support.

A year of Terraform releases and advisories

  1. Nov 19, 2025
    Terraform 1.14.0

    Terraform gained list resources and the terraform query command, plus the actions block. You'll need query if you want 1.17's query policies.

  2. Apr 29, 2026
    Terraform 1.15.0

    Const variables in module sources came first, and 1.17 extends the idea to providers. Windows ARM64 builds and the convert function arrived too.

  3. Jul 6, 2026
    HCSEC-2026-17 (Terraform Enterprise)

    Module publishers could pull arbitrary files through VCS ingestion. Patch to 2.0.4 or 1.2.4.

  4. Jul 28, 2026
    HCSEC-2026-23 (terraform-mcp-server)

    Three CVEs in the HTTP transport. Fixed in 1.1.0.

  5. Aug 26, 2026
    Terraform 1.16.0

    Teams could finally put import blocks inside modules. The terraform_data store block and destroy = false came with it.

  6. Sep 9, 2026
    1.17.0-beta1
  7. Oct 7, 2026
    1.17.0-rc1

    rc2 followed on October 14.

  8. Oct 21, 2026
    Terraform 1.17.0
  9. Oct 22, 2026
    Terraform 1.16.7

    Go 1.26.10 for 1.16 users who aren't moving yet.

And two advisories from this summer. Neither is in the Terraform CLI. If you run self-managed Terraform Enterprise, read HCSEC-2026-17: a user who can publish a registry module from a VCS repository could pull files from outside it into the module and download them. It hits v202506-1, v202507-1 and 1.0.0 through 2.0.3, with fixes in 2.0.4 and 1.2.4. If you run terraform-mcp-server, HashiCorp's MCP server for AI tools, read HCSEC-2026-23. Versions 0.2.1 through 1.0.0 had three HTTP transport flaws, one of which could send the server's bearer token to an attacker's endpoint. 1.1.0 fixes them; stdio-only setups were safe.

Nothing about Terraform's overall shape changes in 1.17: configuration, the CLI or a remote runner, providers, state, and the APIs at the end. A few decisions move. Init can work out a provider's address from variables, a plan can skip refreshing what you didn't touch, and you don't need an experimental build to run policy from the Terraform CLI. We've used HashiCorp's own component names in the diagrams and simplified the rest.

before

Before: a Terraform 1.16 run

Under 1.16 you hard-code the provider address, every plan refreshes every managed resource, and -policies only works in an experimental build.

Before: a Terraform 1.16 run Under 1.16 you hard-code the provider address, every plan refreshes every managed resource, and -policies only works in an experimental build. 01 · CONFIGURATION 02 · TERRAFORM CLI 03 · STATE AND APIS provider address module sources read prior state refresh all opt-in, experimental Root module and modules module sources may use constvars required_providers fixed source and versionstrings terraform init installs providers andmodules terraform plan refreshes everymanaged resource -policies flag experimental builds only State file remote backend, locked Provider APIs one read per resource onrefresh © Cohash · cohash.com
01 · CONFIGURATION02 · TERRAFORM CLI03 · STATE AND APIS Root module and modules: module sources may use const vars Root module andmodules module sources mayuse const vars required_providers: fixed source and version strings required_provi… fixed source andversion strings terraform init: installs providers and modules terraforminit installsproviders andmodules terraform plan: refreshes every managed resource terraformplan refreshes everymanagedresource -policies flag: experimental builds only -policiesflag experimentalbuilds only State file: remote backend, locked State file remote backend,locked Provider APIs: one read per resource on refresh Provider APIs one read perresource on… provider address module sources read prior state refresh all © Cohash · cohash.com
after

After: a Terraform 1.17 run

In 1.17 provider addresses can come from const variables and locals, -minimal-refresh limits refresh to changed resources, and -policies works in a normal build.

After: a Terraform 1.17 run In 1.17 provider addresses can come from const variables and locals, -minimal-refresh limits refresh to changed resources, and -policies works in a normal build. 01 · CONFIGURATION 02 · TERRAFORM CLI 03 · STATE AND APIS known before plan provider address -policies (GA) query policies read prior state refresh changed only Const variables andlocals -var, var files, env vars required_providers source and version from vars .policy.hcl files Terraform Policy, HCL terraform init resolves provider address terraform plan full, or-minimal-refresh terraform query list blocks, query policies State file remote backend, locked Provider APIs fewer reads with minimalrefresh © Cohash · cohash.com
01 · CONFIGURATION02 · TERRAFORM CLI03 · STATE AND APIS Const variables and locals: -var, var files, env vars Constvariablesand locals -var, varfiles, env vars required_providers: source and version from vars required_pr… source andversion fromvars .policy.hcl files: Terraform Policy, HCL .policy.hclfiles TerraformPolicy, HCL terraform init: resolves provider address terraforminit resolvesprovideraddress terraform plan: full, or -minimal-refresh terraformplan full, or -minimal-refresh terraform query: list blocks, query policies terraformquery list blocks,query policies State file: remote backend, locked State file remote backend,locked Provider APIs: fewer reads with minimal refresh Provider APIs fewer reads withminimal refresh provider address -policies (GA) query policies read prior state refresh changed only © Cohash · cohash.com
side by sideDay to day on Terraform 1.16 against 1.17
Terraform 1.16
  • Provider source and version are hard-coded in each terraform block, so teams copy the block per registry
  • Every plan refreshes every managed resource, so you either wait for it or turn refresh off entirely
  • Running -policies locally means an experimental build and an extra flag
  • Policies see a replaced resource as one update, so they can't tell it apart from an edit
  • terraform version -json has no format_version field
Terraform 1.17
  • Provider source and version can come from const variables and locals, so one codebase serves several registries
  • -minimal-refresh refreshes only the instances you're changing, which saves API calls but misses drift elsewhere
  • -policies works on plan, apply and query in a normal build
  • Policies now get a replacement as two events, a create and a delete, so rules written for updates need a look
  • terraform version -json includes format_version
chapter 03

What to do now

What to do now, by who you are

Business ownerthis month
  • Ask your platform team or provider which Terraform version runs your pipelines, and when they plan to move to 1.17.
  • Ask whether production changes still get a full-refresh plan first. If the answer is no, someone should explain why in writing.
  • If you need a support end date for 1.16 for an audit or a contract, have the team ask HashiCorp support. We couldn't find a public date.
Platform and operationsthis week
  • List the Terraform version on every pipeline, runner and laptop, and every required_version pin that would block 1.17.
  • Test connections to your private registry, proxy and backend on 1.16.7 or 1.17.0. The Go 1.26.10 certificate change hits both.
  • Widen the pin on a test branch, then run 1.16 and 1.17 plans side by side on a lower environment with full refresh. The proposed changes should match.
Developersbefore cut-over
  • Find every script that reads terraform version -json and check it ignores unknown fields like format_version.
  • Look for log or pow calls that could hit infinity. Those now error out instead of passing a useless value along.
  • Keep provider upgrades in their own change, planned without -minimal-refresh, so schema changes reach state.
Security and compliancethis quarter
  • Pilot Terraform Policy beside your Sentinel or OPA rules. The policy docs still said beta on October 22, 2026, so keep the old rules in force.
  • Update any policy that treats a replacement as an update. In 1.17 it arrives as a separate create and delete.
  • Check that Terraform Enterprise and terraform-mcp-server have the HCSEC-2026-17 and HCSEC-2026-23 fixes. If you run them, they matter more than anything in 1.17.
Before you upgrade (example output)example output
$ terraform version
Terraform v1.16.7
on linux_amd64
$ grep -rn "required_version" --include="*.tf" .
./envs/prod/versions.tf:2:  required_version = "~> 1.16.0"
# ~> 1.16.0 blocks 1.17. Widen it on a test branch, compare plans, then merge.

Don't expect much from the upgrade guide. For 1.17 it says the release honors the v1.0 compatibility promises and points you at the changelog. That's normal inside 1.x. If something breaks, look at providers first, then at scripts that parse CLI output, then at the edge cases in the bug fixes. This is the order we'd go in.

Upgrading from 1.16 (or earlier) to 1.17

  1. 01
    Inventory versions and pins

    List the Terraform version every pipeline, runner and laptop uses, and every required_version constraint. A constraint like ~> 1.16.0 blocks 1.17 until you change it. If you're on 1.15 or earlier, read the upgrade notes in the 1.16 and 1.15 changelogs too: bastion_host_key for provisioners, and the S3 backend's FIPS and dual-stack variables.

  2. 02
    Check what parses Terraform's output

    Track down anything that reads terraform version -json and make sure it ignores unknown fields or reads format_version. HashiCorp's advice is to use current hashicorp/terraform-json and terraform-exec.

  3. 03
    Check certificate paths

    Go 1.26.10, used for 1.17.0 and 1.16.7, no longer trusts certificates from the compromised eMudhra intermediates. If a private registry, proxy or backend chains through one, it'll break, so check before rollout.

  4. 04
    Run plans side by side in a lower environment

    Run plans with 1.16 and 1.17 against the same state with the same provider versions, with full refresh. Expect identical plans. Watch for new warnings from ephemeral resource renewals and errors from log or pow.

  5. 05
    Upgrade providers separately

    Don't change Terraform and provider versions in the same step. During provider upgrades, plan without -minimal-refresh or -refresh=false so schema changes reach state.

  6. 06
    Adopt the new features on purpose

    Move duplicated terraform blocks to const variables where it helps. Try -minimal-refresh on pull-request plans. Pilot Terraform Policy beside your Sentinel or OPA rules before you rely on it.

  7. 07
    Cut over and record it

    Raise required_version, rebuild runner images and set the new version on your HCP Terraform or Terraform Enterprise workspaces. Production applies still get a full-refresh plan first.

chapter 04

Harden so the next one hurts less

Nothing in 1.17 forces new habits on you. Still, each change in it points at a spot where upgrades usually hurt, and the steps below fix those spots one at a time.

Habits that make the next Terraform upgrade boring

  1. 01
    Keep one full-refresh plan in front of production

    Use -minimal-refresh for quick pull-request feedback if you like. The plan that gates a production apply should still refresh everything, because that's the only one that sees hand-made changes.

  2. 02
    Look for drift on a schedule

    Run a refresh-only plan against production on a schedule, say nightly, and send the output to someone who reads it. A console change then turns up within a day instead of during the next release.

  3. 03
    Pin versions and commit the lock file

    Set required_version in every root module and commit .terraform.lock.hcl, which records the exact provider versions and checksums. Upgrades then happen when someone decides, in a reviewed change.

  4. 04
    Move one thing at a time

    Change Terraform core and providers in separate steps, each with its own plan comparison. When a plan looks odd, you'll know which change caused it.

  5. 05
    Run policy as code in CI

    Write guardrails for things auditors ask about, like public storage or open security groups, and run them on every plan. Start them as Advisory and raise them to Mandatory once they're quiet.

  6. 06
    Back up state before every cut-over

    Take a copy of each state file, or note its version in HCP Terraform, before the first apply on a new release. HashiCorp doesn't guarantee that an older 1.x can read state a newer one wrote.

chapter 05

If the upgrade goes wrong

If the upgrade goes wrong

Most failed Terraform upgrades show up as a broken pipeline or a plan nobody expected. Stop applying first, then work out which change caused it. Don't try to fix state by hand under pressure.

  1. 01Stopfirst hour
    • Pause applies in every pipeline and workspace that moved to 1.17. Plans can keep running, since they don't change anything.
    • Tell the teams who deploy through Terraform that changes are frozen, and say roughly for how long.
    • Don't run terraform state commands or edit state files until you know what went wrong.
  2. 02Diagnosefirst day
    • Compare a 1.17 plan from a test branch with a 1.16.7 plan on the same state and providers, both with full refresh.
    • Check the obvious suspects in order: certificate errors to registries or proxies, scripts choking on format_version, new ephemeral renewal warnings, log or pow errors.
    • If a plan missed drift, check whether it ran with -minimal-refresh. That's expected behaviour, and the fix is a full-refresh plan.
  3. 03Roll backday 1 to 2
    • Pin required_version and runner images back to 1.16.7, which carries the same Go 1.26.10 fix, so you don't lose the certificate update.
    • If an apply on 1.17 already wrote state, only restore the pre-cut-over copy when that apply changed nothing in the cloud. Otherwise stay on 1.17 and fix forward, because the old state won't know what that apply built.
    • Run a full-refresh plan on the old version and confirm it shows no unexpected changes before you lift the freeze.
  4. 04Fix and retrywithin a week
    • Fix the cause on a lower environment first: the script, the certificate chain or the pin. Then repeat the side-by-side plans.
    • Move one environment at a time, starting with the least critical, and keep the state backups until each one is stable.
  5. 05Record and learnafter cut-over
    • Write down what broke and add a check for it to the upgrade runbook. Next time the check runs before anyone notices a problem.
    • If a missed drift changed a security setting, tell the security team. They'll want it on record before the next audit asks.
chapter 06

What this looks like in real life

What this looks like in real life

01 Var file perenv const value 02 required_pro… address from var 03 terraforminit 04 Rightregistry dev, staging, prod
scenario 01Low risk
A software company with one codebase and three registries
the setup
A platform team runs dev, staging and prod from one Terraform codebase. Each environment pulls providers from a different private registry organization, so they keep three near-identical terraform blocks and a script that swaps them before init.
what happens
On 1.17 they move the organization name into a const variable and set it with a var file per environment. The swap script goes away. One engineer tries to feed the value from a data source and init rejects it, which is the limit working as designed.
what to do
Use const variables or locals built from them, set by -var, var files or environment variables. Keep anything computed during a plan out of required_providers.
01 Consolechange security group 02 PR plan -minimal-refresh 03 Full-refreshplan before prod 04 Productionapply
scenario 02Medium risk
A retailer with a huge state and a hand-made fix
the setup
A retailer's cloud account holds thousands of resources in one state, and full plans hit provider rate limits. The team switches pull-request plans to -minimal-refresh and loves the speed.
what happens
During an incident, someone opens a security group by hand in the console. The fast pull-request plans don't see it, because nobody changed that resource in code. The full-refresh plan in front of the production apply does see it and shows the drift.
what to do
Keep -minimal-refresh for quick feedback only. Gate every production apply on a full-refresh plan, and run a scheduled refresh-only plan so hand changes surface within a day.
01 Runner on1.17.0 Go 1.26.10 02 Pre-rolloutcheck certs and parsers 03 Corporateproxy untrusted chain 04 Privateregistry
scenario 03Medium risk
An enterprise with mixed versions and old wrappers
the setup
A large company has teams on 1.15, 1.16 and now 1.17, a home-grown wrapper that parses terraform version -json, and a corporate proxy in front of its private registry.
what happens
The first runners on 1.17.0 fail to reach the registry because the proxy's certificate chain isn't trusted by the Go 1.26.10 build. Teams that patched to 1.16.7 hit the same wall the same week. Separately, the wrapper's strict parser trips on the new format_version field.
what to do
Check certificate chains before rollout, since 1.16.7 behaves the same way. Fix the wrapper to ignore unknown fields or read format_version, then move teams one at a time from a single pinned version.

Cohash writes and maintains Terraform for clients: module design, state clean-up, version upgrades. Our Terraform platform page has the detail. If you'd rather staff it yourself, hire Terraform engineers through us, or ask for a free assessment of your code, state and pipelines first. The DevSecOps practice handles pipelines and policy.

key takeaways

What to take from this

  1. 01

    1.17.0 came out October 21, 2026, and the upgrade guide has no extra steps. Still test it on a lower environment before production.

  2. 02

    Const variables and locals now work in required_providers when they're known before planning.

  3. 03

    -minimal-refresh saves API calls but hides drift on untouched resources. Put a full plan in front of production applies.

  4. 04

    Terraform Policy is GA for -policies in the CLI, even though the policy docs still said beta on October 22.

  5. 05

    Before rollout, check whatever parses terraform version -json and any certificate chain through the eMudhra intermediates.

platforms in this noteTerraform →
fact-checked October 2026 against vendor and official documentation · where to go next
  1. How Cohash delivers Terraform: scope, roles and architecture
  2. Hire vetted Terraform engineers
  3. DevSecOps practice
  4. Book a 30-minute working session with a senior engineer
01We don't use Terraform ourselves. Does this affect us?

Only if someone builds your cloud with it, like an agency, a managed service provider or your own platform team. Ask them which version they run and when they plan to upgrade. You don't need to do anything technical yourself.

02Do we have to upgrade to 1.17 right away?

No. Nothing in 1.17 is a security fix you'd miss on 1.16, because 1.16.7 carries the same Go 1.26.10 certificate change. Plan the move for a quiet week and test it on a lower environment first.

03Can we go back to 1.16 if 1.17 causes problems?

Usually, if no apply on 1.17 has changed anything yet. Pin back to 1.16.7, revert any config that uses 1.17-only features like variables in provider requirements, since 1.16 won't run it, and rerun a full-refresh plan. HashiCorp doesn't guarantee an older 1.x can read state a newer one wrote, so back up each state file before the first apply on 1.17.

04Is upgrading from Terraform 1.16 to 1.17 a breaking change?

HashiCorp doesn't treat it as one. It's a 1.x minor release that keeps the v1.0 compatibility promises, and the upgrade guide lists no special steps. The things we'd still check are tools that parse terraform version -json, new warnings from ephemeral renewals, log and pow erroring on infinity, and certificate chains affected by Go 1.26.10.

05What does terraform plan -minimal-refresh do?

It refreshes only what Terraform plans to change, so a large state makes fewer API calls. The catch: anything changed outside Terraform on the other resources goes unseen. It won't combine with refresh-only mode or -refresh=false, and HashiCorp says to leave it off during provider upgrades.

06Can I use variables in required_providers now?

In 1.17 you can, as long as the values are known before planning. Use input variables declared with const = true, or locals built from them, for source and version. Resources and data sources won't work there.

07Is Terraform Policy generally available?

The 1.17.0 changelog says so for the CLI's -policies flag. HashiCorp's policy docs still showed a beta note on October 22, 2026. Ask HashiCorp before you gate production on it.

08Do the two security bulletins from this summer affect the Terraform CLI itself?

No, neither does. HCSEC-2026-17 is in self-managed Terraform Enterprise (fixed in 2.0.4 and 1.2.4) and HCSEC-2026-23 is in terraform-mcp-server 0.2.1 through 1.0.0 (fixed in 1.1.0). The CLI had its own fixes, mind you: 1.15.9 updated go-slug for CVE-2026-14978, and 1.17.0 and 1.16.7 ship Go 1.26.10 for CVE-2026-111943.

up next in this track

Keep the thread going.

What shipped, what changed underneath, and what it means for your upgrade.

  1. 01HashiCorp Vault 2.2 explained: TPM login, post-quantum PKI and the October fixes
  2. 02Upgrading to SailPoint IdentityIQ 9.0: what breaks and what to fix first
  3. 03Terraform 1.17 explained: what's new, who it touches and how we'd upgrade
  4. 04BeyondTrust Remote Support zero-day: patch it, then check who got in
  5. 05Patch PHP and Node.js this week: what broke and who's exposed
  6. 06OpenShift support dates through 2027: which clusters run out first and how to plan the upgrades
  7. 07Oracle's October security patches: what to fix first in EBS, PeopleSoft and Access Manager
  8. 08Oracle's eMudhra alert now covers Database Server: patch, then test what breaks
  9. 09Delinea Secret Server auth bypass: why the FIDO2 hotfix isn't enough
  10. 10IBM Verify Access flaws let attackers run code without a login: patch to 11.0.3.2
  11. 11Foundry Workflows retire on December 1. We'd start moving yours to Agent Framework now
  12. 12Vertex AI is retiring text-embedding-005 and three other embedding models: how to re-embed before search breaks
  13. 13dbt drops v1.3 to v1.7 from its platform on January 31, 2027: get pinned jobs onto a release track before they're deleted
  14. 14Brotli CVE-2026-111497 is now on CISA's exploited list, and you probably run more copies than you think
  15. 15Auth0 moved the Rules and Hooks deadline: Hooks stop on 30 April 2027, Rules on 31 January 2028
  16. 16Still on Okta Classic Engine? Three features stop working on March 5, 2027, and two of them block the upgrade
  17. 17Patched GitLab, still exposed: the CI regex bug CISA lists as exploited, and the Ruby step people miss
  18. 18Patched Ivanti Connect Secure in October? Two more exploited bugs, and the AD cleanup
  19. 19Patch roundup, week of Oct 26: upgrade Secret Server today, then work down the list
  20. 20UiPath 2023.10 support has run out and 2024.10 is next. What we'd upgrade first
  21. 21Password Safe 24.3 runs out of support in December, and 26.3 is still one upgrade away
  22. 22Upgrade Entra Connect Sync before April 2027 and move users off Microsoft's SMS codes
  23. 23Chrome drops XSLT on 17 November. What breaks in InterSystems, and the fix for your version
  24. 24Agent Builder, Evals and saved prompts shut on 30 November. Here's what to pull out first
  25. 25BeyondTrust Remote Support and PRA 24.3 lose support in November, and there's no one-step upgrade
  26. 26OpenShift 4.19 is running out of support. Do you park on 4.22 or keep going to 5.0?
  27. 27Terraform Enterprise 2.1 moves VCS ingress into your agents. What to change before October 2027
  28. 28Mule 4.12 Edge leaves standard support this month. Upgrade to 4.13 before CloudHub does it for you
  29. 29RSA SecurID primary support ends in stages from December. Here's how you get to 8.9
  30. 30Delinea Secret Server login bypass: why 12.2.7 won't save you from this 9.9
  31. 31Entra password reset won't take directory phone numbers from February 2027. Who gets stuck?
  32. 32Linux kernel CVE-2026-98432: why switching off MPTCP won't save you, and what to patch
  33. 33Patch roundup, week of Nov 2: fix Linux and WS_FTP first, then work down the list
  34. 34Auth0's lazy migration changes on 20 January 2027, and half-imported users won't fix themselves
  35. 35Your Databricks AI Functions need Runtime 17.3 LTS by January 2027, even if 15.4 is still supported
  36. 36SonicWall's SSL VPN bug lets a valid password skip SAML and your MFA
  37. 37Oversized Auth0 profiles can break logins after 4 March 2027. Here's how to find yours
  38. 38You patched your Cisco email gateway. One email can still take it over.
all learning tracks →
01 Internetrequest 02 RemoteSupport up to 26.2.3 03 Vault andsessions 04 Patch, hunt,rotate
Security · 18 minBeyondTrust Remote Support zero-day: patch it, then check who got in

Patch the appliance, check for intruders, rebuild, then rotate.

read next
next step

Tell us what you're running. We'll tell you what we'd do first.

A 30-minute working session with a senior engineer. No slides.

useful to bring
  • The platform and the version you're on
  • Where you need to get to, and by when
  • What's custom: rules, plugins, integrations
  • Any audit finding or deadline driving it