Skip to content

Terraform / OpenTofu Provider

The sidequest-labs/ancla provider lets you manage Ancla workspaces, projects, environments, services, and config variables as Terraform or OpenTofu resources.

Add the provider to your Terraform configuration:

terraform {
required_providers {
ancla = {
source = "registry.terraform.io/sidequest-labs/ancla"
}
}
}

Run terraform init to download the provider.

provider "ancla" {
api_key = var.ancla_api_key
}
AttributeEnvironment VariableDefaultDescription
api_keyANCLA_API_KEYAPI key for authentication
serverANCLA_SERVERhttps://ancla.devAncla server URL

Both attributes can be set via environment variables instead. ANCLA_API_KEY is the recommended approach for CI.

resource "ancla_workspace" "main" {
name = "My Workspace"
}
AttributeTypeRequiredDescription
namestringyesWorkspace display name

Read-only: id, slug

Supports terraform import ancla_workspace.main <slug>.

resource "ancla_project" "web" {
name = "Web Platform"
workspace_slug = ancla_workspace.main.slug
}
AttributeTypeRequiredDescription
namestringyesProject name
workspace_slugstringyesSlug of the parent workspace

Read-only: id, slug

Supports terraform import ancla_project.web <workspace-slug>/<project-slug>.

resource "ancla_environment" "production" {
name = "production"
workspace_slug = ancla_workspace.main.slug
project_slug = ancla_project.web.slug
}
resource "ancla_environment" "staging" {
name = "staging"
workspace_slug = ancla_workspace.main.slug
project_slug = ancla_project.web.slug
}
AttributeTypeRequiredDescription
namestringyesEnvironment name (e.g. production, staging)
workspace_slugstringyesParent workspace slug
project_slugstringyesParent project slug

Read-only: id, slug

Supports terraform import ancla_environment.production <workspace-slug>/<project-slug>/<env-slug>.

resource "ancla_service" "api" {
name = "API Service"
workspace_slug = ancla_workspace.main.slug
project_slug = ancla_project.web.slug
env_slug = ancla_environment.production.slug
platform = "docker"
github_repository = "sidequest-labs/api-service"
auto_deploy_branch = "main"
process_counts = {
web = 2
worker = 1
}
}
AttributeTypeRequiredDescription
namestringyesService name
workspace_slugstringyesParent workspace slug
project_slugstringyesParent project slug
env_slugstringyesParent environment slug
platformstringyesPlatform type (e.g. docker)
github_repositorystringnoGitHub repo (owner/name)
auto_deploy_branchstringnoBranch that triggers auto-deploy
process_countsmap(number)noProcess scaling counts

Read-only: id, slug

Supports terraform import ancla_service.api <workspace-slug>/<project-slug>/<env-slug>/<service-slug>.

resource "ancla_config_var" "database_url" {
service_id = ancla_service.api.id
name = "DATABASE_URL"
value = "postgres://localhost:5432/mydb"
}
resource "ancla_config_var" "secret_key" {
service_id = ancla_service.api.id
name = "SECRET_KEY"
value = "super-secret-value"
secret = true
buildtime = false
}
AttributeTypeRequiredDescription
service_idstringyesID of the parent service
namestringyesVariable name
valuestringyesVariable value
secretboolnoMark as secret (hidden in UI/API)
buildtimeboolnoAvailable at build time
scopestringnoScope level: workspace, project, env, or service (default)

Read-only: id

Supports terraform import ancla_config_var.database_url <config-id>.

Look up an existing workspace by slug:

data "ancla_workspace" "existing" {
slug = "my-ws"
}

Returns name, slug, member_count, project_count.

data "ancla_project" "existing" {
workspace_slug = "my-ws"
slug = "my-project"
}

Returns name, slug, workspace_slug, environment_count.

data "ancla_environment" "existing" {
workspace_slug = "my-ws"
project_slug = "my-project"
slug = "production"
}

Returns name, slug, workspace_slug, project_slug, service_count.

data "ancla_service" "existing" {
workspace_slug = "my-ws"
project_slug = "my-project"
env_slug = "production"
slug = "my-service"
}

Returns id, name, slug, platform, github_repository, auto_deploy_branch, process_counts.

terraform {
required_providers {
ancla = {
source = "registry.terraform.io/sidequest-labs/ancla"
}
}
}
provider "ancla" {}
resource "ancla_workspace" "acme" {
name = "Acme Corp"
}
resource "ancla_project" "backend" {
name = "Backend Services"
workspace_slug = ancla_workspace.acme.slug
}
resource "ancla_environment" "production" {
name = "production"
workspace_slug = ancla_workspace.acme.slug
project_slug = ancla_project.backend.slug
}
resource "ancla_environment" "staging" {
name = "staging"
workspace_slug = ancla_workspace.acme.slug
project_slug = ancla_project.backend.slug
}
resource "ancla_service" "api" {
name = "REST API"
workspace_slug = ancla_workspace.acme.slug
project_slug = ancla_project.backend.slug
env_slug = ancla_environment.production.slug
platform = "docker"
github_repository = "acme/rest-api"
auto_deploy_branch = "main"
process_counts = {
web = 2
}
}
resource "ancla_config_var" "db" {
service_id = ancla_service.api.id
name = "DATABASE_URL"
value = "postgres://db.internal:5432/api"
secret = true
}
output "api_service_id" {
value = ancla_service.api.id
}