diff --git a/terraform/eval_context_builtin.go b/terraform/eval_context_builtin.go index f01292abb..20b37933d 100644 --- a/terraform/eval_context_builtin.go +++ b/terraform/eval_context_builtin.go @@ -289,6 +289,7 @@ func (ctx *BuiltinEvalContext) EvaluationScope(self addrs.Referenceable, keyData Evaluator: ctx.Evaluator, ModulePath: ctx.PathValue, InstanceKeyData: keyData, + Operation: ctx.Evaluator.Operation, } return ctx.Evaluator.Scope(data, self) } diff --git a/terraform/evaluate.go b/terraform/evaluate.go index 85be320e6..8e503c3d1 100644 --- a/terraform/evaluate.go +++ b/terraform/evaluate.go @@ -91,6 +91,10 @@ type evaluationStateData struct { // since the user specifies in that case which variable name to locally // shadow.) InstanceKeyData InstanceKeyEvalData + + // Operation records the type of walk the evaluationStateData is being used + // for. + Operation walkOperation } // InstanceKeyEvalData is used during evaluation to specify which values, @@ -506,6 +510,12 @@ func (d *evaluationStateData) GetResourceInstance(addr addrs.ResourceInstance, r return cty.DynamicVal, diags } + // Break out early during validation, because resource may not be expanded + // yet and indexed references may show up as invalid. + if d.Operation == walkValidate { + return cty.DynamicVal, diags + } + schema := d.getResourceSchema(addr.ContainingResource(), rs.ProviderConfig) // If we are able to automatically convert to the "right" type of instance