Skip to main content

atmos terraform source

Use these commands to manage Terraform component sources with just-in-time (JIT) vendoring. This enables components to declare their source location inline using the top-level source field without requiring a separate component.yaml file. Sources are automatically provisioned when running terraform commandsβ€”just run atmos terraform plan and the source is downloaded on first use.

Source-Based Version Pinning

Learn how to use the source field for native per-environment version control directly in stack configuration.

atmos terraform source --help

Usage​

atmos terraform source <subcommand> [options]

Subcommands​

Automatic Provisioning​

Sources are automatically provisioned when running any terraform command. If a component has source configured and the target directory doesn't exist, Atmos downloads the source before running terraform:

# Source is automatically provisioned on first use
atmos terraform plan vpc --stack dev
# β†’ Auto-provisioning source for component 'vpc'
# β†’ Auto-provisioned source to components/terraform/vpc
# β†’ Terraform runs

This means you can simply configure your component's source and run terraformβ€”no explicit vendor step needed.

CLI Commands​

The explicit CLI commands are useful for fine-grained control:

  • Force re-vendor to get the latest version
  • Describe source configuration
  • Delete vendored sources
  • List components with sources

How It Works​

The source provisioner enables just-in-time vendoring of Terraform components directly from stack configuration. Instead of pre-vendoring components or maintaining separate component.yaml files, you can declare the source inline:

# stacks/dev.yaml
components:
terraform:
vpc:
source:
uri: github.com/cloudposse/terraform-aws-components//modules/vpc
version: 1.450.0
included_paths:
- "*.tf"
- "modules/**"
excluded_paths:
- "*.md"
- "tests/**"
vars:
cidr_block: "10.0.0.0/16"

When you run atmos terraform source pull vpc --stack dev, Atmos:

  1. Reads Configuration - Extracts source from the component's stack manifest.
  2. Resolves Source - Parses the go-getter-compatible URI with optional version.
  3. Downloads Content - Fetches the source using go-getter (supports git, s3, http, oci, etc.).
  4. Filters Files - Applies included_paths and excluded_paths patterns.
  5. Copies to Target - Places files in the component directory.

Source Specification​

The source field supports two formats:

String Format (Simple)​

For simple cases, use a go-getter URI string:

source: "github.com/cloudposse/terraform-aws-components//modules/vpc?ref=1.450.0"

Map Format (Full Control)​

For more control, use a map with explicit fields:

source:
uri: github.com/cloudposse/terraform-aws-components//modules/vpc
version: 1.450.0
included_paths:
- "*.tf"
- "*.tfvars"
- "modules/**"
excluded_paths:
- "*.md"
- "tests/**"
- "examples/**"

Source Fields​

uri
Go-getter compatible source URI. Supports git, s3, http, gcs, oci, and other protocols.
version
Version tag, branch, or commit. Appended as ?ref=<version> for git sources. For non-git sources (S3, HTTP, OCI), the version should be embedded in the URI itself.
included_paths
Glob patterns for files to include. If specified, only matching files are copied.
excluded_paths
Glob patterns for files to exclude. Applied after included_paths filtering.
retry

Optional retry configuration for handling transient network errors during download. Useful for unreliable networks or when hitting rate limits.

retry:
max_attempts: 5
initial_delay: 2s
max_delay: 60s
backoff_strategy: exponential

All fields are optional. Recommended: max_attempts, initial_delay, max_delay, backoff_strategy (exponential, linear, constant). Additional options: multiplier, random_jitter, max_elapsed_time.

Examples​

Vendor a Component​

Download and vendor a component source:

atmos terraform source pull vpc --stack dev

Output:

Vendoring component 'vpc' from source...
Downloading from github.com/cloudposse/terraform-aws-components//modules/vpc?ref=1.450.0
βœ“ Successfully vendored component to components/terraform/vpc

Force Re-vendor​

Force re-download even if the component directory exists:

atmos terraform source pull vpc --stack dev --force

View Source Configuration​

Display the source configuration for a component:

atmos terraform source describe vpc --stack dev

Output:

components:
terraform:
vpc:
source:
uri: github.com/cloudposse/terraform-aws-components//modules/vpc
version: 1.450.0
included_paths:
- "*.tf"
- "modules/**"
excluded_paths:
- "*.md"
- "tests/**"

List Components with Sources​

List all components that have source configured:

atmos terraform source list --stack dev

Delete Vendored Source​

Remove the vendored component directory (requires --force for safety):

atmos terraform source delete vpc --stack dev --force

Arguments​

component
The Atmos component name (required for pull, describe, delete)

Flags​

--stack / -s
Atmos stack name (required). Can also be set via ATMOS_STACK environment variable.
--identity / -i
Identity to use for authentication when downloading from protected sources.
--force / -f
Force re-vendor even if component directory exists (pull command), or confirm deletion (delete command).

Authentication​

Source commands support authentication for accessing private repositories or cloud storage.

Component-Level Identity​

Components can specify an authentication identity:

components:
terraform:
vpc:
source:
uri: github.com/my-org/private-components//modules/vpc
version: v1.0.0
auth:
identities:
github-deployer:
default: true
kind: github/app
via:
provider: github-app

Identity Flag Override​

Override the component's default identity:

atmos terraform source pull vpc --stack dev --identity admin

For more details on configuring authentication identities, see the Authentication Guide.

Configuration Patterns​

Inheritance with source​

Use stack inheritance to share source configurations:

# stacks/catalog/vpc/defaults.yaml
components:
terraform:
vpc/defaults:
source:
uri: github.com/cloudposse/terraform-aws-components//modules/vpc
version: 1.450.0

# stacks/dev.yaml
components:
terraform:
vpc:
metadata:
inherits: [vpc/defaults]
# Inherits source configuration
vars:
cidr_block: "10.0.0.0/16"

Version Override per Environment​

Override the version per environment:

# stacks/dev.yaml
components:
terraform:
vpc:
metadata:
inherits: [vpc/defaults]
source:
version: 1.451.0 # Override version for dev

# stacks/prod.yaml
components:
terraform:
vpc:
metadata:
inherits: [vpc/defaults]
source:
version: 1.450.0 # Pin to stable version for prod

Supported Source Types​

The source provisioner uses go-getter and supports multiple protocols:

Git Sources​

Shortened GitHub syntax (recommended):

source:
uri: github.com/cloudposse/terraform-aws-components//modules/vpc
version: 1.450.0

Explicit HTTPS:

source:
uri: git::https://github.com/org/repo.git//path
version: main

Explicit SSH:

source:
uri: git::ssh://git@github.com/org/repo.git//path
version: main

S3 Sources​

source:
uri: s3::https://s3-us-east-1.amazonaws.com/my-bucket/components/vpc.tar.gz

HTTP/HTTPS Sources​

source:
uri: https://releases.example.com/components/vpc-1.0.0.tar.gz

OCI Registry Sources​

source:
uri: oci::registry.example.com/components/vpc:v1.0.0

Error Handling​

Missing source​

Error: source not configured

Hint: Add source to the component configuration in your stack manifest

Example:
components:
terraform:
vpc:
source:
uri: github.com/cloudposse/terraform-aws-components//modules/vpc
version: 1.450.0

Component Directory Exists​

Error: component directory already exists

Hint: Use --force to overwrite the existing directory

Download Failed​

Error: failed to download source

Cause: failed to clone repository: authentication required

Hint: Check credentials or use --identity to specify authentication

Comparison with Vendoring​

Featuresourcecomponent.yaml
Configuration locationInline in stackSeparate file
Version per environmentYesSingle version
JIT downloadYesPre-vendored
Path filteringYesYes
Mixins supportNoYes

Mixins allow combining multiple source configurations into a single component. See Vendoring for details.

Use source when:

  • You want version control per environment
  • You prefer configuration colocation in stacks
  • You need just-in-time vendoring

Use component.yaml when:

  • You need mixin support
  • You want pre-vendored components
  • You have complex vendoring requirements

See Also​