NEW FEATURES:
We now produce builds for Windows ARM64 (#32719)
You can set a deprecated attribute 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 backend block. This ensures the backend type exists, that all required attributes are present, and that the backend's own validation logic passes. (#38021)
convert function, which allows for precise inline type conversions (#38160)
Terraform now supports variables and locals in module source and version attributes (#38217)
ENHANCEMENTS:
config: output blocks 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 init with 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 -json when plan contains ephemeral resources with preconditions or postconditions (#37834)
cli: Fixed terraform init -json to properly format all backend configuration messages as JSON instead of plain text (#37911)
state show: The state show command 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_by now 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 init when 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)
NOTES:
initializing_provider_plugin_message). The change should not have any end-user impact aside from the init command output. (#38227)UPGRADE NOTES:
AWS_USE_FIPS_ENDPOINT and AWS_USE_DUALSTACK_ENDPOINT environment variables now only respect true or false values, aligning with the AWS SDK for Go. This replaces the previous behavior which treated any non-empty value as true. (#37601)For information on prior major and minor releases, refer to their changelogs:
Fetched April 15, 2026