hashicorp/terraform · error

Failed to convert provider version to Go version: %s

Error message

Failed to convert provider version to Go version: %s

What it means

Thrown when providerreqs.GoVersionFromVersion(v) fails to convert the just-downloaded destination state-store provider version into a hashicorp/go-version Version. GoVersionFromVersion simply calls version.NewVersion(v.String()); it fails only if the provider version string is not valid semver. The %s is the parse error. This is essentially an internal invariant failure since the version came from a successfully resolved provider lock.

Source

Thrown at internal/command/state_migrate.go:289

		if !diags.HasErrors() {
			migrateOpts.DestinationType = rootMod.StateStore.Type
			migrateOpts.Destination = dstB
		}

		// Capture details of the destination state store for updating the backend state file after a successful migration.
		_, cHash, sscDiags := c.stateStoreConfig(&BackendOpts{
			StateStoreConfig: rootMod.StateStore,
			Locks:            destinationLock,
		})
		diags = diags.Append(sscDiags)
		if sscDiags.HasErrors() {
			view.Diagnostics(diags)
			return 1
		}
		v := destinationLock.Provider(rootMod.StateStore.ProviderAddr).Version() // We just downloaded this provider, so the lock wil be present.
		version, err := providerreqs.GoVersionFromVersion(v)
		if err != nil {
			diags = diags.Append(fmt.Errorf("Failed to convert provider version to Go version: %s", err))
			view.Diagnostics(diags)
			return 1
		}

		bsf.StateStore = &workdir.StateStoreConfigState{
			Type: rootMod.StateStore.Type,
			Hash: uint64(cHash),
			Provider: &workdir.ProviderConfigState{
				Source:  &rootMod.StateStore.ProviderAddr,
				Version: version,
			},
			ProviderSupplyMode: rootMod.StateStore.ProviderSupplyMode,
		}
		err = bsf.StateStore.SetConfig(stateStoreConfigVal, dstB.ConfigSchema())
		if err != nil {
			diags = diags.Append(fmt.Errorf("Failed to set state store configuration: %w", err))
			view.Diagnostics(diags)
			return 1

View on GitHub (pinned to c9def3e214)

Solutions

  1. Delete the dependency lock file and re-run `terraform state migrate -upgrade` so the provider version is re-resolved cleanly.
  2. Inspect .terraform.lock.hcl for the state-store provider entry and fix or remove any non-semver version string.
  3. Verify the provider registry/mirror serves standard semver versions for that provider.
  4. Report a bug if the version is valid semver but still fails — this path should be unreachable for normally-resolved versions.

Example fix

# before: corrupted lock entry
provider "registry.example.com/foo/state" {
  version = "v1.2.3-beta"  # leading v may break strict parsers
}

# after: re-resolve from scratch
rm .terraform.lock.hcl
terraform state migrate -upgrade
Defensive patterns

Strategy: validation

Validate before calling

// before relying on a provider version, validate it is parseable semver.
func validProviderVersion(v string) error {
    _, err := semver.Parse(v)
    return err
}

Prevention

When it happens

Trigger: During `terraform state migrate` to a state_store destination, after downloading the destination provider, converting its version (from destinationLock.Provider(...).Version()) to a Go version fails because the version string is malformed. Practically only seen with corrupted lock-file version fields, a malicious/corrupt provider registry, or a hand-edited .terraform.lock.hcl.

Common situations: Manually edited .terraform.lock.hcl with a non-semver version; a private/provider mirror serving a non-conforming version; downgrade/upgrade path through a provider that published a non-semver tag.

Related errors


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