{"record":{"id":"253a48d16e6a55de","repo":"hashicorp/terraform","slug":"missing-provisioner-schema","errorCode":null,"errorMessage":"missing provisioner schema","messagePattern":"missing provisioner schema","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"internal/plugin/grpc_provisioner.go","lineNumber":72,"sourceCode":"func (p *GRPCProvisioner) GetSchema() (resp provisioners.GetSchemaResponse) {\n\tp.mu.Lock()\n\tdefer p.mu.Unlock()\n\n\tif p.schema != nil {\n\t\treturn provisioners.GetSchemaResponse{\n\t\t\tProvisioner: p.schema,\n\t\t}\n\t}\n\n\tprotoResp, err := p.client.GetSchema(p.ctx, new(proto.GetProvisionerSchema_Request))\n\tif err != nil {\n\t\tresp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))\n\t\treturn resp\n\t}\n\tresp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))\n\n\tif protoResp.Provisioner == nil {\n\t\tresp.Diagnostics = resp.Diagnostics.Append(errors.New(\"missing provisioner schema\"))\n\t\treturn resp\n\t}\n\n\tresp.Provisioner = convert.ProtoToConfigSchema(protoResp.Provisioner.Block)\n\n\tp.schema = resp.Provisioner\n\n\treturn resp\n}\n\nfunc (p *GRPCProvisioner) ValidateProvisionerConfig(r provisioners.ValidateProvisionerConfigRequest) (resp provisioners.ValidateProvisionerConfigResponse) {\n\tschema := p.GetSchema()\n\tif schema.Diagnostics.HasErrors() {\n\t\tresp.Diagnostics = resp.Diagnostics.Append(schema.Diagnostics)\n\t\treturn resp\n\t}\n\n\tmp, err := msgpack.Marshal(r.Config, schema.Provisioner.ImpliedType())","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/hashicorp/terraform/blob/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/plugin/grpc_provisioner.go#L54-L90","documentation":"Thrown by GRPCProvisioner.GetSchema (plugin v5 provisioner) when the provisioner's GetSchema RPC succeeded with no diagnostics but the `Provisioner` field is nil. Like providers, provisioners must declare a schema; a nil schema means the provisioner plugin is non-conformant. The schema is cached on first successful fetch.","triggerScenarios":"A provisioner plugin returning a GetProvisionerSchema response with Provisioner == nil. Typically a broken/old provisioner or protocol mismatch.","commonSituations":"Using a third-party provisioner built against an outdated SDK. A provisioner crash producing an empty schema. Most users hit this via custom/local-exec-style provisioners or archived provisioners.","solutions":["Replace the provisioner with a resource-based equivalent — provisioners are deprecated/discouraged.","Upgrade or pin a known-good version of the provisioner plugin.","Clear cache and re-init.","If maintained by you, ensure GetProvisionerSchema returns a non-nil Provisioner block."],"exampleFix":"# before: deprecated/broken provisioner\nprovisioner \"x\" { ... }\n\n# after: use a resource or a working provisioner version\nresource \"null_resource\" \"x\" { triggers = { ... } }","handlingStrategy":"fallback","validationCode":"# shell: check provisioner is resolvable\n$ terraform providers","typeGuard":null,"tryCatchPattern":"# bash: fall back to a managed resource if the provisioner schema fails\nif ! terraform plan 2>err.log; then\n  if grep -q 'missing provisioner schema' err.log; then\n    echo \"replace provisioner with a managed resource\"\n  fi\nfi","preventionTips":["Prefer managed resources over provisioners; provisioners are deprecated.","Pin provisioner plugin versions to known-good releases.","Avoid third-party provisioners with unmaintained schemas."],"tags":["terraform","provisioner","grpc","plugin-v5","schema"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}