hashicorp/terraform · error

Failed to initialize config loader

Error message

Failed to initialize config loader: %s

What it means

PlanCommand opReq construction calls c.initConfigLoader(); failure is wrapped and the plan operation request cannot be built. The -allow-deferral guard above it returns a separate Sourceless diagnostic; this error specifically covers loader construction failures such as unparseable config or missing module path.

Solutions

  1. Run terraform fmt and terraform validate to surface and fix HCL errors first.
  2. Run terraform init to ensure modules and the loader are prepared.
  3. Invoke plan from the configuration root or use -chdir.
  4. Read the inner %s error for the exact file/line that broke parsing.

Example fix

# before: plan fails on parse error
terraform plan
# after: fix first
terraform fmt
terraform validate
terraform plan
Defensive patterns

Strategy: validation

Validate before calling

// Run validate before plan to surface parse errors early.
if exit := runTerraform("validate"); exit != 0 {
    return fmt.Errorf("configuration invalid; fix errors reported by 'terraform validate'")
}

Prevention

When it happens

Trigger: terraform plan is invoked; c.initConfigLoader() returns err — HCL parse errors in .tf files, unreadable config directory, or module installer state that cannot be initialized.

Common situations: Plan after editing .tf files with syntax errors; running plan outside the config dir; partial terraform init leaving loader state inconsistent; config references files that no longer exist.

Related errors


AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11). Data as JSON: /api/errors/5ace502b255bb33e. Report an issue: GitHub.

Appendix: source

Thrown at internal/command/plan.go:190

	// EXPERIMENTAL: maybe enable deferred actions
	if c.AllowExperimentalFeatures {
		opReq.DeferralAllowed = args.DeferralAllowed
	} else if args.DeferralAllowed {
		// Belated flag parse error, since we don't know about experiments
		// support at actual parse time.
		diags = diags.Append(tfdiags.Sourceless(
			tfdiags.Error,
			"Failed to parse command-line flags",
			"The -allow-deferral flag is only valid in experimental builds of Terraform.",
		))
		return nil, diags
	}

	var err error
	opReq.ConfigLoader, err = c.initConfigLoader()
	if err != nil {
		diags = diags.Append(fmt.Errorf("Failed to initialize config loader: %s", err))
		return nil, diags
	}

	return opReq, diags
}

func (c *PlanCommand) Help() string {
	helpText := `
Usage: terraform [global options] plan [options]

  Generates a speculative execution plan, showing what actions Terraform
  would take to apply the current configuration. This command will not
  actually perform the planned actions.

  You can optionally save the plan to a file, which you can then pass to
  the "apply" command to perform exactly the actions described in the plan.

Plan Customization Options:

View on GitHub (pinned to d32a084675)