diff --git a/terraform/eval_for_each.go b/terraform/eval_for_each.go index 23ba388b5..1db1c3fad 100644 --- a/terraform/eval_for_each.go +++ b/terraform/eval_for_each.go @@ -50,7 +50,7 @@ func evaluateResourceForEachExpressionKnown(expr hcl.Expression, ctx EvalContext Subject: expr.Range().Ptr(), }) return nil, true, diags - case !forEachVal.IsWhollyKnown(): + case !forEachVal.IsKnown(): return map[string]cty.Value{}, false, diags } @@ -74,6 +74,11 @@ func evaluateResourceForEachExpressionKnown(expr hcl.Expression, ctx EvalContext }) return nil, true, diags } + + // For sets, we need to recursively check ...and add reasoning why this works here + if !forEachVal.IsWhollyKnown() { + return map[string]cty.Value{}, false, diags + } } // If the map is empty ({}), return an empty map, because cty will return nil when representing {} AsValueMap diff --git a/terraform/terraform_test.go b/terraform/terraform_test.go index 3a9d88c0b..0d8cc0900 100644 --- a/terraform/terraform_test.go +++ b/terraform/terraform_test.go @@ -553,7 +553,25 @@ aws_instance.foo["e30a7edcc42a846684f2a4eea5f3cd261d33c46d"]: ID = foo provider = provider.aws foo = foo - type = aws_instance` + type = aws_instance +aws_instance.one["a"]: + ID = foo + provider = provider.aws +aws_instance.one["b"]: + ID = foo + provider = provider.aws +aws_instance.two["a"]: + ID = foo + provider = provider.aws + + Dependencies: + aws_instance.one +aws_instance.two["b"]: + ID = foo + provider = provider.aws + + Dependencies: + aws_instance.one` const testTerraformApplyMinimalStr = ` aws_instance.bar: ID = foo diff --git a/terraform/testdata/plan-for-each-unknown-value/main.tf b/terraform/testdata/plan-for-each-unknown-value/main.tf index 2b26dbd1f..933ed5f4c 100644 --- a/terraform/testdata/plan-for-each-unknown-value/main.tf +++ b/terraform/testdata/plan-for-each-unknown-value/main.tf @@ -9,3 +9,12 @@ resource "aws_instance" "foo" { ) foo = "foo" } + +# referencing another resource, which means it has some unknown values in it +resource "aws_instance" "one" { + for_each = toset(["a", "b"]) +} + +resource "aws_instance" "two" { + for_each = aws_instance.one +}