{"record":{"id":"165a5650ab2d77da","repo":"hashicorp/terraform","slug":"no-schema-found-for-s-in-provider-s-165a56","errorCode":null,"errorMessage":"no schema found for %s (in provider %s)","messagePattern":"no schema found for (.+?) \\(in provider (.+?)\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/command/jsonplan/plan.go","lineNumber":462,"sourceCode":"\n\treturn ret, nil\n}\n\nfunc marshalResourceChange(rc *plans.ResourceInstanceChangeSrc, schemas *terraform.Schemas) (ResourceChange, error) {\n\tvar r ResourceChange\n\taddr := rc.Addr\n\tr.Address = addr.String()\n\tif !addr.Equal(rc.PrevRunAddr) {\n\t\tr.PreviousAddress = rc.PrevRunAddr.String()\n\t}\n\n\tschema := schemas.ResourceTypeConfig(\n\t\trc.ProviderAddr.Provider,\n\t\taddr.Resource.Resource.Mode,\n\t\taddr.Resource.Resource.Type,\n\t)\n\tif schema.Body == nil {\n\t\treturn r, fmt.Errorf(\"no schema found for %s (in provider %s)\", r.Address, rc.ProviderAddr.Provider)\n\t}\n\n\tchangeV, err := rc.Decode(schema)\n\tif err != nil {\n\t\treturn r, err\n\t}\n\t// We drop the marks from the change, as decoding is only an\n\t// intermediate step to re-encode the values as json\n\tchangeV.Before, _ = changeV.Before.UnmarkDeep()\n\tchangeV.After, _ = changeV.After.UnmarkDeep()\n\n\tvar before, after []byte\n\tvar beforeSensitive, afterSensitive []byte\n\tvar afterUnknown cty.Value\n\n\tif changeV.Before != cty.NilVal {\n\t\tbefore, err = ctyjson.Marshal(changeV.Before, changeV.Before.Type())\n\t\tif err != nil {","sourceCodeStart":444,"sourceCodeEnd":480,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/command/jsonplan/plan.go#L444-L480","documentation":"In marshalResourceChange, schemas.ResourceTypeConfig(...).Body == nil means Terraform has no config schema for the resource type from the named provider. Without the schema it cannot decode the change or render before/after values, so it aborts. This is the most common schema-availability error in plan rendering.","triggerScenarios":"Reached during any resource-change marshaling (resource_changes 608, deferred 609, drift 606) when the provider for a planned/drifted resource did not supply a schema for that resource type. The schemas map is built from installed providers, so a missing or mismatched provider yields a nil Body.","commonSituations":"Provider plugin not installed (terraform init not run or failed); provider version downgrade where the resource type was removed or renamed; aliased/mis-sourced provider so the type lookup does not match; state referencing a resource whose provider was removed from config.","solutions":["Run `terraform init` to install the provider that defines the resource type.","Pin or upgrade to a provider version that still defines the resource (check the provider's docs/changelog).","If the resource was removed from config intentionally, remove it from state with `terraform state rm`.","Verify provider source addresses in .terraform.lock.hcl match required_providers."],"exampleFix":"# before: provider missing the type\nterraform show -json p.tfplan  # no schema found for aws_example (in provider registry.../aws)\n\n# after: install/upgrade the provider\nterraform init -upgrade\nterraform plan -out=p.tfplan && terraform show -json p.tfplan","handlingStrategy":"validation","validationCode":"// Verify every resource change has a schema before marshaling, so a\n// missing provider is reported as an init problem, not a render crash.\nfor _, rc := range plan.Changes.Resources {\n    sch := schemas.ResourceTypeConfig(\n        rc.ProviderAddr.Provider,\n        rc.Addr.Resource.Resource.Mode,\n        rc.Addr.Resource.Resource.Type,\n    )\n    if sch.Body == nil {\n        return fmt.Errorf(\"no schema for %s (provider %s); run terraform init\",\n            rc.Addr, rc.ProviderAddr.Provider)\n    }\n}","typeGuard":null,"tryCatchPattern":"out, err := jsonplan.Marshal(config, plan, sf, schemas)\nif err != nil && strings.Contains(err.Error(), \"no schema found\") {\n    // instruct user to terraform init / align provider versions\n}\nreturn err","preventionTips":["Run `terraform init` before any plan render so all providers are installed.","Pin provider versions in required_providers and keep .terraform.lock.hcl committed.","After upgrading a provider, regenerate plans; after downgrading, expect schema gaps.","Remove resources from state (`terraform state rm`) only when their provider is truly gone."],"tags":["schema","provider","resource-changes"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}