Backend Provisioning
provision.backend automatically creates the Terraform state backend (S3 bucket, lockfile resource) before the first run of a component. The backend: block describes where state lives; provision.backend.enabled tells Atmos to create that location if it doesn't exist. Use this to eliminate the chicken-and-egg bootstrap problem of needing a state backend before you can deploy the component that creates it.
Schema
provision.backend.enabledAutomatically provision the Terraform state backend before the first run. Currently supports S3 backends with optional native S3 locking (Terraform 1.10+).
- Type:
boolean - Default:
false - Applies to: Terraform components only
- Type:
Configuration
Enable automatic backend creation alongside the existing backend: configuration.
stacks/catalog/vpc.yaml
When enabled, before running any Terraform command Atmos will:
- Check whether the configured backend already exists.
- If it doesn't, provision it using secure defaults (versioning, encryption, access blocking).
- Continue with
terraform initand execution.
Configuration Hierarchy
provision.backend participates in Atmos's deep-merge system, so you can set defaults at high levels and override per component.
Toolchain-Level Defaults
Apply backend provisioning to every Terraform component in a stack by setting it under the toolchain key:
stacks/orgs/acme/plat/dev/_defaults.yaml
Environment-Specific Overrides
Configure different provisioning policies per environment:
stacks/orgs/acme/plat/staging/_defaults.yaml
Catalog Inheritance
Share provision configuration through reusable catalog components:
stacks/catalog/networking/vpc.yaml
Component-Level Overrides
Opt a single component out of a toolchain or catalog default by setting enabled: false:
stacks/orgs/acme/plat/dev/us-east-1.yaml
Atmos combines configurations from all levels, with component-level configuration having the highest precedence. Use catalog inheritance for reusable patterns and override per component when needed.
Supported Backend Types
S3 (AWS)
The S3 backend provisioner creates buckets with hardcoded security best practices:
- Versioning: Enabled (protects against accidental deletions)
- Encryption: AES-256 with AWS-managed keys (always enabled)
- Public Access: Blocked (all 4 block settings enabled)
- Locking: Native S3 locking (Terraform 1.10+, no DynamoDB required)
- Tags: Automatic resource tags (
Name,ManagedBy=Atmos)
Required Configuration:
stacks/catalog/vpc.yaml
Cross-Account Provisioning
stacks/catalog/vpc.yaml
The provisioner will assume the specified role to create the bucket in the target account.
Manual Provisioning
You can also provision backends explicitly using the CLI:
This is useful for:
- CI/CD pipelines with separate provisioning stages
- Troubleshooting provisioning issues
- Batch provisioning for multiple components
- Pre-provisioning before large-scale deployments
See atmos terraform backend for complete CLI documentation.
Required IAM Permissions
For S3 backend provisioning, the identity needs these permissions:
For cross-account provisioning, also add:
Solving the Terraform Bootstrap Problem
Automatic provisioning is fully compatible with Terraform-managed backends. It solves a classic chicken-and-egg problem: "How do I manage my state backend with Terraform when I need that backend to exist before Terraform can run?"
Traditional Workaround:
- Use local state temporarily.
- Create the S3 bucket with Terraform using local state.
- Switch backend configuration to S3.
- Import the bucket into the S3-backed state.
- Delete local state files.
With Atmos Automatic Provisioning:
- Enable
provision.backend.enabled: true. - Run
atmos terraform plan— backend auto-created with secure defaults. - Import the bucket into Terraform (no local state dance needed).
- Done — everything managed by Terraform.
Migrating to Terraform-Managed Backends
Once your backend is provisioned, you can import it into Terraform for advanced management.
Step 1: Provision the Backend
Use Atmos to create the backend with secure defaults:
Step 2: Import into Terraform
Add the backend to your Terraform configuration and import it:
Step 3: Optionally Disable Automatic Provisioning
Once Terraform manages the backend, you can optionally disable automatic provisioning:
stacks/prod.yaml
You can leave provision.backend.enabled: true even after importing to Terraform. The provisioner is idempotent — it will detect the bucket exists and skip creation, causing no conflicts with Terraform management.
Alternatively, use the terraform-aws-tfstate-backend module for backends with advanced features like cross-region replication, lifecycle policies, and custom KMS keys.
Idempotent Operations
Backend provisioning is idempotent — running it multiple times is safe:
Global Defaults
There is no settings.provision.backend in atmos.yaml today. Backend provisioning is opted in per component or per toolchain because it has stronger side effects (creating cloud resources). For workdir defaults, see Settings: Provision Defaults.
Related
- Terraform Backend Configuration — The separate
backend:block describing where state lives - Terraform Backends — Conceptual overview of supported backend types
- Remote State — Reading other components' state
- Workdir Provisioning — The other half of the
provision:block atmos terraform backend— CLI commands for backend managementterraform-aws-tfstate-backend— Advanced backend module