This is the on-ramp for the silent majority of Terraform shops: one repo, state in S3 (with a DynamoDB lock or S3 native locking), and a GitHub Actions workflow that runs plan-on-PR and apply-on-merge. No TFC, no Atmos, no Atlantis, no Spacelift — just the basics.
If that's your stack, nothing about it changes. Terrantula sits on top of it. This guide shows you how.
You run terraform apply from GitHub Actions. State lives in S3. Adding a tenant means hand-editing a config file and waiting for the PR to merge. You have no fleet-wide view — nobody can answer "what do we actually have, and how does it connect?"
Terrantula is the fleet layer above your Terraform. It doesn't run Terraform and it doesn't replace it — it orchestrates the population your Terraform produces:
terraform apply
When you trigger an Action, Terrantula opens a pull request against your existing repo — committing or patching the IaC files that describe the change. Your GitHub Actions workflow applies the merged PR, exactly as it does today. Terrantula never executes terraform applyand never hosts your runners or your state.
Start with pure visibility. The CLI runs in local mode out of the box — everything stored in a local SQLite database, nothing leaves your machine. Point it at your state and open a dashboard:
The --state flag also reads directly from S3, so you don't have to pull state down first:
Repeat --state to merge several state files into one fleet view:
The --config file is a YAML mapping that says which Terraform resources become which Terrantula entity types and relationships. Want to see what would be imported before writing anything? Add --plan (an alias for --dry-run, for terraform-plan muscle memory):
That's the whole first-five-minutes loop. For the step-by-step walkthrough, including the starter configs that map common AWS/Kubernetes resources to entity types, follow the Quick Start.
Re-running the import re-syncs the graph from your latest state. When a tenant has been torn down in Terraform and you want Terrantula to forget it too, add --replace to delete Terraform-managed entities that are no longer present in the supplied state:
You can wire this into your existing GitHub Actions workflow as a post-apply step — drive it from environment variables so there's no saved login in CI:
Visibility is enough to start. When you grow into a real cattle problem — placement, capacity, templated onboarding — you turn on Actions. For bare-TF + GitHub Actions, the Action uses the pull-request trigger:
OnboardTenant). Terrantula validates parameters, enforces constraints, and picks the right cell.tenants/acme.tfvars.json), or patching an existing aggregate file with a JSON-array-append.terraform apply against the merged change.terrantula-tf-dispatch.yml) signals back to Terrantula when the apply finishes, so the entity's lifecycle advances to active.Setup is a drop-in: add the reference workflow, add a callback-token secret, apply your Terrantula catalog. No new infrastructure to operate. See the canonical demos for the exact shape — bare-tf-gh-actions-onefile-per-tenant (one file per tenant) and the module-per-tenant variant.
terraform apply. Terrantula never touches it.Terrantula adds the placement decision, constraint enforcement, lifecycle tracking, and the fleet view — nothing else moves.
pull-request trigger and the others, in detail.