PROBLEM
Terragrunt has a feature that allows one module to pass outputs to another module.
For example, if “project-prod” module wants to consume “subfolders” output from “folder” module, it can be done like this in “project-prod” module’s terragrunt.hcl
:-
include { path = find_in_parent_folders() } dependency "folder" { config_path = "../folder" } inputs = { env_folders = dependency.folder.outputs.subfolders }
The challenge is when running commands such as plan-all
, it will fail with the following error:-
Cannot process module Module [...] because one of its dependencies, [...], finished with an error: /my/path/folder/terragrunt.hcl is a dependency of /my/path/project-prod/terragrunt.hcl but detected no outputs. Either the target module has not been applied yet, or the module has no outputs. If this is expected, set the skip_outputs flag to true on the dependency block.
SOLUTION
This error occurs because the generated plan for “folder” module has not been applied yet (ie: the infrastructure does not exist), hence there are no outputs to pass to “project-prod” module to satisfy plan-all
.
To fix this, mock outputs can be supplied:-
include { path = find_in_parent_folders() } dependency "folder" { config_path = "../folder" mock_outputs = { subfolders = { "dev" = { "id" = "temp-folder-id" } "prod" = { "id" = "temp-folder-id" } "uat" = { "id" = "temp-folder-id" } } } } inputs = { env_folders = dependency.folder.outputs.subfolders }
Finally, when running apply-all
, it will use the runtime outputs instead of provided mock outputs to build the rest of the infrastructure.