terraform-knowledge-patch
Terraform / OpenTofu Knowledge Patch
Covers Terraform 1.8–1.15 and OpenTofu 1.7–1.12 (April 2024 – March 2026). Baseline knowledge: Terraform 1.7, OpenTofu 1.6.
Index
| Topic | Reference | Key features |
|---|---|---|
| Ephemeral values | references/ephemeral-values.md | Ephemeral variables, resources, write-only arguments, new functions |
| Variable validation | references/variable-validation.md | Cross-object references in validation blocks |
| Import & identity | references/import-identity.md | Resource identity schema, import by identity attributes |
| Terraform Stacks | references/stacks.md | Component-based multi-environment deployments (HCP Terraform) |
| Terraform Actions | references/actions.md | Day 2 provider-defined operations (TF 1.14 preview) |
| New functions | references/new-functions.md | templatestring, ephemeralasnull, terraform.applying |
| OpenTofu divergences | references/opentofu.md | enabled meta-argument, destroy=false, const variables, prevent_destroy expressions |
Quick Reference — What's New
Ephemeral Values (TF 1.10+, OT 1.11) — Most Important Change
New value category never persisted to plan or state. Three constructs:
| Construct | Syntax | Purpose |
|---|---|---|
| Ephemeral variable | variable "x" { ephemeral = true } |
Accept secrets as input without state storage |
| Ephemeral output | output "x" { ephemeral = true } |
Pass secrets between modules without state storage |
| Ephemeral resource | ephemeral "provider_type" "name" { } |
Fetch secrets at plan/apply time, never stored |
Reference via ephemeral.<type>.<name>.<attribute>.
Ephemeral resources have an open/renew/close lifecycle — they run during every plan and apply, never persisted between runs. If an input references an unknown value, execution defers to apply.
Critical pattern — secrets in provider config:
ephemeral "aws_secretsmanager_secret_version" "db_master" {
secret_id = data.aws_db_instance.example.master_user_secret[0].secret_arn
}
locals {
credentials = jsondecode(ephemeral.aws_secretsmanager_secret_version.db_master.secret_string)
}
provider "postgresql" {
host = data.aws_db_instance.example.address
password = local.credentials["password"]
}
Write-Only Arguments (TF 1.11+, OT 1.11)
Resource attributes that accept ephemeral values and are never stored in state. Paired with a _wo_version argument to control updates.
resource "aws_db_instance" "main" {
# ...
password_wo = ephemeral.random_password.db.result
password_wo_version = 1 # Increment to trigger password rotation
}
Common write-only attributes:
| Resource | Write-only attribute |
|---|---|
aws_db_instance |
password_wo |
aws_rds_cluster |
master_password_wo |
aws_secretsmanager_secret_version |
secret_string_wo |
aws_ssm_parameter |
value_wo |
google_secret_manager_secret_version |
secret_data_wo |
kubernetes_secret_v1 |
data_wo |
See references/ephemeral-values.md for full examples.
Cross-Object Variable Validation (TF 1.9)
Validation blocks can now reference other variables, data sources, and locals — not just the variable itself:
variable "cluster_endpoint" {
type = string
default = ""
validation {
condition = var.create_cluster == false ? length(var.cluster_endpoint) > 0 : true
error_message = "cluster_endpoint required when create_cluster is false."
}
}
See references/variable-validation.md for details.
templatestring Function (TF 1.9)
Renders a template from a string value (not a file). Useful for templates from data sources:
locals {
rendered = templatestring(data.http.template.response_body, {
APP_NAME = var.app_name
PORT = var.port
})
}
Resource Identity for Import (TF 1.12)
Import blocks now support structured identity attributes instead of opaque ID strings:
import {
to = aws_instance.example
identity = {
id = "i-1234567890abcdef0"
}
}
See references/import-identity.md for details.
Terraform Stacks (HCP Terraform, GA Sep 2025)
Component-based multi-environment deployments using new file types. Requires HCP Terraform.
# main.tfcomponent.hcl
component "networking" {
source = "./modules/networking"
inputs = { region = var.region, cidr = var.cidr }
}
component "cluster" {
source = "./modules/k8s"
inputs = { vpc_id = component.networking.vpc_id }
}
# deploy.tfdeploy.hcl
deployment "us-east" {
inputs = { region = "us-east-1", cidr = "10.0.0.0/16" }
}
deployment "eu-west" {
inputs = { region = "eu-west-1", cidr = "10.1.0.0/16" }
}
Limits: 20 deployments, 100 components, 10k resources per stack. See references/stacks.md.
Terraform Actions (TF 1.14, Preview)
Day 2 operations defined by providers — triggered before/after resource CRUD or ad hoc via CLI. Codifies operational tasks (Lambda invocations, cache invalidations, Ansible playbooks) alongside infrastructure. See references/actions.md.
New Functions Quick Reference
| Function | Version | Purpose |
|---|---|---|
templatestring(str, vars) |
TF 1.9 | Render template from string (not file) |
ephemeralasnull(value) |
TF 1.10+ | Convert ephemeral value to non-ephemeral null |
terraform.applying |
TF 1.10+ | Returns true during apply, false during plan |
See references/new-functions.md for examples.
OpenTofu Divergences
| Feature | Version | Syntax |
|---|---|---|
enabled meta-argument |
OT 1.11 | lifecycle { enabled = var.create } |
destroy = false |
OT 1.12 | lifecycle { destroy = false } |
const variables |
OT 1.12 | variable "x" { const = true } |
prevent_destroy expressions |
OT 1.12 | lifecycle { prevent_destroy = var.protect } |
See references/opentofu.md for examples.
More from nevaberry/nevaberry-plugins
dioxus-knowledge-patch
Dioxus changes since training cutoff (latest: 0.7.4) — Signals replacing use_state, RSX macro overhaul, server functions, asset!() system, dx CLI, Element-as-Result. Load before working with Dioxus.
46rust-knowledge-patch
Rust changes since training cutoff (latest: 1.94.0) \u2014 Rust 2024 Edition, async closures, trait upcasting, new std APIs, cargo resolver v3. Load before working with Rust.
20postgresql-knowledge-patch
PostgreSQL changes since training cutoff (latest: 18.1) — JSON_TABLE, SQL/JSON functions, MERGE RETURNING, virtual generated columns, UUIDv7, temporal PRIMARY KEY. Load before working with PostgreSQL.
16bun-knowledge-patch
Bun changes since training cutoff (latest: 1.3.10) \u2014 S3 client, built-in SQL/Redis, route-based HTTP server, CSS bundler, V8 compatibility. Load before working with Bun.
14nextjs-knowledge-patch
Next.js changes since training cutoff (latest: 16.1) — proxy.ts, \"use cache\", Cache Components, navigation hooks, typed routes, auto PageProps, React 19.2. Load before working with Next.js.
14postgis-knowledge-patch
PostGIS changes since training cutoff (latest: 3.6.1) — SFCGAL CG_* rename, ST_CoverageClean, ST_AsRasterAgg, topology bigint IDs, viewport simplification, 3D SFCGAL ops. Load before working with PostGIS.
13