terraform plan -minimal-refresh -out=tfplan
terraform apply -policies ./policies/ -auto-approve
terraform state show -json aws_instance.web
terraform graph -format=mermaid > graph.md
resource "aws_s3_bucket" "critical" {
bucket = "my-critical-bucket"
lifecycle {
destroy = false
}
}
variable "legacy_region" {
type = string
deprecated = "Use the `region` variable instead; this variable will be removed in v2."
}
locals {
port = convert(var.port_input, number)
}
locals {
tf_module_version = "2.3.0"
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = local.tf_module_version
}
terraform validate -query
terraform stacks -usage
# inside mymodule.tftest.hcl
variable "region" {
default = "us-east-1"
}
run "deploy" {
variables {
region = var.region
}
}
terraform test -parallelism=4
# In your Terraform config:
import {
identity = {
project = "my-project"
region = "us-east1"
name = "my-resource"
}
to = google_some_resource.example
}
terraform {
backend "azurerm" {
resource_group_name = "tfstate-rg"
storage_account_name = "tfstateacct"
container_name = "tfstate"
key = "prod.terraform.tfstate"
oidc_request_url = "$SYSTEM_OIDCREQUESTURI"
oidc_request_token = "$SYSTEM_ACCESSTOKEN"
ado_pipeline_service_connection_id = "<service-connection-id>"
}
}
terraform test -junit-xml=results.xml
terraform {
backend "s3" {
bucket = "my-tf-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
use_lockfile = true
}
}
variable "admin_password" {
type = string
ephemeral = true
sensitive = true
}
locals {
safe_password = ephemeralasnull(var.admin_password)
}
terraform init -json
# In variables.tf
variable "template_content" {
type = string
}
# In resources.tf
resource "example_resource" "foo" {
config = templatestring(var.template_content, { key = var.value })
}
# In variables.tf
variable "allowed_regions" {
type = list(string)
}
variable "region" {
type = string
validation {
# Can now refer to `var.allowed_regions` directly
condition = contains(var.allowed_regions, var.region)
error_message = "Region must be in the allowed list."
}
}
terraform console -plan
> plan.resources[0].attributes.id
terraform test *.tftest.hcl
terraform plan -out=remote_plan.tfplan -var-file=prod.tfvars
terraform_data "my_data" {
input = "value_to_store"
}
terraform workspace select -or-create production
terraform metadata functions -json
variable "config" {
type = object({
host = string
port = optional(number, 8080)
tls_enabled = optional(bool, true)
})
}
resource "example_instance" "main" {
config = var.config
}
locals {
is_prod = endswith(var.env, "-prod")
is_internal = startswith(var.region, "internal-")
}
terraform fmt file1.tf file2/main.tf modules/network/vpc.tf
resource "example_resource" "foo" {
precondition {
condition = var.size >= 10
error_message = "Size must be at least 10."
}
}
resource "aws_instance" "web" {
lifecycle {
replace_triggered_by = [aws_database_instance.db.id]
}
}
export TF_TOKEN_app_terraform_io=abc123token
terraform plan
terraform plan -json | jq '.resource_drift'
terraform apply -refresh-only
terraform init -migrate-state
terraform apply -replace='aws_instance.web[0]'
terraform apply -destroy
TF_LOG_CORE=INFO TF_LOG_PROVIDER=DEBUG terraform init
terraform init -lockfile=readonly
terraform output -raw my_secret_value
resource "example" "main" {
for_each = tomap({
item1 = var.sensitive_map_value
})
val = each.value
}
terraform plan -ignore-remote-version
variable "db_password" {
description = "Password for the database"
type = string
sensitive = true
}
terraform -chdir=/path/to/infra apply
alltrue([true, true, true])
TF_APPEND_USER_AGENT='my-org/s3-backend' terraform init
module "vpc" {
source = "..."
count = 3
cidr_block = cidrsubnet(var.base_cidr, 8, count.index)
}
terraform state replace-provider registry.terraform.io/hashicorp/aws registry.terraform.io/myco/aws
variable "port" {
type = number
validation {
condition = var.port >= 1024 && var.port <= 65535
error_message = "Port must be between 1024 and 65535."
}
}
output "name" {
value = try(var.user.address.street_name, "Unknown")
}
terraform {
required_providers {
aws = "~> 2.0"
azurerm = ">= 1.36"
}
}
terraform state mv 'module.old.module_name' 'module.new.module_name'
terraform plan -compact-warnings
output "tags" {
value = trim(var.raw_tags, " ")
}
export HTTP_PROXY='http://proxy.corp:8080'
export HTTPS_PROXY='http://proxy.corp:8081'
terraform init
terraform init -backend-config='backend_config' # where config contains role_arn = "arn:aws:..."
echo '*.tfvars' > .terraformignore
terraform plan
provisioner "habitat" {
accept_license = true
# ... other arguments
}
fileset(path.root, "**/*.tfvars")
regex("[0-9]+\\.[0-9]+\\.[0-9]+", "release-v1.2.3-final")
regexall("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}", "Contact alice@example.com or bob@test.org")
module "example" {
source = "gcs::https://www.storage.googleapis.com/{{_BUCKET_NAME}}/{{_MODULE_PATH}}"
}
terraform {
backend "s3" {
bucket = "my-bucket"
key = "state.tfstate"
region = "us-east-1"
# Chaining is automatic via AWS shared config
}
}
resource "example" "name" {
id = uuidv5("namespace", self.name)
}
locals {
config = yamldecode("""
name: example
value: true
""")
}
terraform {
backend "oss" {
bucket = "my-terraform-state"
prefix = "env/prod/"
endpoint = "oss-cn-hangzhou.aliyuncs.com"
}
}
terraform 0.12checklist
Summary
Terraform is an open-source infrastructure-as-code tool that lets teams define, plan, and provision cloud and on-premises infrastructure through a declarative configuration language, and it costs nothing to use, though HashiCorp sells a paid cloud offering for teams that want managed runs. It runs as a command-line tool, generating an execution plan before any change is applied and building a resource graph so independent resources are created or modified in parallel. It is aimed at platform and infrastructure engineers who manage provisioning across providers rather than a single cloud console, and it sits in the infrastructure-as-code and provisioning space, a category it effectively defined. Started in 2014, it remains active with thousands of contributors, nearly 2,000 commits in the past year, and a release 37 days ago.
Terraform is an infrastructure as code tool that lets you build, change, and version infrastructure safely and efficiently.
Which resources in my infrastructure depend on which others?
builds a graph from the configuration's references and uses it to work out the order changes must happen in, running anything without a dependency between them at the same time
What is actually going to be created, changed, or destroyed before I commit to it?
compares the configuration against the current state and lists every addition, modification, and deletion up front, so nothing is touched until that list is approved
Is my infrastructure still what my configuration says it should be?
walks the resource graph against the provider APIs and reports any resource whose real state has drifted from what was last recorded
Can I find and pull existing infrastructure into version control instead of recreating it?
runs a query against the live provider to list matching resources and can generate the configuration and import statements needed to bring them under management
Did someone change a resource outside of normal review?
records the state after every apply, so the next plan against live infrastructure surfaces anything that no longer matches what was last written there
96 capabilities
· 6 backed by code, an API document or a real run
Built from terraform's releases, docs, README and our own runs.
“Seen” marks the month we first spotted a release the vendor didn't date.
Group names and tags are our labels.
terraform covers 1 of the 8 vulnerability assessment methods capabilities we track.
What terraform offers you
Command-line interface18
CI/CD pipeline integration3
JSON data export3
Scripting language support2
Plugin API support1
PowerShell script execution1
Single sign-on1
Show
No capabilities match.
+All capabilities96 capabilities▸
+Remote state backend supportshippedAllows users to store and manage Terraform state in various remote providers such as S3, GCS, OSS, and Swift.36 releases · 2 other sources · first seen Jun 2019▸
release
36 total
backend/s3: AWS_USE_FIPS_ENDPOINT and AWS_USE_DUALSTACK_ENDPOINT environment variables now only accept true or false; any other non-empty value (previously treated as true) is no longer honoured.
v1.15.0 · Apr 2026
· source
· release history
S3 backend now supports authentication via aws login (SSO/IAM Identity Center flows).
v1.15.0 · Apr 2026
· source
· release history
Adds endpoints.sso config key in the S3 backend to override the AWS SSO API endpoint.
v1.6.4 · Nov 2023
· source
· release history
Adds https_proxy and no_proxy config keys to the S3 backend for explicit proxy configuration.
v1.6.4 · Nov 2023
· source
· release history
backend/s3 accepts the skip_s3_checksum parameter to disable checksumming on uploads, enabling compatibility with S3-compatible APIs that do not support it
v1.6.3 · Nov 2023
· source
· release history
Adds skip_requesting_account_id to the backend "s3" block to support AWS API implementations without IAM, STS, or metadata API
v1.6.1 · Oct 2023
· source
· release history
example
Fetch a module directly from a Google Cloud Storage bucket without local checkout.$ module "example" { source = "gcs::https://www.storage.googleapis.com/{{_BUCKET_NAME}}/{{_MODULE_PATH}}" }
v0.12.3 · Jun 2019
· source
Store Terraform state in Alibaba OSS for centralized remote management.$ terraform { backend "oss" { bucket = "my-terraform-state" prefix = "env/prod/" endpoint = "oss-cn-hangzhou.aliyuncs.com" } }
v0.12.2 · Jun 2019
· source
+Interpolation and built-in functionsshippedProvides a library of built-in functions for string manipulation, data parsing, UUID generation, and arithmetic operations.21 releases · 5 other sources · first seen May 2019▸
release
21 total
Built-in terraform provider gains decode_tfvars, encode_tfvars, and encode_expr functions
v1.8.0 · Apr 2024
· source
· release history
Adds a new strcontains() function that checks whether a given string contains a given substring
v1.5.0 · Jun 2023
· source
· release history
Adds a new plantimestamp() function that returns the timestamp at plan time
v1.5.0 · Jun 2023
· source
· release history
terraform_data is a new builtin managed resource type that can store data of any type
v1.4.0 · Mar 2023
· source
· release history
-json flag for terraform metadata functions subcommand
v1.4.0 · Mar 2023
· source
· release history
Adds timecmp built-in function for timestamp comparison with UTC offset handling
v1.3.0 · Sep 2022
· source
· release history
example
Render a template dynamically passed from a data resource or other variable, avoiding file system dependency.$ # In variables.tf variable "template_content" { type = string } # In resources.tf resource "example_resource" "foo" { config = templatestring(var.template_content, { key = var.value }) }
v1.9.0 · Jun 2024
· source
Store and reference dynamic data during a Terraform run without using workarounds.$ terraform_data "my_data" { input = "value_to_store" }
v1.4.0 · Mar 2023
· source
Export function signatures for tooling or documentation purposes.$ terraform metadata functions -json
v1.4.0 · Mar 2023
· source
Safely access nested object attributes that might not exist without triggering a nil pointer error.$ output "name" { value = try(var.user.address.street_name, "Unknown") }
v0.12.20 · Jan 2020
· source
+Provider lock file configurationverifiedAllows users to specify provider lock files for source, destination, and state storage providers to establish trust in the providers used during operations.8 releases · 7 other sources · first seen May 2019▸
release
8 total
terraform init now skips installing dependencies declared in development overrides, allowing mixed-override workflows.
v1.15.0 · Apr 2026
· source
· release history
terraform providers lock now accepts -enable-plugin-cache to leverage a configured global plugin cache during locking
v1.8.0 · Apr 2024
· source
· release history
Add removed block to configuration for refactoring module references without manually running terraform state rm
v1.7.0 · Jan 2024
· source
· release history
required_providers entries can now contain configuration_aliases to declare additional configuration alias names without requiring a configuration block.
v0.15.0 · Apr 2021
· source
· release history
terraform init now accepts a -lockfile=readonly option, which suppresses writing changes to the dependency lock file.
v0.15.0 · Apr 2021
· source
· release history
The version argument inside provider configuration blocks now generates an explicit deprecation warning; use provider requirements declarations instead
v0.14.0 · Dec 2020
· source
· release history
docs
Infrastructure-as-code tool for building, changing, and versioning infrastructure across cloud and on-premises providers.
command line
--state-provider-lock-file — path to the dependency lock file used to establish trust in the provider used for state storage. This flag can only be supplied when input is disabled. Defaults to the working directory's .terraform.lock.hcl file.
v1.16.0-alpha20260603 · Jun 2026
· command-line history
--destination-provider-lock-file — Path to a provider lock file for the destination provider.
v1.16.0-alpha20260513 · May 2026
· command-line history
--source-provider-lock-file — Path to a provider lock file for the source provider.
v1.16.0-alpha20260513 · May 2026
· command-line history
example
Run init without updating the provider lock file for CI/CD workflows managing it externally.$ terraform init -lockfile=readonly
v0.15.0 · Apr 2021
· source
Define expected providers and their version constraints within the root module configuration.$ terraform { required_providers { aws = "~> 2.0" azurerm = ">= 1.36" } }
v0.12.20 · Jan 2020
· source
Parse a YAML string directly in your configuration to configure resources dynamically.$ locals { config = yamldecode(""" name: example value: true """) }
v0.12.2 · Jun 2019
· source
+Module and expression evaluation featuresshippedAllows users to define dynamic configurations, iterate over collections, and use advanced expressions like for_each and splat operators.10 releases · 2 other sources · first seen May 2019▸
release
10 total
Terraform now stores planned private data for providers, preserving provider-specific state across plan and apply.
v1.16.0 · Aug 2026
· source
· release history
Providers can now use nested blocks as computed values.
v1.16.0 · Aug 2026
· source
· release history
Output blocks now support explicit type constraints.
v1.15.0 · Apr 2026
· source
· release history
Supports variables and locals in module source and version attributes, and most commands now accept variable values to satisfy them.
v1.15.0 · Apr 2026
· source
· release history
terraform test: Add mock_provider, override_resource, override_data, and override_module blocks to .tftest.hcl files for provider and resource mocking
v1.7.0 · Jan 2024
· source
· release history
Adds moved blocks to HCL configuration, allowing module authors to record resource address changes so Terraform automatically migrates state objects during planning.
v1.1.0 · Dec 2021
· source
· release history
example
Reference a local or variable in a module source so the registry path or version can be computed dynamically.$ locals { tf_module_version = "2.3.0" } module "vpc" { source = "terraform-aws-modules/vpc/aws" version = local.tf_module_version }
v1.15.0 · Apr 2026
· source
Generate a predictable UUID based on a resource name for consistent naming across environments.$ resource "example" "name" { id = uuidv5("namespace", self.name) }
v0.12.2 · Jun 2019
· source
+Output format selectionverifiedAllows users to select the output format for command results.9 releases · 3 other sources · first seen May 2019▸
Also counts toward: Command-line interface
release
9 total
terraform init now accepts the -json flag for machine-readable output.
v1.9.0 · Jun 2024
· source
· release history
terraform show JSON rendering now includes explicit applyable and complete flags for plan characteristics
v1.8.0 · Apr 2024
· source
· release history
Includes full structure of unknownness in terraform show -json output via changed after_unknown representation
v1.3.0 · Sep 2022
· source
· release history
The after_unknown field in terraform show -json output changes from a simple boolean to a full structure reflecting the unknownness of complex values.
v1.3.0 · Sep 2022
· source
· release history
terraform show -json now includes data describing which changes caused a resource to be replaced
v0.15.3 · May 2021
· source
· release history
Improves terraform show -json to include the full module tree even when child modules have no resources
v0.14.7 · Feb 2021
· source
· release history
Get machine-readable JSON output from initialization to parse in CI/CD scripts.$ terraform init -json
v1.9.0 · Jun 2024
· source
Check current configuration for compatibility issues before upgrading to Terraform 0.12$ terraform 0.12checklist
v0.11.14 · May 2019
· source
+State migration supportshippedAllows users to explicitly migrate state when changing backend configurations using the `-migrate-state` flag.6 releases · 3 other sources · first seen May 2021▸
Also counts toward: Command-line interface
release
terraform test cleanup now ignores the prevent_destroy attribute, unblocking teardown.
v1.14.0 · Nov 2025
· source
· release history
New -out flag on terraform plan enables saving Remote Plans from Terraform Cloud/Enterprise as local .plan files for later viewing and application
v1.6.0 · Oct 2023
· source
· release history
terraform test subcommand is now generally available for executing .tftest.hcl files with run blocks to validate configurations via plan/apply assertions
v1.6.0 · Oct 2023
· source
· release history
terraform workspace select now accepts the -or-create flag to create workspaces in automated situations
v1.4.0 · Mar 2023
· source
· release history
-or-create CLI argument for terraform workspace select
v1.4.0 · Mar 2023
· source
· release history
Adds -migrate-state flag to terraform init for explicit backend state migration
v0.15.4 · May 2021
· source
· release history
example
Save a remote plan from Terraform Cloud to disk so it can be inspected locally before applying in a different environment or workflow$ terraform plan -out=remote_plan.tfplan -var-file=prod.tfvars
v1.6.0 · Oct 2023
· source
Create a workspace if it does not exist during automated provisioning.$ terraform workspace select -or-create production
v1.4.0 · Mar 2023
· source
Explicitly migrate state when changing backend configurations.$ terraform init -migrate-state
v0.15.4 · May 2021
· source
+SSH connection handlingshippedManages SSH connectivity for remote execution, including key exchange methods and connection stability.8 releases · 1 other source · first seen Jul 2019▸
release
8 total
Includes the ca-certificates package in the official Terraform Docker image for improved certificate handling.
v1.11.0 · Feb 2025
· source
· release history
SSH client for provisioners now supports newer key algorithms
v1.2.0 · May 2022
· source
· release history
ssh provisioner connection now supports SSH over HTTP proxy
v1.2.0 · May 2022
· source
· release history
Supports Windows 10 built-in OpenSSH Client's SSH Agent for provisioner/remote-exec and provisioner/file in addition to Pageant.
v1.1.0 · Dec 2021
· source
· release history
Adds persistent SSH connection support via keepalives.
v0.11.15 · Apr 2021
· source
· release history
backend/s3: Add support for AWS Single-Sign On (SSO) cached credentials
v0.14.6 · Feb 2021
· source
· release history
example
Run a plan where you only want to see warning summaries if no errors occur, keeping the output clean.$ terraform plan -compact-warnings
v0.12.18 · Dec 2019
· source
+CLI output formatting and verbosity controlshippedAllows users to control the format of warnings, summaries, and other CLI output details.6 releases · 3 other sources · first seen Dec 2019▸
Also counts toward: Command-line interface
release
terraform apply now supports the -destroy flag, providing symmetry with terraform plan -destroy
v0.15.2 · May 2021
· source
· release history
terraform plan and terraform apply now support the -replace=<address> flag to force a resource instance to be replaced (destroyed and recreated) without changing configuration
v0.15.2 · May 2021
· source
· release history
terraform version -json output no longer includes the (previously-unpopulated) revision property
v0.15.0 · Apr 2021
· source
· release history
Core and Provider logs can now be enabled separately using TF_LOG_CORE and TF_LOG_PROVIDER environment variables.
v0.15.0 · Apr 2021
· source
· release history
terraform validate JSON output now includes a code snippet object for each diagnostic containing an excerpt of the source code.
v0.15.0 · Apr 2021
· source
· release history
cli: Consolidates warnings with identical summary text into single items to reduce output noise
v0.12.17 · Dec 2019
· source
· release history
example
Use apply to trigger a destroy operation, aligning with the plan syntax.$ terraform apply -destroy
v0.15.2 · May 2021
· source
Force a specific resource to be replaced on the next apply without altering its config.$ terraform apply -replace='aws_instance.web[0]'
v0.15.2 · May 2021
· source
Enable separate debugging logs for core and providers during init.$ TF_LOG_CORE=INFO TF_LOG_PROVIDER=DEBUG terraform init
v0.15.0 · Apr 2021
· source
+Test subcommandshippedExecutes `.tftest.hcl` files with run blocks to validate configurations via plan/apply assertions.6 releases · 1 other source · first seen Oct 2023▸
Also counts toward: Command-line interface
release
Adds mock_provider support for ephemeral resources in terraform test.
v1.17.0 · Oct 2026
· source
· release history
Detailed diagnostic objects are now produced when test run assertions fail.
v1.12.0 · May 2025
· source
· release history
Promotes terraform test -junit-xml to general availability, producing structured JUnit XML test reports.
v1.11.0 · Feb 2025
· source
· release history
Adds state_key attribute to run blocks in terraform test, giving test authors control over which internal state file a test run uses.
v1.11.0 · Feb 2025
· source
· release history
terraform console: Add -plan option to evaluate expressions against the planned new state
v1.7.0 · Jan 2024
· source
· release history
terraform test subcommand is now generally available for executing .tftest.hcl files with run blocks to validate configurations via plan/apply assertions
v1.6.0 · Oct 2023
· source
· release history
example
Run tests in CI and emit a JUnit XML report that can be ingested by test reporting tools like Jenkins or GitHub Actions.$ terraform test -junit-xml=results.xml
v1.11.0 · Feb 2025
· source
+Sensitive value handling in configurationsshippedEnforces or supports marking variables and module inputs as sensitive to prevent leakage in logs and plans, including support for sensitive maps.6 releases · 1 other source · first seen Dec 2020▸
release
Adds output values to plan component instance change descriptions in stacks, giving more context during stack plan review.
v1.15.2 · May 2026
· source
· release history
terraform test can now pass sensitive values to input variables while preserving their dynamic sensitivity during test runs.
v1.9.0 · Jun 2024
· source
· release history
Added issensitive() function to check if a value is marked as sensitive in configuration language
v1.8.0 · Apr 2024
· source
· release history
The json plan output now indicates which state values are sensitive
v1.0.1 · Jun 2021
· source
· release history
New functions sensitive and nonsensitive allow module authors to explicitly override Terraform's default inference of value sensitivity.
v0.15.0 · Apr 2021
· source
· release history
Config for_each: Allows maps with sensitive element values when keys and the map itself are not sensitive.
v0.14.3 · Dec 2020
· source
· release history
example
Configure dynamic resource instantiation where the iteration values contain sensitive data, leveraging the new support for sensitive map elements.$ resource "example" "main" { for_each = tomap({ item1 = var.sensitive_map_value }) val = each.value }
v0.14.3 · Dec 2020
· source
+Cloud-native CLI integrationshippedAllows users to enable native Terraform Cloud integration for CLI-driven runs, including per-run variables, via the `cloud` block.6 releases · 1 other source · first seen Dec 2021▸
Also counts toward: Command-line interface
release
Uploads JSON integration format for state to Terraform Cloud alongside state snapshots
v1.3.0 · Sep 2022
· source
· release history
TF_CLOUD_ORGANIZATION and TF_CLOUD_HOSTNAME as fallbacks for cloud block arguments
v1.2.0 · May 2022
· source
· release history
TF_WORKSPACE as implicit single-workspace configuration when cloud block lacks explicit workspaces config
v1.2.0 · May 2022
· source
· release history
Credential support via TF_TOKEN_ environment variable for Terraform-native services
v1.2.0 · May 2022
· source
· release history
Adds run tasks support as a Terraform Cloud integration for executing remote operations during the post plan stage of a run
v1.1.9 · Apr 2022
· source
· release history
Adds the cloud block inside the terraform settings block to enable native Terraform Cloud integration for CLI-driven runs, including support for per-run variables via the -var flag.
v1.1.0 · Dec 2021
· source
· release history
example
Authenticate Terraform to a remote service using an environment variable token.$ export TF_TOKEN_app_terraform_io=abc123token terraform plan
v1.2.0 · May 2022
· source
+Backend request customizationshippedAllows users to append custom data or identification strings to backend API requests for logging and correlation purposes.6 releases · 1 other source · first seen Aug 2020▸
release
Adds sts_endpoint field to the oss backend config to override the default STS service endpoint
v1.0.11 · Nov 2021
· source
· release history
Backend/etcdv3 gains the max_request_bytes argument to match server request limits.
v1.0.3 · Jul 2021
· source
· release history
Adds -refresh-only flag to terraform plan and terraform apply to explicitly refresh state by detecting external changes without applying configuration diffs
v0.15.4 · May 2021
· source
· release history
Adds retries and retry_sleep_min options to the backend/http configuration block.
v0.11.15 · Apr 2021
· source
· release history
Terraform will no longer make use of the HTTP_PROXY environment variable to determine proxy settings for connecting to HTTPS servers.
v0.15.0 · Apr 2021
· source
· release history
Adds support for appending data to the User-Agent request header via the TF_APPEND_USER_AGENT environment variable in the S3 backend
v0.13.1 · Aug 2020
· source
· release history
example
Append custom identification data (e.g., team name or pipeline ID) to S3 backend API requests for easier log correlation.$ TF_APPEND_USER_AGENT='my-org/s3-backend' terraform init
v0.13.1 · Aug 2020
· source
+Provider schema cachingshippedCaches provider schemas globally for compatible providers to reduce memory usage across multiple instances.6 releases · first seen Jan 2020▸
Also counts toward: Command-line interface
release
Terraform is now available as a pre-built binary for Linux s390x (zLinux).
v1.16.0 · Aug 2026
· source
· release history
Adds official Terraform builds for Linux s390x (zLinux), enabling mainframe deployments.
v1.15.4 · May 2026
· source
· release history
Supports .netrc credentials during terraform init provider installation for registry download and shasum URLs.
v1.11.0 · Feb 2025
· source
· release history
terraform providers lock now accepts -enable-plugin-cache to leverage a configured global plugin cache during locking
v1.8.0 · Apr 2024
· source
· release history
core: Provider schemas are now cached globally for compatible providers, reducing memory usage across multiple instances of the same provider
v1.6.0 · Oct 2023
· source
· release history
terraform init caches Terraform Registry metadata responses when handling multiple references to the same module.
v0.12.19 · Jan 2020
· source
· release history
+Ephemeral data supportshippedSupports marking input variables, outputs, and resources as ephemeral to prevent sensitive or transient values from being persisted in plan or state files.3 releases · 2 other sources · first seen Nov 2024▸
release
Adds ephemeral resources: a new resource kind re-read on every evaluation phase whose values are never written to state or plan files.
v1.10.0 · Nov 2024
· source
· release history
Adds ephemeralasnull function: converts any ephemeral values in a structure to non-ephemeral nulls, enabling safe use of ephemeral data where persistence is required.
v1.10.0 · Nov 2024
· source
· release history
Adds ephemeral input variables and outputs: mark variables or outputs as ephemeral = true to prevent them from being persisted to plan or state.
v1.10.0 · Nov 2024
· source
· release history
example
Pass an ephemeral variable (e.g. a bootstrap password) into your config so it is never recorded in the plan or state file.$ variable "admin_password" { type = string ephemeral = true sensitive = true }
v1.10.0 · Nov 2024
· source
Strip ephemeral marks from a value so it can be safely passed to a resource attribute that does not accept ephemeral inputs.$ locals { safe_password = ephemeralasnull(var.admin_password) }
v1.10.0 · Nov 2024
· source
+Remote state version bypassshippedAllows users to force operations against a remote backend despite version mismatches between the CLI and the remote state configuration.4 releases · 1 other source · first seen Dec 2020▸
Also counts toward: Command-line interface
release
Adds -migrate-state flag to terraform init for explicit backend state migration
v0.15.4 · May 2021
· source
· release history
The pg backend now supports the scram-sha-256 authentication method for PostgreSQL connections.
v0.14.5 · Jan 2021
· source
· release history
terraform_remote_state data source no longer enforces Terraform version checks on the remote state file
v0.13.6 · Jan 2021
· source
· release history
Adds -ignore-remote-version command-line flag to bypass remote workspace Terraform version compatibility checks during local state modifications
v0.14.1 · Dec 2020
· source
· release history
example
Force a plan against a remote backend even when the local and remote Terraform versions differ, for example to test or resolve a stuck state.$ terraform plan -ignore-remote-version
v0.14.1 · Dec 2020
· source
+Import block declarationshippedAllows declaring intent for adopting existing resources directly in the root module using import blocks.4 releases · first seen Jun 2023▸
release
import blocks inside modules are now supported, enabling modular import workflows previously restricted to root configurations.
v1.16.0 · Aug 2026
· source
· release history
Supports import blocks inside modules.
v1.16.0 · Aug 2026
· source
· release history
import block: Support for_each to expand imports for multiple resource instances
v1.7.0 · Jan 2024
· source
· release history
Adds import blocks to declare intent for adopting existing resources in the root module
v1.5.0 · Jun 2023
· source
· release history
+Resource action flow controlshippedAllows users to define how resource actions handle failures using modes like halt, taint, or continue.4 releases · first seen Apr 2021▸
release
Resource action triggers now support new on_failure modes: halt, taint, or continue to control execution flow.
v1.16.0 · Aug 2026
· source
· release history
Adds on_failure modes halt, taint, and continue to resource action triggers.
v1.16.0 · Aug 2026
· source
· release history
The -force option is no longer available on terraform destroy. Use -auto-approve instead
v0.15.0 · Apr 2021
· source
· release history
The deprecated ignore_changes = ["*"] wildcard syntax is no longer supported. Use ignore_changes = all instead.
v0.15.0 · Apr 2021
· source
· release history
+CLI invocation validationverifiedTerraform validates subcommands at invocation time and exits with an error and usage guidance when an unrecognised or malformed command is supplied.2 releases · 2 other sources · first seen Oct 2019▸
Also counts toward: Command-line interface
release
The validate command now checks the backend block — verifying the backend type exists, required attributes are present, and backend-level validation passes.
v1.15.0 · Apr 2026
· source
· release history
Adds -target warning in terraform plan and terraform apply to alert users when results may be incomplete.
v0.12.10 · Oct 2019
· source
· release history
we ran it
Terraform exited with status 1 and printed an error stating it has no command named /opt/ctk/fixtures/source-corpus, because the path was interpreted as a subcommand rather than a target.
Aug 2026
· the full run
Terraform exited with status 1 and printed an error stating it has no command named the given file path. No analysis was performed; the invocation was malformed.
Aug 2026
· the full run
+Parallel test executionshippedAllows users to execute plan and apply operations in parallel across multiple test runs to reduce total execution time.3 releases · 1 other source · first seen May 2025▸
release
terraform test: Teardown operations can now run in parallel, reducing test suite cleanup time.
v1.13.0 · Aug 2025
· source
· release history
Test runs can now be annotated for possible parallel execution, speeding up large test suites.
v1.12.0 · May 2025
· source
· release history
New -parallelism=n flag for terraform test sets the number of parallel operations during plan/apply in a test run.
v1.12.0 · May 2025
· source
· release history
example
Speed up a large Terraform test suite by running plan/apply operations in parallel across test runs.$ terraform test -parallelism=4
v1.12.0 · May 2025
· source
+State resource managementshippedProvides commands to inspect, import, and modify resources within the state file, including renaming providers or importing existing infrastructure.2 releases · 2 other sources · first seen Jan 2020▸
Also counts toward: CI/CD pipeline integration, Command-line interface
release
Adds check blocks for validating infrastructure with scoped data sources
v1.5.0 · Jun 2023
· source
· release history
-provider option is removed from terraform import.
v0.13.0 · Aug 2020
· source
· release history
example
Validate Terraform configuration by running assertions against the plan and state during CI/CD or local development$ terraform test *.tftest.hcl
v1.6.0 · Oct 2023
· source
Ensure clean state migrations by using state mv which now automatically cleans up stale source references.$ terraform state mv 'module.old.module_name' 'module.new.module_name'
v0.12.19 · Jan 2020
· source
+Provider authenticity verificationshippedEnsures the integrity and origin of distributed binaries, such as macOS releases, using platform-specific signing and notarization mechanisms.4 releases · first seen Dec 2019▸
release
The -verify-plugins=false option is no longer available on terraform init. (Terraform now _always_ verifies plugins.)
v0.15.0 · Apr 2021
· source
· release history
The -get-plugins=false option is no longer available on terraform init. (Terraform now _always_ installs plugins.)
v0.15.0 · Apr 2021
· source
· release history
Adds Windows executable signing for 32-bit and 64-bit binaries to remove unknown publisher warnings.
v0.12.24 · Mar 2020
· source
· release history
Darwin releases are now signed and notarized per Apple requirements, allowing execution on MacOS 10.15+ without manual Gatekeeper exceptions.
v0.12.18 · Dec 2019
· source
· release history
+Provisioner supportshippedEnables the execution of external scripts or software on resources during provisioning.4 releases · first seen May 2019▸
Also counts toward: Plugin API support, Scripting language support
release
Adds target_platform = "windows" to the connection block of the remote-exec provisioner to run commands on Windows hosts using the command interpreter
v0.14.7 · Feb 2021
· source
· release history
Destroy-time provisioners (when = destroy) and their associated connection blocks now warn when referencing objects other than self, count, or each.
v0.12.18 · Dec 2019
· source
· release history
Adds the puppet provisioner for executing Puppet manifests on managed resources
v0.12.2 · Jun 2019
· source
· release history
The wire protocol for provider and provisioner plugins has changed; plugins built against prior versions are not compatible with Terraform v0.12.
v0.12.0 · May 2019
· source
· release history
+Infrastructure querying and validationshippedAllows users to define, validate, and execute list operations against live infrastructure using new query files.3 releases · first seen Nov 2025▸
Also counts toward: Command-line interface
release
Promotes -policies flag on plan, apply, and query to GA — no longer requires an experimental build or -allow-experimental-features; query policies evaluate resources found by list blocks and return human-readable or JSON results.
v1.17.0 · Oct 2026
· source
· release history
New terraform query command executes list operations against live infrastructure and can optionally generate import configuration.
v1.14.0 · Nov 2025
· source
· release history
New list resource type defined in *.tfquery.hcl files enables querying and filtering existing infrastructure.
v1.14.0 · Nov 2025
· source
· release history
+Minimal refresh modeverifiedEnables a minimal-refresh flag to reduce side effects during state refresh operations.1 release · 2 other sources · first seen Aug 2026▸
release
Adds -minimal-refresh planning flag to plan and apply, refreshing only resources that have proposed changes rather than the full state.︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄
v1.17.0 · Oct 2026
· source
· release history
command line
--minimal-refresh — minimal-refresh
v1.17.0-alpha20260827 · Aug 2026
· command-line history
example
Speed up CI plan runs by only refreshing the resources that are actually changing, skipping unchanged remote state reads.$ terraform plan -minimal-refresh -out=tfplan
v1.17.0 · Oct 2026
· source
+Refresh-only execution scopeverifiedAllows users to explicitly refresh state by detecting external changes without applying configuration diffs using the `-refresh-only` flag.1 release · 2 other sources · first seen May 2021▸
release
Adds -refresh-only flag to terraform plan and terraform apply to explicitly refresh state by detecting external changes without applying configuration diffs
v0.15.4 · May 2021
· source
· release history
command line
--minimal-refresh — minimal-refresh
v1.17.0-alpha20260827 · Aug 2026
· command-line history
example
Plan to update the state with external changes without applying new configuration.$ terraform apply -refresh-only
v0.15.4 · May 2021
· source
+Dependency graph visualizationshippedVisualizes the Terraform dependency graph in Mermaid format for embedding in documentation or wikis.1 release · 2 other sources · first seen Aug 2026▸
release
Adds -format=mermaid flag to terraform graph to output dependency graphs in Mermaid format.
v1.16.0 · Aug 2026
· source
· release history
example
Visualize the Terraform dependency graph in Mermaid format for embedding in docs or wikis.$ terraform graph -format=mermaid > graph.md
v1.16.0 · Aug 2026
· source
Generate Mermaid diagrams of your infrastructure graph for documentation or CI reports.$ terraform graph -format=mermaid > graph.mmd
v1.16.0 · Aug 2026
· source
+Module evaluation scope controlverifiedAllows users to set the module evaluation scope used during command execution.3 other sources · first seen Jun 2019▸
Assume a role specified in ~/.aws/config when initializing the S3 backend.$ terraform init -backend-config='backend_config' # where config contains role_arn = "arn:aws:..."
v0.12.11 · Oct 2019
· source
Use an IAM role from AWS shared configuration files for the S3 backend.$ terraform { backend "s3" { bucket = "my-bucket" key = "state.tfstate" region = "us-east-1" # Chaining is automatic via AWS shared config } }
v0.12.3 · Jun 2019
· source
+Module source and version dynamic evaluationshippedSupports evaluating variables and locals in module source and version attributes for dynamic configuration.2 releases · 1 other source · first seen Apr 2026▸
release
Supports module version evaluating to null in dynamic module source configurations.
v1.15.5 · May 2026
· source
· release history
Supports variables and locals in module source and version attributes, and most commands now accept variable values to satisfy them.
v1.15.0 · Apr 2026
· source
· release history
example
Reference a local or variable in a module source so the registry path or version can be computed dynamically.$ locals { tf_module_version = "2.3.0" } module "vpc" { source = "terraform-aws-modules/vpc/aws" version = local.tf_module_version }
v1.15.0 · Apr 2026
· source
+Mocking capabilities for test runsshippedAllows users to mock providers and override resources, data sources, or modules within `.tftest.hcl` files to validate configurations in isolated environments.3 releases · first seen Jan 2024▸
release
Terraform Test mock blocks now allow function calls.
v1.15.0 · Apr 2026
· source
· release history
Adds override_during = plan option in terraform test run blocks so mocked/overridden values are applied during the plan phase instead of only at apply.
v1.11.0 · Feb 2025
· source
· release history
terraform test: Add mock_provider, override_resource, override_data, and override_module blocks to .tftest.hcl files for provider and resource mocking
v1.7.0 · Jan 2024
· source
· release history
+Variable validation rulesshippedAllows users to define custom validation logic for variable inputs directly within the configuration blocks.2 releases · 1 other source · first seen Aug 2020▸
release
The -var and -var-file options are no longer available on terraform validate.
v0.15.0 · Apr 2021
· source
· release history
Custom validation rules can be defined using the validation block inside variable blocks.
v0.13.0 · Aug 2020
· source
· release history
example
Define a variable where some object attributes are optional and have defaults.$ variable "config" { type = object({ host = string port = optional(number, 8080) tls_enabled = optional(bool, true) }) } resource "example_instance" "main" { config = var.config }
v1.3.0 · Sep 2022
· source
+Resource precondition and postcondition enforcementshippedAllows users to define logic checks that must pass before or after resource modifications.1 release · 2 other sources · first seen May 2022▸
release
precondition and postcondition check blocks for resources, data sources, and module output values
v1.2.0 · May 2022
· source
· release history
example
Validate that a resource configuration meets specific requirements before deployment proceeds.$ resource "example_resource" "foo" { precondition { condition = var.size >= 10 error_message = "Size must be at least 10." } }
v1.2.0 · May 2022
· source
Trigger recreation of a resource when its dependency changes.$ resource "aws_instance" "web" { lifecycle { replace_triggered_by = [aws_database_instance.db.id] } }
v1.2.0 · May 2022
· source
+HCL nullability constraintsshippedAllows users to declare variables as nullable or non-nullable in HCL to control default value fallback behavior.3 releases · first seen Apr 2021▸
release
Allows declaring variables as nullable = false in HCL to ensure they never hold a null value, falling back to the default if explicitly set to null.
v1.1.0 · Dec 2021
· source
· release history
Enables terraform workspace delete to remove workspaces containing only data resources and outputs without requiring terraform destroy first.
v1.1.0 · Dec 2021
· source
· release history
Previously deprecated quoted variable type constraints are no longer supported.
v0.15.0 · Apr 2021
· source
· release history
+Plan assertion validationshippedValidates Terraform configuration by running assertions against the plan and state during CI/CD or local development.2 other sources · first seen Oct 2023▸
Also counts toward: CI/CD pipeline integration, Command-line interface
example
Enforce org-wide policies in a standard (non-experimental) pipeline by running plan with the now-GA -policies flag.$ terraform apply -policies ./policies/ -auto-approve
v1.17.0 · Oct 2026
· source
Validate Terraform configuration by running assertions against the plan and state during CI/CD or local development$ terraform test *.tftest.hcl
v1.6.0 · Oct 2023
· source
+Ephemeral value storage in terraform_datashippedAllows the terraform_data resource to hold ephemeral and sensitive values across plan and apply using a store block.2 releases · first seen Aug 2026▸
release
terraform_data resource introduces a new store block to hold ephemeral and sensitive values across plan and apply.
v1.16.0 · Aug 2026
· source
· release history
Adds store block to the terraform_data resource to hold ephemeral and sensitive values across plan and apply.
v1.16.0 · Aug 2026
· source
· release history
+Machine-readable state outputshippedAllows users to retrieve plaintext secret values or resource state in JSON format for scripting.1 release · 1 other source · first seen Aug 2026▸
Also counts toward: Command-line interface, JSON data export
release
Adds -json flag to terraform state show for machine-readable output.
v1.16.0 · Aug 2026
· source
· release history
example
Get machine-readable JSON output of a resource's state for scripting or audit pipelines.$ terraform state show -json aws_instance.web
v1.16.0 · Aug 2026
· source
+Module import block supportshippedEnables the use of import blocks inside modules for modular infrastructure adoption.2 releases · first seen Aug 2026▸
release
import blocks inside modules are now supported, enabling modular import workflows previously restricted to root configurations.
v1.16.0 · Aug 2026
· source
· release history
Supports import blocks inside modules.
v1.16.0 · Aug 2026
· source
· release history
+Provider schema caching on Linux s390xshippedEnables provider schema caching and native support for the Linux s390x (zLinux) platform.2 releases · first seen May 2026▸
release
Terraform is now available as a pre-built binary for Linux s390x (zLinux).
v1.16.0 · Aug 2026
· source
· release history
Adds official Terraform builds for Linux s390x (zLinux), enabling mainframe deployments.
v1.15.4 · May 2026
· source
· release history
+Resource lifecycle destruction preventionshippedAllows users to prevent specific resources from being destroyed by setting destroy = false in the lifecycle block.1 release · 1 other source · first seen Aug 2026▸
release
Adds destroy = false to resource lifecycle blocks to prevent a resource from ever being destroyed.
v1.16.0 · Aug 2026
· source
· release history
example
Prevent a critical resource from accidental destruction by setting destroy = false in its lifecycle block.$ resource "aws_s3_bucket" "critical" { bucket = "my-critical-bucket" lifecycle { destroy = false } }
v1.16.0 · Aug 2026
· source
+String contains functionshippedProvides a built-in function to check whether a given string contains a given substring.2 releases · first seen Jun 2023▸
release
The contains() function can now test for null values.
v1.16.0 · Aug 2026
· source
· release history
Adds a new strcontains() function that checks whether a given string contains a given substring
v1.5.0 · Jun 2023
· source
· release history
+Configuration type conversionshippedProvides a built-in function to perform precise inline type conversions in configuration expressions.1 release · 1 other source · first seen Apr 2026▸
release
New convert function enables precise inline type conversions in configuration expressions.
v1.15.0 · Apr 2026
· source
· release history
example
Use the new convert function to enforce an exact type inline rather than relying on implicit coercion.$ locals { port = convert(var.port_input, number) }
v1.15.0 · Apr 2026
· source
+Variable deprecation warningsshippedAllows users to mark variables or outputs as deprecated so that callers receive warnings when they use them.1 release · 1 other source · first seen Apr 2026▸
release
New deprecated attribute on variable and output blocks emits warnings when deprecated variables are passed or deprecated outputs are referenced.
v1.15.0 · Apr 2026
· source
· release history
example
Mark a variable as deprecated so callers get a warning when they set it — useful when refactoring module interfaces.$ variable "legacy_region" { type = string deprecated = "Use the `region` variable instead; this variable will be removed in v2." }
v1.15.0 · Apr 2026
· source
+Inline external variables in testsshippedAllows users to define external variable blocks directly inside test files for complex variable types.1 release · 1 other source · first seen Aug 2025▸
release
terraform test: Test authors can define external variable blocks directly inside test files, removing the need for external variable sources.
v1.13.0 · Aug 2025
· source
· release history
example
Define an external variable inline in a test file so complex variable types are validated without a separate tfvars source.$ # inside mymodule.tftest.hcl variable "region" { default = "us-east-1" } run "deploy" { variables { region = var.region } }
v1.13.0 · Aug 2025
· source
+Structured resource identity importshippedAllows importing existing cloud resources using structured identity attributes instead of flat string IDs.1 release · 1 other source · first seen May 2025▸
release
import blocks now support a new identity attribute as an alternative to id for identifying resources to import.
v1.12.0 · May 2025
· source
· release history
example
Import an existing cloud resource using a structured identity attribute instead of a flat string ID.$ # In your Terraform config: import { identity = { project = "my-project" region = "us-east1" name = "my-resource" } to = google_some_resource.example }
v1.12.0 · May 2025
· source
+Azure OIDC Pipeline authenticationshippedAllows Azure backend authentication using auto-refreshing ADO Pipelines OIDC tokens.1 release · 1 other source · first seen Mar 2025▸
Also counts toward: CI/CD pipeline integration
release
Adds ADO Pipelines OIDC token refresh to the Azure backend via oidc_request_url, oidc_request_token, and the new ado_pipeline_service_connection_id config keys.
v1.11.2 · Mar 2025
· source
· release history
example
Authenticate Terraform's Azure backend with an Azure DevOps Pipeline OIDC token that auto-refreshes during long runs.$ terraform { backend "azurerm" { resource_group_name = "tfstate-rg" storage_account_name = "tfstateacct" container_name = "tfstate" key = "prod.terraform.tfstate" oidc_request_url =…
v1.11.2 · Mar 2025
· source
+S3 native state lockingshippedAllows users to enable state locking for S3 backends without requiring a DynamoDB table.1 release · 1 other source · first seen Feb 2025▸
release
Promotes S3 native state locking to GA via the use_lockfile argument in the S3 backend, eliminating the need for a DynamoDB table.
v1.11.0 · Feb 2025
· source
· release history
example
Enable S3-native state locking without DynamoDB by setting use_lockfile in your S3 backend config.$ terraform { backend "s3" { bucket = "my-tf-state" key = "prod/terraform.tfstate" region = "us-east-1" use_lockfile = true } }
v1.11.0 · Feb 2025
· source
+Advanced import block validationshippedsuggestedImproves the detection of invalid cases for import blocks during configuration validation and ensures errors are raised for nonexistent modules.2 releases · first seen Apr 2024▸
Suggested capability: Infrastructure-as-code security scanning. This is our guess, not confirmed.
release
Improves import block validation to catch more invalid cases during terraform validate.
v1.10.0 · Nov 2024
· source
· release history
Added issensitive() function to check if a value is marked as sensitive in configuration language
v1.8.0 · Apr 2024
· source
· release history
+Secret output retrievalshippedAllows users to retrieve plaintext secret values from the state for use in external scripts or environments without parsing JSON structures.1 release · 1 other source · first seen Dec 2020▸
release
Adds ephemeral resources: a new resource kind re-read on every evaluation phase whose values are never written to state or plan files.
v1.10.0 · Nov 2024
· source
· release history
example
Retrieve a plaintext secret (e.g., a password or API key) from state for direct use in shell scripts without JSON parsing.$ terraform output -raw my_secret_value
v0.14.3 · Dec 2020
· source
+Dynamic template rendering functionsshippedProvides built-in functions to render templates from dynamic string data without requiring file system dependencies.1 release · 1 other source · first seen Jun 2024▸
release
New built-in templatestring function allows rendering templates provided as strings rather than file paths.
v1.9.0 · Jun 2024
· source
· release history
example
Render a template dynamically passed from a data resource or other variable, avoiding file system dependency.$ # In variables.tf variable "template_content" { type = string } # In resources.tf resource "example_resource" "foo" { config = templatestring(var.template_content, { key = var.value }) }
v1.9.0 · Jun 2024
· source
+Enhanced validation rule expressionsshippedAllows input variable validation rules to be general expressions that reference other variables or data sources within the same module.1 release · 1 other source · first seen Jun 2024▸
release
Input variable validation rules are now general expressions that can refer to other input variables and data resources.
v1.9.0 · Jun 2024
· source
· release history
example
Write validation rules that reference other variables or data sources within the same module.$ # In variables.tf variable "allowed_regions" { type = list(string) } variable "region" { type = string validation { # Can now refer to `var.allowed_regions` directly condition =…
v1.9.0 · Jun 2024
· source
+Interactive console expression evaluationshippedAllows users to evaluate expressions against the current or planned state during an interactive console session.1 release · 1 other source · first seen Jan 2024▸
Also counts toward: Command-line interface
release
terraform console: Add -plan option to evaluate expressions against the planned new state
v1.7.0 · Jan 2024
· source
· release history
example
Evaluate expressions against the planned state during an interactive console session$ terraform console -plan > plan.resources[0].attributes.id
v1.7.0 · Jan 2024
· source
+Dynamic data resource typeshippedProvides a built-in managed resource type to store and reference dynamic data during a Terraform run without using external workarounds.1 release · 1 other source · first seen Mar 2023▸
release
terraform_data is a new builtin managed resource type that can store data of any type
v1.4.0 · Mar 2023
· source
· release history
example
Store and reference dynamic data during a Terraform run without using workarounds.$ terraform_data "my_data" { input = "value_to_store" }
v1.4.0 · Mar 2023
· source
+Machine-readable metadata exportshippedAllows exporting Terraform function signatures in JSON format for tooling or documentation purposes.1 release · 1 other source · first seen Mar 2023▸
Also counts toward: JSON data export
release
terraform metadata functions -json exports Terraform function signatures in machine-readable format
v1.4.0 · Mar 2023
· source
· release history
example
Export function signatures for tooling or documentation purposes.$ terraform metadata functions -json
v1.4.0 · Mar 2023
· source
+Configuration formatting capabilitiesshippedAllows users to format HCL configuration files for consistency and style.1 release · 1 other source · first seen Sep 2022▸
Also counts toward: Command-line interface
release
Allows terraform fmt to accept multiple target paths simultaneously
v1.3.0 · Sep 2022
· source
· release history
example
Format multiple configuration files in one command.$ terraform fmt file1.tf file2/main.tf modules/network/vpc.tf
v1.3.0 · Sep 2022
· source
+Azure authentication modernizationshippedUpdates AzureRM backend to require MSAL-based authentication for supported cloud environments.2 releases · first seen May 2022▸
release
AzureRM Backend defaults to MSAL (Microsoft Graph) for authentication
v1.2.0 · May 2022
· source
· release history
AzureRM Backend supports authenticating as a service principal using OpenID Connect
v1.2.0 · May 2022
· source
· release history
+Drift detection in outputshippedAllows users to inspect drift caused by external infrastructure changes directly from CLI output without parsing plan text.1 release · 1 other source · first seen Jul 2021▸
release
terraform plan -json now includes the resource_drift field to show changes detected outside of Terraform during refresh.
v1.0.3 · Jul 2021
· source
· release history
example
Inspect external infrastructure changes directly from CI logs without parsing plan text.$ terraform plan -json | jq '.resource_drift'
v1.0.3 · Jul 2021
· source
+Resource replacement targetingshippedAllows users to force a specific resource instance to be replaced (destroyed and recreated) without changing configuration using the `-replace` flag.1 release · 1 other source · first seen May 2021▸
Also counts toward: Command-line interface
release
terraform plan and terraform apply now support the -replace=<address> flag to force a resource instance to be replaced (destroyed and recreated) without changing configuration
v0.15.2 · May 2021
· source
· release history
example
Force a specific resource to be replaced on the next apply without altering its config.$ terraform apply -replace='aws_instance.web[0]'
v0.15.2 · May 2021
· source
+Remote registry client configurationshippedAllows users to configure request timeouts and retry behavior for module and provider discovery operations against the remote registry.2 releases · first seen Mar 2020▸
release
Add configurable request timeout for the remote registry client
v0.12.22 · Mar 2020
· source
· release history
Add configurable retries for module and provider discovery requests to the remote registry
v0.12.22 · Mar 2020
· source
· release history
+Remote backend version compatibility checkingshippedAllows users to check and report version compatibility between the CLI and a remote backend, including retrieving service discovery constraints for version validation.2 releases · first seen Dec 2018▸
release
backend/remote: Return detailed version (in)compatibility information
v0.11.11 · Dec 2018
· source
· release history
Add support to retrieve version constraints to service discovery
v0.11.11 · Dec 2018
· source
· release history
+Dynamic provider version constraintsshippedAllows variables and locals to be used in required_providers blocks, enabling dynamic provider version and source constraints.1 release · first seen Oct 2026▸
release
Supports variables and locals in provider required_providers blocks, enabling dynamic provider version and source constraints.
v1.17.0 · Oct 2026
· source
· release history
+Version output format versioningshippedAdds a format_version field to the JSON output of terraform version to allow safer future evolution of that output format.1 release · first seen Oct 2026▸
release
Adds a format_version field to the JSON output of terraform version, enabling safer future evolution of that output format.
v1.17.0 · Oct 2026
· source
· release history
+Action before and after destroy eventsshippedSupports before_destroy and after_destroy event triggers in resource actions.1 release · first seen Aug 2026▸
release
Adds before_destroy and after_destroy event support to Actions.
v1.16.0 · Aug 2026
· source
· release history
+Action caller contextshippedExposes the object value of the calling resource as a caller symbol in Action configurations.1 release · first seen Aug 2026▸
release
Adds caller symbol in Action configurations, exposing the object value of the calling resource.
v1.16.0 · Aug 2026
· source
· release history
+Action invocation targetingshippedAllows users to specify the calling resource instance when combining -invoke with -target flags.1 release · first seen Aug 2026▸
release
Allows -invoke to be combined with -target to specify the calling resource instance when multiple resources trigger the same action.
v1.16.0 · Aug 2026
· source
· release history
+Bastion host key provisioner applicationshippedEnsures bastion_host_key is correctly applied by provisioners for SSH connectivity.1 release · first seen Aug 2026▸
release
bastion_host_key is now correctly applied by provisioners — review your provisioner configurations to verify the configured key is correct before upgrading.
v1.16.0 · Aug 2026
· source
· release history
+Interactive console scope targetingshippedAllows users to evaluate expressions against a specific module or module instance within the interactive console.1 release · first seen Aug 2026▸
Also counts toward: Command-line interface
release
Adds -scope=<module address> flag to terraform console to evaluate expressions within a specific module or module instance scope.
v1.16.0 · Aug 2026
· source
· release history
+Plan and apply summary reportingshippedsuggestedDisplays a summary of policy evaluation outcomes and other run details for plan and apply operations.1 release · first seen Aug 2026▸
Suggested capability: Infrastructure-as-code security scanning. This is our guess, not confirmed.
release
Terraform now displays a summary of policy evaluation outcomes for plan and apply runs against HCP Terraform.
v1.16.0 · Aug 2026
· source
· release history
+Provider nested block supportshippedAllows providers to use nested blocks as computed values in their schemas.1 release · first seen Aug 2026▸
release
Providers can now use nested blocks as computed values.
v1.16.0 · Aug 2026
· source
· release history
+Resource action trigger refinementshippedSupports specifying the calling resource instance when multiple resources trigger the same action.1 release · first seen Aug 2026▸
Also counts toward: Command-line interface
release
Allows -invoke to be combined with -target to specify the calling resource instance when multiple resources trigger the same action.
v1.16.0 · Aug 2026
· source
· release history
+Terraform stacks hostname auto-detectionshippedAutomatically infers the target hostname from credentials configuration for Terraform Stacks operations.1 release · first seen Aug 2026▸
release
The terraform stacks command now automatically infers the target hostname from credentials.tfrc.json when neither TF_STACKS_HOSTNAME nor TF_CLOUD_HOSTNAME is set.
v1.16.0 · Aug 2026
· source
· release history
+Test cleanup reportingshippedReports which resources were left behind when skip_cleanup is set during test runs.1 release · first seen Aug 2026▸
release
Terraform now reports which resources were left behind when skip_cleanup is set in tests.
v1.16.0 · Aug 2026
· source
· release history
+Workspace list JSON outputshippedProvides machine-readable JSON output for workspace listing operations.1 release · first seen Aug 2026▸
Also counts toward: JSON data export
release
Adds -json flag to terraform workspace list for machine-readable output.
v1.16.0 · Aug 2026
· source
· release history
+Null module version supportshippedAllows module version attributes to evaluate to null in dynamic configurations.1 release · first seen May 2026▸
release
Supports module version evaluating to null in dynamic module source configurations.
v1.15.5 · May 2026
· source
· release history
+Plan component instance output valuesshippedAdds output values to plan component instance change descriptions in stacks for better context.1 release · first seen May 2026▸
release
Adds output values to plan component instance change descriptions in stacks, giving more context during stack plan review.
v1.15.2 · May 2026
· source
· release history
+Development override dependency handlingshippedAllows terraform init to skip installing dependencies declared in development overrides.1 release · first seen Apr 2026▸
release
terraform init now skips installing dependencies declared in development overrides, allowing mixed-override workflows.
v1.15.0 · Apr 2026
· source
· release history
+Format update for query filesshippedUpdates terraform fmt to support formatting of .tfquery.hcl files.1 release · first seen Apr 2026▸
release
terraform fmt now formats .tfquery.hcl files.
v1.15.0 · Apr 2026
· source
· release history
+Mock block function call supportshippedEnables function calls within Terraform Test mock blocks for more dynamic mocking.1 release · first seen Apr 2026▸
release
Terraform Test mock blocks now allow function calls.
v1.15.0 · Apr 2026
· source
· release history
+Native Windows ARM64 buildsshippedProvides pre-built binaries for Terraform on Windows ARM64 architectures.1 release · first seen Apr 2026▸
release
Adds native Windows ARM64 builds for Terraform.
v1.15.0 · Apr 2026
· source
· release history
+Output type constraintsshippedAllows users to define explicit type constraints for output blocks in configurations.1 release · first seen Apr 2026▸
release
Output blocks now support explicit type constraints.
v1.15.0 · Apr 2026
· source
· release history
+S3 backend environment variable strictnessshippedEnforces strict true/false validation for AWS FIPS and dualstack endpoint environment variables.1 release · first seen Apr 2026▸
release
backend/s3: AWS_USE_FIPS_ENDPOINT and AWS_USE_DUALSTACK_ENDPOINT environment variables now only accept true or false; any other non-empty value (previously treated as true) is no longer honoured.
v1.15.0 · Apr 2026
· source
· release history
+S3 backend IAM Identity Center supportshippedAdds support for SSO/IAM Identity Center authentication flows in the S3 backend.1 release · first seen Apr 2026▸
Also counts toward: Single sign-on
release
S3 backend now supports authentication via aws login (SSO/IAM Identity Center flows).
v1.15.0 · Apr 2026
· source
· release history
+Sensitive path logging in list_startshippedIncludes sensitive attribute paths in list_start JSON log entries for better auditability.1 release · first seen Apr 2026▸
release
Sensitive attribute paths are now included in list_start JSON log entries.
v1.15.0 · Apr 2026
· source
· release history
+SSH provisioner PowerShell supportshippedRe-enables PowerShell support for SSH-based file and remote-exec provisioners.1 release · first seen Apr 2026▸
Also counts toward: PowerShell script execution, Scripting language support
release
SSH-based provisioners (file and remote-exec) re-enable PowerShell support.
v1.15.0 · Apr 2026
· source
· release history
+Stack variable validationshippedsuggestedEnables input variable validation rules specifically for Terraform Stacks configurations.1 release · first seen Apr 2026▸
Suggested capability: Infrastructure-as-code security scanning. This is our guess, not confirmed.
release
Input variable validation is now supported for Stacks.
v1.15.0 · Apr 2026
· source
· release history
+Terraform stacks registry sourcingshippedAllows stack components to be sourced from a component registry within the Terraform Stacks workflow.1 release · first seen Dec 2025▸
release
Adds component registry source resolution support to Terraform Stacks, enabling stack components to be sourced from a registry.
v1.14.2 · Dec 2025
· source
· release history
+Imperative resource actionsshippedAllows providers to define and trigger non-CRUD imperative actions on resources via lifecycle or CLI flags.1 release · first seen Nov 2025▸
release
New top-level action block lets providers define imperative, non-CRUD operations (e.g. aws_lambda_invoke) triggered via resource lifecycle or the -invoke CLI flag.
v1.14.0 · Nov 2025
· source
· release history
+OCI Object Storage state backendshippedAllows users to store and manage Terraform state in Oracle Cloud Infrastructure (OCI) Object Storage.1 release · first seen May 2025▸
release
Adds new backend for OCI Object Storage, enabling remote state storage on Oracle Cloud Infrastructure.
v1.12.0 · May 2025
· source
· release history
+Write-only resource attributesshippedAllows providers to mark specific resource attributes as write-only so they are never persisted in the state file.1 release · first seen Feb 2025▸
release
Adds write-only resource attributes: providers can mark attributes as write-only so they are never persisted in state, enabling safe use of ephemeral values in those fields.
v1.11.0 · Feb 2025
· source
· release history
+Dynamic import ID expressionsshippedAllows the import block to accept dynamic expressions for its id field, such as resource attributes.1 release · first seen Oct 2023▸
release
config: The import block now accepts dynamic expressions for its id field, such as resource attributes, provided the value is known at plan time
v1.6.0 · Oct 2023
· source
· release history
+JSON plan error statusshippedIndicates if a planning process halted with an error in JSON output, making the plan non-applicable.1 release · first seen Oct 2023▸
release
terraform show -json: The JSON output now includes an errored property to indicate if a planning process halted with an error, making the plan non-applicable
v1.6.0 · Oct 2023
· source
· release history
+Kubernetes backend scalingshippedStores states larger than 1MiB by splitting state across multiple secrets in the Kubernetes backend.1 release · first seen Oct 2023▸
release
backend/kubernetes: Kubernetes backend can now store states larger than 1MiB by splitting state across multiple secrets
v1.6.0 · Oct 2023
· source
· release history
+Remote plan exportshippedEnables saving remote plans from Terraform Cloud to local disk for inspection in different environments or workflows.1 release · first seen Oct 2023▸
release
New -out flag on terraform plan enables saving Remote Plans from Terraform Cloud/Enterprise as local .plan files for later viewing and application
v1.6.0 · Oct 2023
· source
· release history
+Unknown value trackingshippedTracks unknown value details such as collection length ranges and nullability for more precise function results.1 release · first seen Oct 2023▸
release
core: The type system now tracks unknown value details (e.g., collection length ranges, nullability) enabling more precise results for try and can functions with unknown arguments
v1.6.0 · Oct 2023
· source
· release history
+Configuration generation from planshippedGenerates HCL configuration for imported resources directly from the `terraform plan` output.1 release · first seen Jun 2023▸
release
Adds -generate-config-out=PATH flag to terraform plan to generate HCL for imported resources
v1.5.0 · Jun 2023
· source
· release history
+Infrastructure check blocksshippedsuggestedValidates infrastructure with scoped data sources using check blocks in configurations.1 release · first seen Jun 2023▸
Suggested capability: Infrastructure-as-code security scanning. This is our guess, not confirmed.
release
Adds check blocks for validating infrastructure with scoped data sources
v1.5.0 · Jun 2023
· source
· release history
+Plan-time timestamp functionshippedProvides a built-in function to return the timestamp at plan time for use in configurations.1 release · first seen Jun 2023▸
release
Adds a new plantimestamp() function that returns the timestamp at plan time
v1.5.0 · Jun 2023
· source
· release history
+Error-tolerant plan file savingshippedAllows `terraform plan` to save a plan file even when encountering errors, facilitating inspection of partial results.1 release · first seen Mar 2023▸
release
terraform plan can now store a plan file even when encountering errors
v1.4.0 · Mar 2023
· source
· release history
Lines in monospace are the tool's own words: help text
parsed from its source, or an endpoint from its API document. Under
release, a line is our summary of a dated release. Under
docs, it is quoted from the tool's own documentation or
website. Each links back to the source it came from.
Command line
View
Source
No command matches.
load a captured run
composed command
No matchesTry a different search, or clear a filter to see more.
option surface across analysed releases
options at that releaseadded, per releaseremoved, per release
option
found in
since
description
No matchesTry a different search, or clear a filter to see more.
option changes per release — drag across the rail to set a range
→
Values are placeholders taken from each option’s declared default.
Nothing is executed here — the output shown is a recording of a run
that already happened.
Score card
Shipping velocityreleases a month, last 12 months
Documentation qualityrelease-notes rubric, 0–100
Breaking-change disciplinehow rarely a release breaks users, and notice given
Maintenance riskquiet time against its own cadence, maintainers
Innovation & surfacenew capabilities, API and MCP surface
Community health
Contributor trenddistinct committers, this year against last
Maintainer concentrationbus factor now against a year ago
Issue backlog trendissues closed per issue opened, 12 months
Responsivenessmedian time to a maintainer’s first reply
Nine scores for terraform, each built from the releases, notes and API history this site tracks — and, on Researcher and Business, where it stands among every measured tool in its category and how that has moved.
Each score is 0–100 on a published rubric, derived from data this site already shows.
A dimension we cannot measure says so — it is never scored 0 and never enters a rank.
How this is scored
Shipping velocity — releases a month over the last 12 months, on a log scale where 16 a month scores 100. Needs 3 releases in the window.
Documentation quality — the release-notes rubric published on the analytics page, unchanged.
Breaking-change discipline — the share of releases carrying a breaking change (none scores 100, half or more scores 0). Only projects that label breaking changes are measured: a clean record cannot be told from an unlabelled one.
Maintenance risk — quiet time measured against the tool's own release cadence (quiet longer than 90 days and three typical gaps scores 0), plus the number of active maintainers and whether contributors are growing, where known. Higher is lower risk.
Innovation & surface — new capabilities in the feature ledger this year, API and MCP operations added, and the share of commits that are features: the mean of whichever we hold.
Community health (open-source tools only) — each is a direction, not a size: contributors this year against last, the bus factor now against a year ago, and issues closed per issue opened, where steady scores 50, doubled 100 and halved 0; plus the median time to a maintainer's first reply (an hour scores about 100, a month or more 0). A commercial card has no repository and carries none of the four.
Documented delivery (commercial tools) — when a vendor's documented new capabilities have slowed against its own baseline, that counts against the overall standing as heavily as two low dimensions. Steady delivery, or too little history to judge, leaves the standing alone; it is never a sixth score.
Open-source tools are scored on repository signals; commercial tools on their published changelog. Ranks compare tools within one category and one profile and need at least five measured peers; the overall standing needs three ranked dimensions. Best-in-breed or consolidator is a shape, not a quality, and is never scored.
Release-note detail over time
See how much detail terraform puts in its release notes, quarter by quarter, and compare it with tracked tools in the same category. This history uses up to ten retained, reviewed notes per tool; sparse or blank older quarters may reflect that limit.
HashiCorp's pricing page as it looked each month from August 2025 to October 2026: 3 renders, 0 changes of tagline or palette. Step through them, play them, or put any two months side by side.
Website history is included with Researcher and Business.
← → or h l a month · Shift a year · [ ] previous / next change · Space play · 1 2 3 page · T whole page · C compare · F full size
← → or h l the right month · Shift the left · S swap · W wipe · T whole page · Esc back
Rebranding timeline
Dates bound when a change appeared between captures. Possible rebrands are AI suggestions; a redesign alone does not establish a rebrand.
Releases
Show
72 entries
No entries match these filters.
October 20261
August 20261
May 20263
April 20261
December 20251
November 20251
August 20251
May 20251
March 20251
February 20251
November 20241
August 20241
June 20241
April 20241
January 20242
November 20232
October 20232
June 20231
March 20231
September 20221
May 20221
April 20221
February 20221
December 20211
November 20211
September 20211
July 20211
June 20211
May 20213
April 20212
February 20212
January 20212
December 20203
September 20201
August 20202
May 20202
March 20202
February 20201
January 20202
December 20193
November 20191
October 20192
September 20192
August 20191
July 20193
June 20192
May 20192
December 20181
Project health
Issue, contributor and maintainer activity in hashicorp/terraform, 2023-10 – 2026-09,
as of 2026-09-25. Twelve-month figures first; the trend lines run
the whole window.
Contributors64−44 vs prior 12 months
Maintainers9+5 joined · −4 left, last 12 months
Bus factor4committers behind half the commits
Community-filed95%of issues opened, last 12 months
Median time to close3.4 daysfirst maintainer reply 9.3 hours
Open backlog1,761of 21,769 issues ever filed
Issues opened / month16 · 1communitymaintainers
Open backlog1,761
Contributors / month17
Commits / month89
Stars49,665
Issue themes, last 12 months
bugs 61%
features 32%
questions 1%
other 6%
Counts from the project's public repository and git history; no individuals
are identified. Maintainers are the committers covering 80% of the last year's
commits. how we measure this
Articles
12 articles
· updated Nov 4, 2026
Where terraform turns up in what others publish: how-tos, attack reports that
name it, and incident write-ups. A row says why it is here and quotes where the
article names it; the link goes to the publisher.
After a long time I am back with a new tutorial in Terraform series.
2 more quotes
If you’re just getting started with Terraform or you’ve been copying and pasting the same resource blocks over and over (we’ve all been there), this article is for you.
Terraform is your best friend when managing cloud resources, but writing everything by hand gets old fast.
Ready to master Infrastructure as Code (IaC) with Terraform?
2 more quotes
Whether you’re just starting out or looking to level up, we’ve got you covered with simple, step-by-step articles that make Terraform easy and fun to learn.
Below, you’ll find a complete list of our Terraform articles.
That’s kind of what Terraform does for tech stuff like servers, databases, and networks.
Terraform is a tool that lets you write code to create and manage your infrastructure—the servers, storage, and other tech resources you need for your apps.
This report expands on how Terraform lock files enable the delivery of malware from custom Terraform provider registries controlled by the attackers.
2 more quotes
Weaponized Terraform Coding Projects Each campaign related to this wave of activity uses social engineering via fake job interview lures, a traditional Contagious Interview approach common among DPRK actors.
The engineer ran Terraform and Ansible against AWS, OVH and OpenStack on most working days, and the machine held cloud credentials and source control access: much like LayerZero Labs’ “Developer1”.
These campaigns use purpose-built development environments aimed at one engineer at a time, paired with backdoored Terraform builds that differ for each victim." Found this article interesting?
1 more quote
…terraform-candidate-repo The repositories include a weaponized Terraform dependency lock file (".terraform.lock.hcl") pointing to malicious domains (e.g., "registry.hashicorp-aws[.]com") that causes the…
Add the badge to your README
Maintain this project? The badge links readers straight to this page, so they can
follow every release here.