Releases: hashicorp/terraform
v1.16.0-alpha20260617
1.16.0-alpha20260617 (June 17, 2026)
NEW FEATURES:
-
Store PlannedPrivate data for providers (#37986)
-
New store block in terraform_data that can handle ephemeral and sensitive values (#38298)
-
Providers can now use nested blocks as computed values (#38305)
-
import: add support for import blocks inside modules (#38352)
-
We now produce builds for Linux s390x (zLinux) (#38384)
-
workspace: The
workspace listcommand can now produce machine-readable output when supplied with the-jsonflag (#38397) -
Resource action triggers can now use
on_failuremodes ofhalt,taint, orcontinue(#38722)
ENHANCEMENTS:
-
feat(cli): terraform state show accepts a -json flag (#23940)
-
Show info when resources are left behind due to skip_cleanup (#38449)
-
Action configuration now has a new
callersymbol which contains the object value from the calling resource. (#38668) -
Actions can now use before_destroy and after_destroy events (#38668)
BUG FIXES:
-
import blocks no longer ignore provider local names (#38338)
-
Fix a
terraform applypanic when the plan contained a no-op change for a deposed object on a resource whose configuration declared alifecycle.preconditionorlifecycle.postcondition(#38586) -
workspace: Terraform will now error if an invalid workspace name becomes selected due to actions performed out-of-band (#38594)
-
test: Terraform will now raise a warning when a file referenced via
-filterflag does not exist. (#38603) -
init: Stop removing locks from the dependency lock file corresponding to providers configured as a dev_override (#38634)
-
init: Add warnings when unmanaged providers are in use and will impact provider installation processes. (#38656)
-
Actions are now invoked with respect to all resource dependencies. (#38668)
NOTES:
-
init: Errors due to incompatible
-upgradeand-lockfile=readonlyflags are now raised earlier in the init process. (#38561) -
command/init: Provider installation was changed to enable future enhancements in the area. This effectively reverses the log message changes from v1.15.
initializing_provider_plugin_messageis being re-introduced to replace the short-lived two message typesinitializing_provider_plugin_from_config_message&initializing_provider_plugin_from_state_message. The change should not have any significant end-user impact aside from the command output. (#38648) -
command/init: Provider installation was changed to enable future enhancements in the area. This partially reverses the init event order changes from v1.15; module installation will now occur after the backend is initialized. The change should not have any significant end-user impact aside from the command output. (#38699)
UPGRADE NOTES:
- Provisioner bastion_host_key is now correctly applied. Existing usage of bastion_host_key should verify the configured key is correct. (#38318)
EXPERIMENTS:
Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases.
- The experimental "deferred actions" feature, enabled by passing the
-allow-deferraloption toterraform plan, permitscountandfor_eacharguments inmodule,resource, anddatablocks to have unknown values and allows providers to react more flexibly to unknown values. terraform test cleanup: The experimentaltest cleanupcommand. In experimental builds of Terraform, a manifest file and state files for each failed cleanup operation during test operations are saved within the.terraformlocal directory. Thetest cleanupcommand will attempt to clean up the local state files left behind automatically, without requiring manual intervention.terraform test:backendblocks andskip_cleanupattributes:- Test authors can now specify
backendblocks withinrunblocks in Terraform Test files. Run blocks withbackendblocks will load state from the specified backend instead of starting from empty state on every execution. This allows test authors to keep long-running test infrastructure alive between test operations, saving time during regular test operations. - Test authors can now specify
skip_cleanupattributes within test files and within run blocks. Theskip_cleanupattribute tellsterraform testnot to clean up state files produced by run blocks with this attribute set to true. The state files for affected run blocks will be written to disk within the.terraformdirectory, where they can then be cleaned up manually using the also experimentalterraform test cleanupcommand.
- Test authors can now specify
Previous Releases
For information on prior major and minor releases, refer to their changelogs:
v1.15.6
1.15.6 (June 10, 2026)
BUG FIXES:
-
Fixed an issue where resources being removed from state via
removedblock were incorrectly listed underplanned_valuesin json representations of the plan file. (#38665) -
console: Fixed a panic caused by evaluating an expression involving deprecated values (#38676)
-
Fix exit code for plan, query, and refresh commands for variable-related errors (#38685)
-
Fix two module installation edge cases with
nulland sensitive/ephemeral module sources (#38704)
v1.16.0-alpha20260603
1.16.0-alpha20260603 (June 03, 2026)
NEW FEATURES:
-
Store PlannedPrivate data for providers (#37986)
-
New store block in terraform_data that can handle ephemeral and sensitive values (#38298)
-
Providers can now use nested blocks as computed values (#38305)
-
import: add support for import blocks inside modules (#38352)
-
We now produce builds for Linux s390x (zLinux) (#38384)
-
workspace: The
workspace listcommand can now produce machine-readable output when supplied with the-jsonflag (#38397)
ENHANCEMENTS:
-
feat(cli): terraform state show accepts a -json flag (#23940)
-
Show info when resources are left behind due to skip_cleanup (#38449)
BUG FIXES:
-
import blocks no longer ignore provider local names (#38338)
-
Fix a
terraform applypanic when the plan contained a no-op change for a deposed object on a resource whose configuration declared alifecycle.preconditionorlifecycle.postcondition(#38586) -
workspace: Terraform will now error if an invalid workspace name becomes selected due to actions performed out-of-band (#38594)
-
test: Terraform will now raise a warning when a file referenced via
-filterflag does not exist. (#38603) -
init: Stop removing locks from the dependency lock file corresponding to providers configured as a dev_override (#38634)
-
init: Add warnings when unmanaged providers are in use and will impact provider installation processes. (#38656)
NOTES:
- init: Errors due to incompatible
-upgradeand-lockfile=readonlyflags are now raised earlier in the init process. (#38561)
UPGRADE NOTES:
- Provisioner bastion_host_key is now correctly applied. Existing usage of bastion_host_key should verify the configured key is correct. (#38318)
EXPERIMENTS:
Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases.
- The experimental "deferred actions" feature, enabled by passing the
-allow-deferraloption toterraform plan, permitscountandfor_eacharguments inmodule,resource, anddatablocks to have unknown values and allows providers to react more flexibly to unknown values. terraform test cleanup: The experimentaltest cleanupcommand. In experimental builds of Terraform, a manifest file and state files for each failed cleanup operation during test operations are saved within the.terraformlocal directory. Thetest cleanupcommand will attempt to clean up the local state files left behind automatically, without requiring manual intervention.terraform test:backendblocks andskip_cleanupattributes:- Test authors can now specify
backendblocks withinrunblocks in Terraform Test files. Run blocks withbackendblocks will load state from the specified backend instead of starting from empty state on every execution. This allows test authors to keep long-running test infrastructure alive between test operations, saving time during regular test operations. - Test authors can now specify
skip_cleanupattributes within test files and within run blocks. Theskip_cleanupattribute tellsterraform testnot to clean up state files produced by run blocks with this attribute set to true. The state files for affected run blocks will be written to disk within the.terraformdirectory, where they can then be cleaned up manually using the also experimentalterraform test cleanupcommand.
- Test authors can now specify
Previous Releases
For information on prior major and minor releases, refer to their changelogs:
v1.15.5
v1.15.4
v1.16.0-alpha20260513
1.16.0-alpha20260513 (May 13, 2026)
NEW FEATURES:
-
Store PlannedPrivate data for providers (#37986)
-
New store block in terraform_data that can handle ephemeral and sensitive values (#38298)
-
Providers can now use nested blocks as computed values (#38305)
-
We now produce builds for Linux s390x (zLinux) (#38384)
-
workspace: The
workspace listcommand can now produce machine-readable output when supplied with the-jsonflag (#38397)
ENHANCEMENTS:
-
feat(cli): terraform state show accepts a -json flag (#23940)
-
Show info when resources are left behind due to skip_cleanup (#38449)
BUG FIXES:
- import blocks no longer ignore provider local names (#38338)
UPGRADE NOTES:
- Provisioner bastion_host_key is now correctly applied. Existing usage of bastion_host_key should verify the configured key is correct. (#38318)
EXPERIMENTS:
Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases.
- The experimental "deferred actions" feature, enabled by passing the
-allow-deferraloption toterraform plan, permitscountandfor_eacharguments inmodule,resource, anddatablocks to have unknown values and allows providers to react more flexibly to unknown values. terraform test cleanup: The experimentaltest cleanupcommand. In experimental builds of Terraform, a manifest file and state files for each failed cleanup operation during test operations are saved within the.terraformlocal directory. Thetest cleanupcommand will attempt to clean up the local state files left behind automatically, without requiring manual intervention.terraform test:backendblocks andskip_cleanupattributes:- Test authors can now specify
backendblocks withinrunblocks in Terraform Test files. Run blocks withbackendblocks will load state from the specified backend instead of starting from empty state on every execution. This allows test authors to keep long-running test infrastructure alive between test operations, saving time during regular test operations. - Test authors can now specify
skip_cleanupattributes within test files and within run blocks. Theskip_cleanupattribute tellsterraform testnot to clean up state files produced by run blocks with this attribute set to true. The state files for affected run blocks will be written to disk within the.terraformdirectory, where they can then be cleaned up manually using the also experimentalterraform test cleanupcommand.
- Test authors can now specify
Previous Releases
For information on prior major and minor releases, refer to their changelogs:
v1.15.3
1.15.3 (May 13, 2026)
BUG FIXES:
-
stacks: Fixed a bug that prevented migrating resources under multiple layers of module nesting with implicit provider configuration. (#38528)
-
cloud backend will now forward -generate-config-out flag usage to query create request (#38539)
-
Fix crash during provider installation when there is no config (#38560)
v1.15.2
v1.15.1
1.15.1 (May 1, 2026)
BUG FIXES:
-
Fixed crash when configuration has an invalid
action_triggernested block indataorephemerallifecycle blocks (#38402) -
validate: Removed validation of attributes inside
backendblocks due to incompatibility with workflows using the-backend-configflag. (#38466) -
Fix non-const variable checks on
init(#38470) -
Avoid warnings in 'terraform output -raw' (#38487)
-
Ignore undeclared variable values from the cloud backend (#38490)
-
Fix panic for types modules with no expanded instances (#38491)
-
Fixed "unknown provider function" errors occurring during init (#38472)
-
init: Fixed a bug that impacted use of provider pre-releases during init (#38496)
v1.15.0
1.15.0 (April 29, 2026)
NEW FEATURES:
-
We now produce builds for Windows ARM64 (#32719)
-
You can set a
deprecatedattribute on variable and output blocks to indicate that they are deprecated. This will produce warnings when passing in a value for a deprecated variable or when referencing a deprecated output. (#38001) -
backend/s3: Support authentication via
aws login(#37976) -
validate: The validate command now checks the
backendblock. This ensures the backend type exists, that all required attributes are present, and that the backend's own validation logic passes. (#38021) -
convertfunction, which allows for precise inline type conversions (#38160) -
Terraform now supports variables and locals in module source and version attributes (#38217)
ENHANCEMENTS:
-
config:
outputblocks now can have an explicit type constraints (#36411) -
ssh-based provisioner (file + remote-exec): Re-enable support for PowerShell (#37794)
-
terraform init log timestamps include millisecond precision (#37818)
-
init: skip dependencies declared in development override. This allows you to use
terraform initwith developer overrides and install dependencies that are not declared in the override file. (#37884) -
Terraform Test: Allow functions within mock blocks (#34672)
-
improve detection of deprecated resource attributes / blocks (#38077)
-
Deprecation messages providers set on resources / blocks / attributes are now part of the deprecation warning (#38135)
-
Include which attribute paths are marked as sensitive in list_start JSON logs (#38197)
-
Add input variable validation for Stacks (#38240)
-
When comparing a container value to null, only top level marks are now considered for the result. (#38270)
-
As part of supporting variables in module sources, most commands now accept variable values (#38276)
BUG FIXES:
-
testing: File-level error diagnostics are now included in JUnit XML skipped test elements, ensuring CI/CD pipelines can detect validation failures (#37801)
-
A refresh-only plan could result in a non-zero exit code with no changes (#37406)
-
cli: Fixed crash in
terraform show -jsonwhen plan contains ephemeral resources with preconditions or postconditions (#37834) -
cli: Fixed
terraform init -jsonto properly format all backend configuration messages as JSON instead of plain text (#37911) -
state show: Thestate showcommand will now explicitly fail and return code 1 when it fails to render the named resources state (#37933) -
apply: Terraform will raise an explicit error if a plan file intended for one workspace is applied against another workspace (#37954)
-
lifecycle:
replace_triggered_bynow reports an error when given an invalid attribute reference that does not exist in the target resource (#36740) -
backend: Fix nil pointer dereference crash during
terraform initwhen the destination backend returns an error (#38027) -
stacks: send progress events if the plan fails for better UI integration (#38039)
-
stacks: component instances should report no-op plan/apply. This solves a UI inconsistency with convergence destroy plans (#38049)
-
backend/http: Return conflicting lock info from HTTP backend instead of the lock that failed to be taken (#38144)
-
states: fixed a bug that caused Terraform to be unable to identify when two states had different output values. This may have caused issues in specific circumstances like backend migrations. (#38181)
-
cloud: terraform cloud and registry discovery network requests are now more resilient, making temporary network or service related errors less common (#38064)
-
Enable formatting of
.tfquery.hclfiles byterraform fmt(#38398) -
Fix
validatenot returning JSON for some early diagnostics (#38400) -
Fix Terraform Stacks plugin installation error (#38406)
NOTES:
- command/init: Provider installation was refactored to enable future enhancements in the area. This results in different order of operations during init and 2 new log messages replacing one (
initializing_provider_plugin_message). The change should not have any end-user impact aside from theinitcommand output. (#38227)
UPGRADE NOTES:
- backend/s3: The
AWS_USE_FIPS_ENDPOINTandAWS_USE_DUALSTACK_ENDPOINTenvironment variables now only respecttrueorfalsevalues, aligning with the AWS SDK for Go. This replaces the previous behavior which treated any non-empty value astrue. (#37601)
Previous Releases
For information on prior major and minor releases, refer to their changelogs: