hashicorp/terraform · error

error in marshaling deferred resource changes: %s

Error message

error in marshaling deferred resource changes: %s

What it means

Top-level wrapper: serializing deferred changes (p.DeferredResources) via MarshalDeferredResourceChanges failed. MarshalDeferredResourceChanges calls marshalResourceChange internally, so the inner failure modes are the same as 608 (615/616/617 or decode/ctyjson).

Source

Thrown at internal/command/jsonplan/plan.go:312

		}
	}

	if err := output.marshalRelevantAttrs(p); err != nil {
		return nil, fmt.Errorf("error marshaling relevant attributes for external changes: %s", err)
	}

	// output.ResourceChanges
	if p.Changes != nil {
		output.ResourceChanges, err = MarshalResourceChanges(p.Changes.Resources, schemas)
		if err != nil {
			return nil, fmt.Errorf("error in marshaling resource changes: %s", err)
		}
	}

	if p.DeferredResources != nil {
		output.DeferredChanges, err = MarshalDeferredResourceChanges(p.DeferredResources, schemas)
		if err != nil {
			return nil, fmt.Errorf("error in marshaling deferred resource changes: %s", err)
		}
	}

	if p.DeferredActionInvocations != nil {
		output.DeferredActionInvocations, err = MarshalDeferredActionInvocations(p.DeferredActionInvocations, schemas)
		if err != nil {
			return nil, fmt.Errorf("error in marshaling deferred action invocations: %s", err)
		}
	}

	// output.OutputChanges
	if output.OutputChanges, err = MarshalOutputChanges(p.Changes); err != nil {
		return nil, fmt.Errorf("error in marshaling output changes: %s", err)
	}

	// output.Checks
	if p.Checks != nil && p.Checks.ConfigResults.Len() > 0 {
		output.Checks = jsonchecks.MarshalCheckStates(p.Checks)

View on GitHub (pinned to c9def3e214)

Solutions

  1. Inspect the inner error for the specific deferred resource and cause.
  2. Ensure providers are installed (terraform init) and versions aligned.
  3. Regenerate the plan after resolving the unknowns that caused deferral.
Defensive patterns

Strategy: try-catch

Try / catch

deferred, err := jsonplan.MarshalDeferredResourceChanges(plan.DeferredResources, schemas)
if err != nil {
    return fmt.Errorf("marshal deferred changes: %w", err)
}

Prevention

When it happens

Trigger: p.DeferredResources != nil and one deferred ResourceInstanceChangeSrc fails to marshal. Triggered when planning defers actions (unknown count/config/provider) and one of those changes cannot be rendered.

Common situations: Deferred actions combined with a missing schema or version skew; a deferred resource whose provider is unavailable at render time.

Related errors


AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07). Data as JSON: /api/errors/bab7673a646087fa. Report an issue: GitHub.