← All posts

Building Your First Terraform Provider with Pyvider

This tutorial walks through building a minimal Terraform provider in Python using Pyvider. By the end you’ll have a working provider that manages a simple resource.

Prerequisites

  • Python 3.11+
  • uv or pip
  • Terraform or OpenTofu installed

Setup

uv init my-provider
cd my-provider
uv add pyvider

Define Your Provider

Create my_provider/__init__.py:

from pyvider.providers import register_provider, BaseProvider

@register_provider("mycloud")
class MyCloudProvider(BaseProvider):
    """A minimal cloud provider."""
    pass

Define a Resource

Create my_provider/server.py:

from pyvider.resources import register_resource, BaseResource
from pyvider.schema import s_resource, a_str
import attrs

@attrs.define
class ServerState:
    name: str = ""
    id: str = ""

@register_resource("server")
class Server(BaseResource):

    @classmethod
    def get_schema(cls):
        return s_resource({
            "name": a_str(required=True),
            "id":   a_str(computed=True),
        })

    async def _create_apply(self, ctx):
        state = ServerState(name=ctx.config.name, id="srv-123")
        return state, None

    async def read(self, ctx):
        return ctx.state

Run It

pyvider install  # installs the provider for Terraform
terraform init
terraform apply

For more detail, see the full documentation.