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.
Leave a Reply