Direct provider implementation
This section covers implementing Pulumi providers directly using the generated gRPC bindings—Layer 2 in the provider architecture.
When to use direct implementation
Direct implementation gives you full control over provider behavior without SDK opinions. Choose this approach when your language lacks a higher-level SDK (such as Python or TypeScript), when you need precise control over Check/Diff/Update behavior, when you’re building something unusual that doesn’t fit standard patterns, or when you want to understand exactly how providers work at the protocol level.
What you’ll need
You’ll need gRPC bindings for your language (generated from provider.proto), a hand-written schema defining your resources and their properties, and implementations of the provider interface methods.
Trade-offs
| Aspect | Direct implementation | Higher-level SDK |
|---|---|---|
| Control | Full | Framework-guided |
| Boilerplate | More | Less |
| Schema | Hand-written JSON | Inferred from code |
| Learning curve | Protocol knowledge | SDK patterns |
Guides
- Protocol reference - Complete gRPC method documentation
- Python - Implement a provider in Python
- Go - Implement a provider in Go without the SDK
- TypeScript - Implement a provider in TypeScript
Related resources
- Provider architecture - Understanding the layers
- Schema reference - Complete schema documentation
- Pulumi Go Provider SDK - Higher-level Go SDK
Thank you for your feedback!
If you have a question about how to use Pulumi, reach out in Community Slack.
Open an issue on GitHub to report a problem or suggest an improvement.
