-
-
Notifications
You must be signed in to change notification settings - Fork 148
Description
Describe the Bug
atmos describe affected and atmos list affected fail when a stack references Terraform outputs from another component and the referenced component lives under components/, which is populated by atmos vendor pull.
The temp repo/workdir created during affected processing contains vendor.yaml but does not contain the vendored components/ tree. Atmos then tries to generate backend.tf.json for the referenced component inside that temp repo and fails with no such file or directory.
This shows up reliably with cross-component output resolution via atmos.Component, and in testing it became much more visible after moving stack config to !terraform.state.
Expected Behavior
Expected behavior
When affected evaluates stacks that reference outputs from vendored Terraform components, Atmos should either:
- materialize vendored components in the temp repo/workdir before resolving outputs, or
- avoid requiring
components/terraform/<component>to exist in that temp repo, or - fail earlier with a clearer error indicating vendored components are not present.
Actual behavior
Atmos creates a temp repo under /var/folders/.../T/... for affected, but that temp repo contains files like:
atmos.yamlvendor.yamlstacks/modules/
and does not contain:
components/terraform/iam
Later, during stack processing, Atmos resolves the referenced component path inside that temp repo and tries to write:
/var/folders/.../T/.../components/terraform/iam/backend.tf.json
That fails because the parent directory does not exist.
Error
Error: failed to get affected components: template: describe-stacks-all-sections:85:28: executing "describe-stacks-all-sections" at <atmos.Component>: error calling Component: atmos.Component(iam, app-name-dev) failed to get terraform outputs: failed to generate backend file: open /var/folders/gv/cptvgjk51jd6jjcy6f1m0n2h0000gp/T/1874067959/components/terraform/iam/backend.tf.json: no such file or directory
Debug evidence
From debug logs:
DEBU Resolved component path type=terraform component=iam resolved_path=/Users/me/Documents/projects/repos/my-app/components/terraform/iam
DEBU Resolved component path type=terraform component=iam resolved_path=/var/folders/gv/cptvgjk51jd6jjcy6f1m0n2h0000gp/T/1874067959/components/terraform/iam
DEBU Writing backend config file=/var/folders/gv/cptvgjk51jd6jjcy6f1m0n2h0000gp/T/1874067959/components/terraform/iam/backend.tf.json
But the temp repo contents are:
$ ls -l /var/folders/gv/cptvgjk51jd6jjcy6f1m0n2h0000gp/T/1874067959
atmos.yaml
ci/
config.js
deployment-pipeline.md
hack/
modules/
README.md
renovate.json5
stacks/
tasks.yaml
vendor.yaml
WORKFLOWS.md
No components/ directory exists there.
Steps to Reproduce
Repository characteristics:
components/is not checked in directlycomponents/is created viaatmos vendor pull
Stack references outputs from another Terraform component, for example:
vars:
iam_policy_arn: '{{ (atmos.Component "iam" .stack).outputs.policy_arns_map.app-name}}'or with !terraform.state:
vars:
iam_policy_arn: !terraform.state iam .policy_arns_map.app-nameThen run:
atmos describe affected -s app-name-devor
atmos list affected -s app-name-devScreenshots
No response
Environment
Darwin HM2G76X9LF 25.3.0 Darwin Kernel Version 25.3.0
v1.209.0
Additional Context
atmos terraform planworks in the real repo.- The failure happens in the temp repo created for
affected. - Adding JIT vendoring/workdir config did not resolve it in testing; the temp repo still had
vendor.yamlbut nocomponents/. - This appears to affect cross-component output resolution generally, not only
!terraform.state, because the failing function in the captured logs isatmos.Component(iam, app-name-dev).
Suspected root cause
affected creates a temp repo/workdir but does not vendor components into it before evaluating cross-component output lookups. Later code paths assume components/terraform/<component> exists and attempt to generate backend.tf.json there.
Requested fix
Ensure vendored components are available in the temp repo/workdir used by describe/list affected before resolving cross-component Terraform outputs.