Alle Leistungen

Infrastructure as Code

Gewachsen in der Konsole. Jetzt als Code.

In fast jeder gewachsenen AWS-Umgebung gibt es zwei Wahrheiten: die in der Konsole und die im Repository. Solange sie auseinanderlaufen, ist jede Änderung ein kleines Risiko und keine Umgebung reproduzierbar. Ich bringe beide zusammen, und zwar in der Richtung, die nichts kaputt macht: Der Bestand wird importiert, nicht nachgebaut.

Bestand importiertState mit SperreDrift beseitigtUmgebung reproduzierbar
Was Sie bekommen
  • Eine Bestandsaufnahme: was existiert, was davon jemand angelegt hat und wer es braucht
  • Der Bestand importiert statt nachgebaut, in Schritten und ohne Ausfall
  • State an einer Stelle, mit Sperre und Versionierung, getrennt je Umgebung
  • Module erst dort, wo sich etwas wirklich wiederholt, nicht auf Vorrat
  • Ein Plan, der in der Pipeline läuft und dessen Ausgabe man lesen kann
  • Übergabe: Ihr Team legt danach Infrastruktur an, ohne mich zu fragen
Umfang & Zusammenarbeit

Bestandsaufnahme und erster Import als abgegrenztes Zwei- bis Vier-Wochen-Mandat, weiter nach Umfang. Der Betrieb bleibt bei Ihrem Team, dafür ist die Übergabe Teil der Arbeit.

Remote aus Deutschland. Direkt mit mir, ohne Agentur dazwischen.

Die Ausgangslage

Der teuerste Weg zu Terraform ist der, der schneller aussieht.

Wenn eine Umgebung in der Konsole entstanden ist, gibt es zwei Wege zu Infrastructure as Code. Der erste: alles neu bauen, umschwenken, das Alte abräumen. Der sieht schneller aus, ist aber ein Rewrite – mit allen bekannten Folgen: Er dauert länger als geschätzt, er kann nicht in Schritten geliefert werden, und am Umschaltpunkt hängt alles gleichzeitig. Der zweite Weg ist der Import: Das Bestehende wird beschrieben und unter Verwaltung gebracht, ohne es anzufassen. Seit Terraform 1.5 geht das über import-Blöcke in der Konfiguration, und terraform plan -generate-config-out schreibt daraus einen ersten Entwurf, den man aufräumt statt ihn zu tippen.

Der zweite Befund ist fast immer der State. Er liegt auf einem Laptop, oder in einem Bucket ohne Versionierung, oder es gibt drei davon und niemand weiß, welcher gilt. Dazu fehlt die Sperre, und dann überschreiben zwei gleichzeitige Läufe einander. Das ist heute einfacher zu lösen als früher: Der S3-Backend sperrt seit Terraform 1.11 selbst über eine .tflock-Datei neben dem State, eingeschaltet mit use_lockfile = true; eine eigene DynamoDB-Tabelle braucht es nicht mehr, ihre Argumente sind abgekündigt. Versionierung im Bucket, getrennte Zustände je Umgebung, Verschlüsselung – das ist eine halbe Stunde Arbeit und der Unterschied zwischen einem Werkzeug und einem Risiko.

Der dritte Befund heißt Drift und ist ein Prozessproblem, kein technisches. Solange jemand in der Konsole „nur schnell" etwas ändert, läuft die Beschreibung weg, und beim nächsten apply will Terraform es zurückdrehen. Dagegen hilft kein Werkzeug, sondern eine Entscheidung: Was als Code beschrieben ist, wird nur noch als Code geändert, und wer Schreibrechte in der Konsole behält, weiß warum. Dazu ein regelmäßiger Plan, der Abweichungen meldet, bevor sie jemand im Vorfall entdeckt.

Kommt Ihnen etwas davon bekannt vor?
  • Niemand kann sagen, welche Ressourcen in einem Konto wirklich gebraucht werden.
  • Eine zweite Umgebung aufzusetzen dauert Tage und wird nie ganz gleich.
  • Der Terraform-State liegt auf einem Rechner oder in einem Bucket ohne Sperre.
  • Ein Teil ist als Code beschrieben, der Rest per Hand, und die Grenze kennt niemand.
  • terraform plan zeigt Änderungen, die keiner beauftragt hat.
  • Es gibt Module für alles, aber niemand versteht mehr, was ein Aufruf bewirkt.

Was ich mache

Was dabei passiert

01

Bestand aufnehmen, bevor etwas beschrieben wird

InventarAbhängigkeitenAufräumen

Zuerst die Frage, welche Ressourcen es überhaupt gibt und welche davon jemand noch braucht. Aus einer gewachsenen Umgebung fällt dabei regelmäßig ein Viertel heraus: Testinstanzen, verwaiste Volumes, Sicherheitsgruppen ohne Ziel. Was weg kann, wird nicht importiert – Aufräumen ist billiger als Beschreiben.

02

Importieren statt nachbauen

import-Blöckegenerate-config-outPlan muss leer sein

Der Bestand kommt über import-Blöcke unter Verwaltung, bereichsweise und in einer Reihenfolge, die Abhängigkeiten respektiert: erst Netz und Identität, dann Daten, dann Anwendung. Nach jedem Schritt muss terraform plan leer sein – das ist die Abnahmebedingung und gleichzeitig der Beweis, dass die Beschreibung stimmt.

03

State, dem man trauen kann

S3-Backenduse_lockfileTrennung je Umgebung

Ein Ort für den State: S3 mit Versionierung, Verschlüsselung und Sperre über use_lockfile, getrennt je Umgebung und je Bereich. Getrennt heißt auch: klein genug, dass ein Lauf Minuten dauert und nicht eine halbe Stunde, denn ein langsamer Plan wird nicht gelesen.

04

Module, wenn es sie braucht

Modulemoved-BlöckeSchnittstellen

Module entstehen aus Wiederholung, nicht aus Vorfreude. Zwei gleiche Dinge sind Zufall, drei sind ein Muster. Was ein Modul kapselt, wird an seiner Schnittstelle entschieden, und Umbenennungen laufen über moved-Blöcke, damit ein Refactoring im Plan nicht wie Löschen und Neuanlegen aussieht.

05

Plan in die Pipeline, Drift auf den Tisch

CI/CDDrift-ErkennungOIDC

Der Plan läuft in der Auslieferungsstrecke: bei jedem Pull Request als Vorschau, nach dem Merge als Anwendung, mit Freigabe für die Produktionsstufe. Dazu ein regelmäßiger Lauf, der Abweichungen meldet. Rechte holt sich die Pipeline über OIDC statt über hinterlegte Schlüssel – dazu gibt es eine eigene Seite.

06

Übergabe, damit es Ihnen gehört

DokumentationRunbookÜbergabe

Zum Abschluss die Dinge, die das Ergebnis haltbar machen: eine kurze Anleitung, wie man eine Ressource hinzufügt, die Regel für Konsolenzugriff, ein Runbook für den Fall eines beschädigten State, und eine Übergabesitzung. Danach legt Ihr Team Infrastruktur an, ohne zu fragen.

Wie lange dauert bei Ihnen eine zweite Umgebung?

Schreiben Sie mir, was heute als Code beschrieben ist und was nicht. Sie bekommen eine Einschätzung, bevor Sie etwas beauftragen.

Ablauf

Wie das abläuft

Vier Schritte, und nach dem zweiten ist ein erster Bereich unter Verwaltung. Kein Schritt setzt voraus, dass Sie den nächsten beauftragen.

SCHRITT 01

Bestandsaufnahme

Was existiert, was davon wird gebraucht, was ist schon beschrieben. Ergebnis ist eine Karte mit Reihenfolge und Aufwand, und die Liste dessen, was vor dem Import wegkann. Lesezugriff genügt.

SCHRITT 02

Erster Bereich importiert

Ein abgegrenzter Bereich kommt unter Verwaltung, mit saubererem State und leerem Plan als Abnahme. Damit sehen Sie an einem echten Beispiel, was das Vorgehen kostet und was es bringt.

SCHRITT 03

Weiter in Schnitten

Bereich für Bereich, nach Abhängigkeiten geordnet. Jeder Schnitt ist einzeln nützlich, und zwischen zwei Schnitten ist die Umgebung immer in einem gültigen Zustand.

SCHRITT 04

Pipeline und Übergabe

Plan und Anwendung laufen in der Auslieferungsstrecke, Drift wird gemeldet, das Team bekommt die Anleitung und eine Sitzung dazu.

Das Ergebnis

Was danach anders ist

Eine zweite Umgebung ist eine Stunde

Wenn eine Umgebung aus Code entsteht, ist die nächste eine Variable und kein Projekt. Das zahlt sich beim ersten Testsystem aus, das jemand wirklich braucht.

Änderungen sind nachvollziehbar

Wer was wann geändert hat, steht im Repository statt in CloudTrail. Das ist auch die Antwort auf die Revisionsfrage, und sie kostet nichts extra.

Kein Rätselraten über den Bestand

Was nicht im Code steht, gibt es nicht mehr. Allein das Aufräumen davor senkt in gewachsenen Konten regelmäßig die Rechnung.

Der Plan wird gelesen

Kleine Zustände, kurze Läufe, verständliche Ausgabe. Ein Plan, den man in zwei Minuten prüft, ist der Unterschied zwischen einer Kontrolle und einem Ritual.

Eingesetzte Technologien

Womit ich arbeite

Sprache
  • Terraform
  • OpenTofu
  • HCL
  • AWS CDK
Import
  • import-Blöcke
  • generate-config-out
  • moved-Blöcke
State
  • S3-Backend
  • use_lockfile
  • Versionierung
  • Trennung je Umgebung
AWS
  • VPC
  • ECS Fargate
  • RDS / Aurora
  • IAM
  • Route 53
Struktur
  • Module
  • Workspaces
  • Provider-Versionen gepinnt
Pipeline
  • GitHub Actions
  • GitLab CI
  • OIDC
  • Plan als PR-Kommentar
Prüfen
  • tflint
  • Checkov
  • terraform validate
  • Drift-Läufe
Zertifiziert
  • HashiCorp Terraform Associate
Tim Rutte, Cloud & Software Architect

Mit wem Sie es zu tun haben

Direkt mit mir als Freelancer. Keine Agentur dazwischen.

Ich bin Tim Rutte. Über 20 Jahre Softwareentwicklung, dazu die HashiCorp-Zertifizierung für Terraform. Was ich an Infrastruktur baue, beschreibe ich als Code, weil ich es sonst selbst nicht wiederfinde. Sie sprechen mit der Person, die Ihren Code anfasst, vom ersten Gespräch bis zur Übergabe.

  • 20+Jahre Softwareentwicklung
  • 50+erfolgreiche Projekte
  • 2003seit diesem Jahr remote im Einsatz
Mehr über mich

Häufige Fragen

Häufige Fragen zu Terraform

Terraform oder OpenTofu?

Für die meisten Umgebungen ist das eine revidierbare Entscheidung, weil die Sprache dieselbe ist – deshalb steht sie nicht am Anfang. Zum Stand: HashiCorp hat die Lizenz im August 2023 von MPL auf BUSL 1.1 umgestellt, daraufhin entstand OpenTofu als Fork der letzten freien Version unter dem Dach der Linux Foundation, und HashiCorp gehört inzwischen IBM. OpenTofu hat seither eigene Fähigkeiten ergänzt, unter anderem State-Verschlüsselung; GitLab hat seine CI/CD-Vorlagen 2025 darauf umgestellt. Wenn Ihre Rechtsabteilung mit BUSL ein Problem hat oder Sie die Verschlüsselung im Werkzeug brauchen, nehmen wir OpenTofu. Sonst Terraform, weil Ökosystem und Dokumentation größer sind.

Wäre CloudFormation oder CDK nicht naheliegender auf AWS?

Manchmal ja, und dann sage ich das. CDK ist stark, wenn Ihr Team ohnehin TypeScript oder Python schreibt und die Infrastruktur nah an der Anwendung entsteht; CloudFormation ist richtig, wenn Sie ausschließlich AWS haben und Service Catalog oder StackSets nutzen. Terraform ist meine Voreinstellung, weil es mehr als AWS beschreibt – Cloudflare, GitHub, Datadog gehören in derselben Sprache dazu – und weil der Plan vor dem Anwenden gut lesbar ist. Wer schon CDK hat, bekommt von mir keine Migration empfohlen, nur weil ich Terraform lieber mag.

Müssen wir alles neu bauen?

Nein, und das ist der Kern des Vorgehens. Der Bestand wird importiert, nicht nachgebaut: Seit Terraform 1.5 gibt es dafür import-Blöcke in der Konfiguration, und ein erster Konfigurationsentwurf lässt sich aus dem Import erzeugen statt tippen. Die Abnahmebedingung je Schritt ist ein leerer Plan – dann ist bewiesen, dass die Beschreibung dem Bestand entspricht, und nichts wurde angefasst.

Was kostet die Einführung von Terraform?

Abgerechnet wird nach Aufwand, Bestandsaufnahme und erster Import als abgegrenztes Zwei- bis Vier-Wochen-Mandat. Anders als bei den Upgrade-Seiten gibt es hier bewusst kein Festpreispaket: Zwischen „nichts ist beschrieben" und „die Hälfte ist beschrieben, aber der State ist kaputt" liegt zu unterschiedliche Arbeit. Nach der Bestandsaufnahme kann ich den Rest zum Festpreis anbieten, vorher wäre es geraten.

Unser State liegt auf einem Laptop. Wie schlimm ist das?

Reparabel, und meistens der erste Handgriff. Der State wandert in einen S3-Bucket mit Versionierung und Verschlüsselung, die Sperre übernimmt seit Terraform 1.11 der Bucket selbst über use_lockfile = true – eine eigene DynamoDB-Tabelle braucht es dafür nicht mehr. Danach ist der Zustand an einer Stelle, gegen gleichzeitige Läufe geschützt und im Zweifel auf eine frühere Version zurückholbar.

Wir haben Drift. Dreht Terraform uns jetzt alles zurück?

Nicht ungefragt. Beim Import wird der Ist-Zustand beschrieben, nicht ein Wunschzustand, deshalb ist der erste Plan leer. Danach ist Drift eine Entscheidung: Was in der Konsole geändert wurde, wird entweder in den Code übernommen oder bewusst zurückgedreht, Position für Position. Was dauerhaft hilft, ist die Regel dahinter – beschriebene Ressourcen werden nur noch über Code geändert – und ein regelmäßiger Lauf, der Abweichungen meldet, bevor sie im Vorfall auffallen.

Brauchen wir gleich Module für alles?

Nein, und das ist der häufigste Fehler nach dem Import. Ein Modul entsteht aus einer Wiederholung, die man dreimal gesehen hat, nicht aus der Erwartung, dass es einmal drei werden. Zu früh gebaute Module verstecken genau die Details, die man beim Debuggen braucht, und ihre Schnittstellen sind dann falsch. Ich fange flach an und ziehe zusammen, wenn es sich zeigt.

Übernehmen Sie danach den Betrieb der Infrastruktur?

Nein, und das ist eine Festlegung. Ich bringe die Umgebung unter Verwaltung, richte die Pipeline ein und übergebe. Infrastruktur, deren Beschreibung ein Externer pflegt, ist genau dann ein Problem, wenn es schnell gehen muss. Was bleibt, sind Fragen – die beantworte ich gern – und keine Zuständigkeit.