Terraform-Provider

SteadyCron-Ressourcen mit Terraform verwalten — HTTP-Jobs, Heartbeat-Monitore, Alert-Kanäle und Alert-Regeln in HCL zusammen mit der restlichen Infrastruktur deklarieren.

Der SteadyCron-Terraform-Provider ermöglicht es, Cron-Jobs als Teil des Infrastruktur-Stacks zu verwalten — ohne separate YAML-Manifeste, wenn Sie bereits Terraform einsetzen.

Installation

Fügen Sie den Provider dem required_providers-Block hinzu und führen Sie terraform init aus:

terraform {
  required_providers {
    steadycron = {
      source  = "steadycron/steadycron"
      version = "1.0.4"
    }
  }
}

Authentifizierung

Erstellen Sie einen API-Schlüssel im SteadyCron-Dashboard unter Einstellungen → API-Schlüssel. Für Schreiboperationen (apply) ist ein Full-Scope-Schlüssel erforderlich; Datenquellen funktionieren auch mit einem Nur-Lesen-Schlüssel.

Übergeben Sie den Schlüssel über eine Umgebungsvariable (empfohlen für CI):

export STEADYCRON_API_KEY=sc_...

Oder konfigurieren Sie ihn im Provider-Block:

provider "steadycron" {
  api_key = var.steadycron_api_key   # nicht hardcoden
  # endpoint ist standardmäßig https://api.steadycron.com
  # kann auch über STEADYCRON_ENDPOINT gesetzt werden
}

Ressourcen

RessourceBeschreibung
steadycron_http_jobGeplanter HTTPS-Aufruf
steadycron_heartbeat_monitorErwartungs-Ping-Monitor mit eindeutiger Ping-URL
steadycron_alert_channelE-Mail-, Slack-, Discord-, Webhook- oder Telegram-Kanal
steadycron_alert_ruleVerknüpft einen Job mit einem Kanal und einer Auslösebedingung
steadycron_tagkey=value-Label zur Gruppierung und Filterung von Jobs
steadycron_template_variableBenannter Platzhalter für serverseitige Substitution in Job-Feldern

Datenquellen (data.steadycron_http_job, data.steadycron_heartbeat_monitor, data.steadycron_tag, data.steadycron_alert_channel) ermöglichen das Referenzieren bestehender Ressourcen.

Beispiel

provider "steadycron" {
  # api_key aus der Umgebungsvariable STEADYCRON_API_KEY
}

resource "steadycron_tag" "env_prod" {
  key   = "env"
  value = "prod"
  color = "green"
}

resource "steadycron_alert_channel" "ops_email" {
  name     = "ops-email"
  kind     = "email"
  email_to = "ops@example.com"
}

resource "steadycron_http_job" "weekly_digest" {
  name   = "weekly-digest"
  method = "POST"
  url    = "https://api.example.com/jobs/digest"

  cron_expression = "0 9 * * 1"   # Montag 09:00
  timezone        = "Europe/Berlin"
  timeout_seconds = 120
  max_retries     = 2

  headers = {
    Authorization = "Bearer {{digest_token}}"
  }

  tags = [steadycron_tag.env_prod.id]
}

resource "steadycron_alert_rule" "digest_failure" {
  job_id     = steadycron_http_job.weekly_digest.id
  channel_id = steadycron_alert_channel.ops_email.id
  trigger    = "on_failure"
  severity   = "P1"
}

Bestehende Ressourcen importieren

Bringen Sie bestehende Dashboard- oder CLI-erstellte Ressourcen unter Terraform-Verwaltung:

terraform import steadycron_http_job.example <job_id>
terraform import steadycron_heartbeat_monitor.db_backup <job_id>
terraform import steadycron_alert_channel.ops_email <channel_id>
terraform import steadycron_alert_rule.digest_failure <rule_id>
terraform import steadycron_tag.env_prod <tag_id>
terraform import steadycron_template_variable.digest_token <variable_id>

Führen Sie nach dem Import terraform plan aus. Felder, die die API beim Lesen verdeckt (Alert-Kanal-Secrets, Heartbeat-Tokens), erscheinen als Diffs — fügen Sie deren echte Werte Ihrer Konfiguration hinzu.

Interoperabilität mit der CLI

Ressourcen, die über Terraform erstellt wurden, haben einen null manifest_namespace und werden daher niemals durch steadycron sync --prune gelöscht. Verwalten Sie eine Ressource entweder mit Terraform oder dem CLI-Manifest, nicht mit beiden — das gleichzeitige Nutzen beider Tools für dieselbe Ressource wird nicht unterstützt.

Rate Limits

Die SteadyCron-API erlaubt 120 Anfragen pro Minute und Schlüssel. Der Provider wiederholt 429 Too Many Requests-Antworten automatisch mit exponentiellem Backoff (bis zu 5 Versuche, unter Beachtung von Retry-After). Bei regelmäßigen Limitüberschreitungen reduzieren Sie die Provider-Parallelität:

terraform apply -parallelism=5