Terraform Configuration
Configure how Atmos executes Terraform and OpenTofu commands, including the base path for components, auto-approve behavior, backend file generation, and initialization options.
The term "Terraform" is used in this documentation to refer to generic concepts such as providers, modules, stacks, the HCL-based domain-specific language and its interpreter. Atmos works with both Terraform and OpenTofu.
Configuration
Configuration Reference
commandSpecifies the executable to run for Terraform commands. Defaults to
terraform.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_COMMANDCommand-line flag:--terraform-commandExamples:
terraform- Use Terraform from PATHtofu- Use OpenTofu from PATH/usr/local/bin/terraform-1.8- Use specific version/usr/local/bin/tofu-1.7.1- Use specific OpenTofu version
base_pathDirectory containing Terraform component directories. Supports absolute and relative paths.
Environment variable:
ATMOS_COMPONENTS_TERRAFORM_BASE_PATHCommand-line flag:--terraform-dirapply_auto_approveWhen
true, Atmos adds-auto-approvetoterraform applycommands, skipping the confirmation prompt.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_APPLY_AUTO_APPROVEDefault:falsedeploy_run_initWhen
true, Atmos runsterraform initbefore executingatmos terraform deploy.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_DEPLOY_RUN_INITCommand-line flag:--deploy-run-initDefault:trueinit_run_reconfigureWhen
true, Atmos adds-reconfiguretoterraform initcommands, updating backend configuration.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_INIT_RUN_RECONFIGURECommand-line flag:--init-run-reconfigureDefault:trueauto_generate_backend_fileWhen
true, Atmos generatesbackend.tf.jsonfrom stack configuration before running Terraform commands.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_AUTO_GENERATE_BACKEND_FILECommand-line flag:--auto-generate-backend-fileDefault:trueauto_generate_filesWhen
true, Atmos generates files from thegeneratesection in stack configuration before running Terraform commands.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_AUTO_GENERATE_FILESDefault:falseinit.pass_varsWhen
true, Atmos passes the generated varfile toterraform initusing--var-file. This is primarily useful with OpenTofu, which supports passing varfiles to init for dynamic backend configuration.This also applies to the implicit
initthat Atmos runs while resolving a component referenced through!terraform.outputoratmos.Component— its vars are forwarded asTF_VAR_*environment variables so that modules with init-time variable dependencies (for example, a moduleversionbound to avar) can initialize.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_INIT_PASS_VARSCommand-line flag:--init-pass-varsDefault:falseplan.skip_planfileWhen
true, Atmos skips creating a plan file duringterraform plan. The plan output is shown but not saved.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_PLAN_SKIP_PLANFILECommand-line flag:--skip-planfileDefault:falseplugin_cacheWhen
true, Atmos enables Terraform provider plugin caching by automatically settingTF_PLUGIN_CACHE_DIR. This improves performance by reusing downloaded providers across components, reducing init times and network bandwidth.This is Terraform's own provider cache and is independent of the registry cache (
cache). The plugin cache stores provider plugins that Terraform manages itself; the registry cache is an Atmos-managed proxy that caches both provider and module registry traffic. The two are separate layers and can be used together.When caching is enabled, Atmos also sets
TF_PLUGIN_CACHE_MAY_BREAK_DEPENDENCY_LOCK_FILE=trueas required by Terraform.If
TF_PLUGIN_CACHE_DIRis already set in your environment or via the globalenv:section inatmos.yaml, Atmos does not override it—you manage your own cache.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_PLUGIN_CACHEDefault:trueplugin_cache_dirCustom directory path for the Terraform plugin cache. If empty (default), Atmos uses the XDG cache directory:
~/.cache/atmos/terraform/plugins.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_PLUGIN_CACHE_DIRDefault:""(uses XDG cache directory)auto_provision_workdir_for_outputsWhen
true(default), Atmos automatically provisions the JIT working directory for components withprovision.workdir.enabled: truebefore runningterraform initduring!terraform.outputoratmos.Componentevaluation. This enables cross-component output references to work on any machine, including fresh CI runners where the workdir has not been created yet.Set to
falseto disable auto-provisioning.terraform initwill still run, but only if the workdir has already been created by a prior deploy; on a fresh machine with no prior workdir it will fail.For state-only reads, prefer
!terraform.state— it reads the state file directly with noterraform init, no workdir provisioning step, and no terraform binary required.Environment variable:
ATMOS_COMPONENTS_TERRAFORM_AUTO_PROVISION_WORKDIR_FOR_OUTPUTSDefault:trueshell.promptCustom prompt to display when running
atmos terraform shell.
Using OpenTofu
To use OpenTofu instead of Terraform, set the command to tofu:
OpenTofu supports additional features like passing variables to init for dynamic backend configuration:
CLI Configuration (rc)
The rc section declares the Terraform/OpenTofu CLI configuration (.terraformrc / .tofurc). Atmos renders it and exposes it to the subprocess via TF_CLI_CONFIG_FILE and TOFU_CLI_CONFIG_FILE — no hand-managed dotfiles. It is a near-opaque passthrough: keys map directly to CLI-config directives, so new directives work without an Atmos release.
enabled- Enable rendering of the CLI configuration. Defaults to
false. - (remaining keys)
- Rendered verbatim into Terraform's native CLI config (HCL):
provider_installation,host,credentials,plugin_cache_dir, etc.
components:
terraform:
rc:
enabled: true
provider_installation:
- network_mirror:
url: "https://terraform-mirror.example.com/"
- direct:
exclude:
- "registry.terraform.io/hashicorp/*"
If you already manage your own CLI config (via TF_CLI_CONFIG_FILE, TOFU_CLI_CONFIG_FILE, or the legacy TERRAFORM_CONFIG), Atmos detects it and defers to you.
Registry Cache (cache)
The cache section enables the Terraform registry cache — transparent provider and module caching via an ephemeral local network-mirror proxy. It is execution-environment (runner) configuration that merges through the stack hierarchy.
This is not the same as Terraform's plugin_cache: the registry cache is an Atmos-managed proxy that caches both provider and module registry traffic (default root ~/.cache/atmos/terraform/registry), whereas plugin_cache is Terraform's own provider plugin cache (~/.cache/atmos/terraform/plugins). They are independent layers.
enabledEnable the registry cache. Defaults to
Environment variable:false.ATMOS_COMPONENTS_TERRAFORM_CACHE_ENABLEDlocationCache root. Defaults to the XDG cache directory under
Environment variable:terraform/registry.ATMOS_COMPONENTS_TERRAFORM_CACHE_LOCATIONbackend.type- Storage backend.
filesystem(default). metadata_ttl- Time-to-live for registry metadata (Go duration). Defaults to
24h. stale_while_revalidate- Window during which stale metadata may be served while revalidating (Go duration). Defaults to
168h. mirror.enabled- Express fleet pre-seeding policy. The
cache mirrorcommand runs regardless. Defaults tofalse.
Target platforms are configured at the project level via platforms (not under cache), since the same list also drives multi-platform lock completion.
components:
terraform:
platforms:
- linux_amd64
- darwin_arm64
- windows_amd64
cache:
enabled: true
metadata_ttl: 24h
stale_while_revalidate: 168h
Manage the cache with atmos terraform cache list|stats|prune|delete|mirror.
Platforms (platforms)
components.terraform.platforms is the list of target platforms a project builds for, as <os>_<arch> (e.g. linux_amd64, darwin_arm64). A single list drives two things:
- Eager pre-seeding
- The lazy proxy only caches the platform Terraform requests at run time (your host's). Run
atmos terraform cache mirrorto pre-fetch every platform inplatformsinto the same cache directory — for mixed CI/developer fleets or air-gapped bundles. - Complete lock files
- When a customized provider installation method is active (Terraform's default
plugin_cache, or the registrycache),initwrites a.terraform.lock.hclwith checksums for only the host platform and warns "Incomplete lock file information for providers". Withplatformsdeclared, Atmos runsproviders lockafter init to complete the lock for every platform, so a committed lock installs cleanly across a fleet.
components:
terraform:
platforms:
- linux_amd64
- darwin_arm64
- windows_amd64
For ephemeral or vendored components (provision.workdir or a source:) the canonical .terraform.lock.hcl has no committable home, so Atmos keeps the committed lock per instance as .<stack>-<component>.terraform.lock.hcl — restored into the working directory before init and persisted after. Keep canonical **/.terraform.lock.hcl ignored and un-ignore !**/.*-*.terraform.lock.hcl in .gitignore. Plain in-repo components keep committing the canonical lock as usual.
Generated Files
When auto_generate_backend_file is enabled, Atmos generates a backend.tf.json file in each component directory. Add this to your .gitignore:
# Atmos generated files
backend.tf.json
Related Commands
Execute Terraform/OpenTofu commands
Generate and show execution plan
Apply infrastructure changes
Run init, plan, and apply in sequence
Open an interactive shell
Generate backend configuration files
Generate variable files
Generate auxiliary configuration files