PROBLEM
Given the following output block:-
output "subnet_uc1" {
description = "Subnets in `us-central1` region for all 3 products"
value = {
artifactory = module.subnet_uc1_artifactory.subnets.name
xray = module.subnet_uc1_xray.subnets.name
mc = module.subnet_uc1_mc.subnets.name
}
}
Sometimes, during an apply or destroy, we may get this error:-
Error: Attempt to get attribute from null value
on outputs.tf line 40, in output "subnet_uc1":
40: artifactory = module.subnet_uc1_artifactory.subnets.name
|----------------
| module.subnet_uc1_artifactory.subnets is null
This value is null, so it does not have any attributes.
Error: Attempt to get attribute from null value
on outputs.tf line 41, in output "subnet_uc1":
41: xray = module.subnet_uc1_xray.subnets.name
|----------------
| module.subnet_uc1_xray.subnets is null
This value is null, so it does not have any attributes.
Error: Attempt to get attribute from null value
on outputs.tf line 42, in output "subnet_uc1":
42: mc = module.subnet_uc1_mc.subnets.name
|----------------
| module.subnet_uc1_mc.subnets is null
This value is null, so it does not have any attributes.
One way to fix this is to do conditional expressions like this, but it’s not pretty:-
output "subnet_uc1" {
description = "Subnets in `us-central1` region for all 3 products"
value = {
artifactory = module.subnet_uc1_artifactory.subnets != null ? module.subnet_uc1_artifactory.subnets.name: ""
xray = module.subnet_uc1_xray.subnets != null ?module.subnet_uc1_xray.subnets.name: ""
mc = module.subnet_uc1_mc.subnets != null ? module.subnet_uc1_mc.subnets.name: ""
}
}
SOLUTION
Since Terraform v0.12.20, we can solve this with try and achieve the same outcome:-
output "subnet_uc1" {
description = "Subnets in `us-central1` region for all 3 products"
value = {
artifactory = try(module.subnet_uc1_artifactory.subnets.name, "")
xray = try(module.subnet_uc1_xray.subnets.name, "")
mc = try(module.subnet_uc1_mc.subnets.name, "")
}
}
Leave a Reply