cloadyDoku
Doku5 Min. Lesezeit

Terraform-Provider

Workspaces, Anwendungen, Variablen und Domains als Infrastructure as Code deklarieren.

Cloady hat einen Terraform-Provider in der öffentlichen Registry. Damit lassen sich Workspaces, Anwendungen, Umgebungsvariablen und eigene Domains als Code deklarieren und wie der Rest deiner Infrastruktur reviewen, versionieren und ausrollen.

Terraform
terraform {
  required_providers {
    cloady = {
      source  = "cloady/cloady"
      version = "~> 0.1"
    }
  }
}

provider "cloady" {} # reads CLOADY_TOKEN

resource "cloady_app" "api" {
  workspace = "acme"
  name      = "API"
  region    = "eu1"
  git       = { repository_url = "https://github.com/acme/api" }
}

output "url" {
  value = cloady_app.api.endpoints[0].url
}

terraform init installiert ihn aus der Registry. Sonst musst du nichts einrichten.

Authentifizieren

Erstelle unter Account → API tokens ein Token und exportiere es:

Terminal
export CLOADY_TOKEN=cldy_xxxxxxxxxxxxxxxx

Der Provider liest standardmäßig CLOADY_TOKEN; mit token im Provider-Block überschreibst du das, und mit base_url (oder CLOADY_CONTROL_PLANE_URL) zeigst du auf eine andere Cloady-Installation als https://cloady.com.

Um Workspaces anzulegen und die Abrechnung zu ändern, brauchst du ein Token mit Scope full. Alles andere geht mit deploy, Lesezugriffe mit read. Deine Workspace-Rolle gilt zusätzlich: Ein full-Token kann in einem Workspace, in dem du Viewer bist, nichts löschen.

Ressourcen

RessourceVerwaltet
cloady_appEine Anwendung aus einem Git-Repository oder dem Katalog
cloady_workspaceEinen Workspace
cloady_variableEine Umgebungsvariable einer Anwendung
cloady_domainEine eigene Domain einer Anwendung

Zwei Data Sources lesen bestehenden State, ohne ihn zu verwalten: cloady_workspace und cloady_regions für die Regionen, in die du deployen kannst. Jede Region nimmt Apps aus jedem Workspace an, ob kostenlos oder bezahlt.

Die vollständige Attributreferenz findest du in der Terraform Registry.

Ein kompletter Stack

Terraform
data "cloady_regions" "all" {}

resource "cloady_workspace" "acme" {
  slug = "acme"
  name = "Acme"
}

resource "cloady_app" "db" {
  workspace = cloady_workspace.acme.slug
  name      = "Postgres"
  region    = "eu1"
  catalog   = "postgres"

  volume_sizes = { data = 20 }

  lifecycle {
    prevent_destroy = true
  }
}

resource "cloady_app" "api" {
  workspace    = cloady_workspace.acme.slug
  name         = "API"
  region       = "eu1"
  cpu_scale    = 2
  memory_scale = 2

  git = {
    repository_url = "https://github.com/acme/api"
    branch         = "main"
    auto_deploy    = true
  }
}

resource "cloady_variable" "database_url" {
  workspace = cloady_workspace.acme.slug
  app       = cloady_app.api.slug
  region    = cloady_app.api.region
  key       = "DATABASE_URL"
  value     = var.database_url
  is_secret = true
}

resource "cloady_domain" "api" {
  workspace  = cloady_workspace.acme.slug
  app        = cloady_app.api.slug
  region     = cloady_app.api.region
  host       = "api.acme.com"
  is_primary = true
}

Jede Anwendung läuft in einer Region und einer Umgebung, und ihr Name muss innerhalb dieses Workspaces und dieser Umgebung eindeutig sein. environment ist überall, wo es angegeben werden kann, standardmäßig production; für die anderen Umgebungen setzt du preview oder development. Variablenschlüssel sind SCREAMING_SNAKE_CASE.

Lies das vor deinem ersten Apply

Terraform folgt dem Prinzip „die Realität an die Konfiguration anpassen“ und wird eine Ressource löschen und neu anlegen, sobald sich ein Attribut ändert, das es nicht direkt ändern kann. Bei einer Anwendung mit Daten bedeutet das Neuanlegen Datenverlust.

Attributänderungen an cloady_app haben zwei mögliche Folgen: Name, Branch, Skalierung und Volume-Größen werden direkt geändert, während Region, Umgebung, Workspace, ein explizit gesetzter Slug und die URL des Git-Repositorys die Anwendung zerstören und neu anlegen, wobei ihre Daten gelöscht werden, sofern prevent_destroy den Plan nicht blockiertcloady_app – was der nächste Apply mit einem geänderten Attribut machtDirekt änderbarname branchcpu_scale memory_scalevolume_sizes (nur vergrößern)slug folgt dem Namen, außer du setzt ihnErzwingt Zerstören + Neuanlegenregion environment workspaceslug (sobald explizit gesetzt)git.repository_urlbeim Anlegen der Anwendung festgelegtprevent_destroy = truePlan scheitert hiersonstDirekt aktualisiertdieselbe Anwendung, dieselben DatenZerstört, dann neu angelegtdie Daten der Anwendung werden mitgelöscht

Wenn du eine Anwendung zerstörst, werden ihre Daten endgültig gelöscht. Ihre Volumes verschwinden mit ihr, und das lässt sich nicht rückgängig machen. Setze prevent_destroy auf alles, was Daten speichert, so wie bei der Postgres-App oben, und auf den Workspace – wer einen Workspace zerstört, zerstört jede Anwendung darin.

Umbenennen passiert direkt an der Anwendung – zerstöre nie eine Anwendung, um sie umzubenennen. name, branch, cpu_scale, memory_scale, volume_sizes und auto_deploy werden alle direkt an der bestehenden App geändert. Das Einzige, was eine Umbenennung kostet, ist die Adresse: Eine App antwortet unter <name>-<code>-<workspace>.cloady.io, zum Beispiel my-blog-k7q2v9ze-acme.cloady.io, und diese Adresse folgt dem Namen, sodass die alte nicht mehr funktioniert. Eigene Domains zeigen weiterhin auf die App.

  • Manche Attribute erzwingen ein Ersetzen. Eine Anwendung wird in einer Region, in einer Umgebung, in einem Workspace und aus einer Quelle angelegt und bleibt dort. Eine Änderung von region, environment, workspace oder der URL des Git-Repositorys bedeutet Zerstören und anschließendes Neuanlegen: leere Daten, eine neue Adresse, Ausfallzeit.
  • Volumes wachsen nur. Wenn du einen Wert in volume_sizes verringerst, wird das schon beim Plan abgelehnt. Für kleinere Volumes legst du ein Backup an und erstellst eine neue Anwendung.
  • Geänderte Variablen erreichen die App beim nächsten Deploy. Ein Apply, der nur cloady_variable betrifft, startet nichts neu; führe danach cloady redeploy acme api aus, wenn die App den Wert sofort braucht.
  • Variablenwerte landen im Klartext im Terraform-State, auch Secrets. is_secret verbirgt den Wert in Cloady, verschlüsselt aber nicht deine State-Datei. Nutze ein Remote-Backend mit Verschlüsselung im Ruhezustand und verwende lieber var.-Eingaben als Literale.
  • Bei cloady_domain ändert sich nur redirect_to direkt. Eine Änderung von host oder is_primary ersetzt den Eintrag; die App läuft weiter, aber die DNS-Einträge des neuen Hosts müssen auf Cloady zeigen, bevor HTTPS dort funktioniert.
  • Ein erfolgreicher Apply heißt nicht, dass die Anwendung gesund ist. Das Anlegen gilt als abgeschlossen, sobald der Deploy startet; status meldet also, was Cloady in diesem Moment gesehen hat, nicht die Betriebsbereitschaft. Verfolge den Deploy im Dashboard oder mit der CLI.

Die Skalierung ist ein Multiplikator für das, was die Anwendung anfordert, keine absolute Größe: cpu_scale = 2 verdoppelt es. Die Werte reichen von 0,5 bis 4 in Schritten von 0,25, und alles, was im Workspace läuft – in jeder Region, in jeder Umgebung –, zählt zu dem, was der Workspace bezahlt.

Solange der angewendete Stack in das Gratis-Kontingent des Workspaces passt, wird nichts berechnet. Darüber hinaus wird die hinterlegte Karte mit der Differenz belastet, während der Apply läuft; ohne Karte oder bei einer abgelehnten Karte antwortet Cloady mit payment_required, und Terraform bricht ab. Der Inhaber des Workspaces hinterlegt unter Account → Billing eine Karte; danach führst du den Apply erneut aus.

Bestehende Anwendungen importieren

Alles, was im Dashboard angelegt wurde, kannst du übernehmen, ohne es neu anzulegen. Die Import-ID ist die Adresse der Ressource, getrennt durch Schrägstriche:

Terminal
terraform import cloady_workspace.acme acme
terraform import cloady_app.api        acme/api/production/eu1
terraform import cloady_variable.db    acme/api/production/eu1/<variable-id>
terraform import cloady_domain.api     acme/api/production/eu1/<domain-id>

Die IDs von Variablen und Domains bekommst du über listVars und listAppDomains in der API oder über die CLI.

Verhältnis zu den anderen Schnittstellen

Der Provider ruft dieselbe REST-API auf wie das Dashboard, die CLI, die SDKs und der MCP-Server, mit denselben Prüfungen von Scope und Rolle. Er unterscheidet sich im Zweck: CLI und MCP-Server führen Aktionen aus, während Terraform auf einen deklarierten Endzustand hinarbeitet und Drift beim nächsten Apply rückgängig macht.

Der Apply-Kreislauf: terraform plan liest den Live-Zustand neu über die Cloady-REST-API ein, vergleicht ihn mit main.tf, und apply schreibt den deklarierten Zustand zurück – eine Änderung an einer verwalteten Ressource über Dashboard oder CLI wird also beim nächsten Apply überschriebenrefresh: Live-Zustand lesenmain.tfdeklarierter Zustandterraform plandeklariert vs. liveapplyCloady-REST-APILive-Zustandam Code vorbeiDashboard-/CLI-Änderungan verwalteter RessourceSo eine Änderung ist Drift: plan erkennt sie, apply überschreibt sie mit main.tf.

Deshalb eignet er sich schlecht für einmalige Vorgänge. Einen Service neu starten, einen Befehl in einem Container ausführen, einen Deploy zurückrollen oder Logs lesen sind Aktionen ohne Zielzustand, auf den man hinarbeiten könnte, und sie bleiben Sache der CLI und der API.

Auf dieser Seite