ORACLE CLOUD → STACKIT · TUTORIAL
Der OCI-Terraform-Ablauf: vom Root-Modul zum Prüfpaket
Dieses Tutorial führt ein kleines Oracle-Cloud-Root-Modul vom Ordner auf der Platte bis zu den Dateien, die Ihre Architekten prüfen. Sie committen eine Lock-Datei, starten einen Befehl, lesen die Konsolenzusammenfassung, beantworten die zwei Anfragen, die der Lauf als blockierend markiert, und starten erneut. Die Demo-Umgebung wurde für diese Seite geschrieben und am 4. November 2026 bewertet; jeder Ausschnitt stammt aus diesem Lauf. Für eine Oracle-Cloud-Quelle klassifiziert und ordnet der Lauf jede Einheit; die STACKIT-Ressourcen selbst baut Ihr Team.
Der Ablauf in sechs Schritten
Wichtiger als die Reihenfolge ist die Gewohnheit, vor jedem nächsten Schritt zu lesen, was der letzte festgehalten hat.
1. Lock-Datei committen
StackToIT liest Terraform- und OpenTofu-Root-Module mit dem Provider oracle/oci und verbindet sich nie mit einem Tenant. Die Zuordnungen wurden gegen Version 9.11.0 dieses Providers geprüft. Committen Sie .terraform.lock.hcl neben das Modul: Fehlt der Lock-Eintrag für oci, meldet der Lauf, dass die Provider-Version eines Plans nicht belegt ist, und begrenzt jede Einheit auf Konfidenz MEDIUM.
2. Bewertung starten
Rufen Sie stacktoit assess im Ordner des Moduls mit dessen Pfad auf. Der Demo-Lauf nutzte zusätzlich --offline, das ausgehende Netzwerkzugriffe verbietet; die Dokumentation führt es bei den Quelloptionen auf, neben --var-file, --provider-mirror und --validate-source.
3. Konsolenzusammenfassung lesen
Die Zusammenfassung nennt gescannte Ressourcen, gefundene Einheiten und die Klassenverteilung. Im Demo-Lauf waren es 4 Ressourcen: 3 sicher vorhandene Einheiten (VCN, Subnetz, Bucket) und 1 bedingte Einheit, der Instanzblock, dessen Anzahl von einer Variablen abhängt. Die Quellvollständigkeit lautet deshalb RUNTIME_TOPOLOGY_PARTIAL.
4. Blockierende Anfragen beantworten
Der Lauf schreibt inputs-template.yaml. Zwei Anfragen sind als blockierend markiert: die STACKIT-Region (eu01 oder eu02) und der Wert der Root-Variablen app_names. Kopieren Sie die Datei, füllen Sie die value-Zeilen aus und übergeben Sie sie mit --inputs. Vier weitere Anfragen, etwa das Zielprojekt, stehen am Ende als in diesem Build nicht anwendbar, jeweils mit dem Ort, an dem die Einstellung stattdessen erfolgt.
5. Erneut mit demselben Ausgabeordner ausführen
Der nächste Lauf liest Ihre Antworten. Wollen Sie beide Läufe vergleichen, geben Sie --keep-previous an: Laut Dokumentation bleibt der frühere Lauf dann in OUT/previous-<run id>/ erhalten. Liefern Sie app_names zusätzlich per --var-file, damit die Instanzeinheit keine Voraussetzung mehr ist.
6. Bericht prüfen, dann aufbauen
Öffnen Sie engineering/architect-report.md und migration/technical-sequencing.md. Für eine Oracle-Cloud-Quelle enthält der Ordner terraform/ nur die Provider- und Variablendateien; Ihr Team schreibt die STACKIT-Ressourcen anhand des Berichts und initialisiert, validiert und plant sie gegen ein Testprojekt. StackToIT selbst führt nie apply aus.
Eine variablengesteuerte Ressource, bewertet
Links: der Instanzblock der Demo-Eingabe, genau wie geschrieben. Rechts: der Datensatz, den der Lauf dazu in assessment.json führt. Drei Server entstehen aus einem Block, daher trägt die Einheit instances: 3, und der Datensatz nennt den Grund, warum sie nur bedingt vorhanden ist. Da assessment.json in einer einzigen Zeile geschrieben ist, zeigt der Ausschnitt ausgewählte Felder jeder Einheit, eingerückt und so verschachtelt wie in der Datei, mit unveränderten Werten.
resource "oci_core_instance" "app" {
for_each = toset(var.app_names)
compartment_id = var.compartment_id
availability_domain = var.availability_domain
display_name = each.key
shape = "VM.Standard.E5.Flex"
shape_config {
ocpus = 1
memory_in_gbs = 8
}
source_details {
source_type = "image"
source_id = var.image_id
}
create_vnic_details {
subnet_id = oci_core_subnet.app.id
}
}{
"id": "oci_core_instance.app",
"presence": "CONDITIONAL",
"presence_cause": {
"kind": "root-variable-overridable",
"where": "for_each",
"expr": "toset(var.app_names)",
"variables": [
"var.app_names"
]
},
"instances": 3,
"wave": 0,
"result": {
"class": "RECONFIGURE",
"confidence": "MEDIUM",
"target": {
"service": "STACKIT Compute Engine"
},
"reason": "A compute instance becomes a STACKIT server. The shape becomes a STACKIT flavor, the image is rebuilt or imported, and the attached volumes and network interfaces move with it."
}
}Standardwerte werden gelesen, nicht blind übernommen
Die Variable app_names hat als Standardwert drei Namen (web-01, web-02, worker-01); deshalb zählt der Lauf drei Instanzen und hält den Zustand als „mit Standardwerten vorhanden“ fest. Weil eine Variablendatei, -var oder TF_VAR_app_names den Standardwert überschreiben kann, steht die Einheit auf CONDITIONAL mit der Ursache root-variable-overridable.
Eine Voraussetzung, keine Vermutung
technical-sequencing.md führt die Einheit unter den Voraussetzungen außerhalb der Wellen und nennt die Abhilfe: den Variablenwert mit --var-file liefern. Der Standardwert gilt nicht als Antwort; wave 0 im Datensatz heißt, dass sie noch keiner Welle angehört.
Klasse und Ziel bleiben lesbar
Der Server wird ein STACKIT-Server auf Compute Engine, Klasse RECONFIGURE. Die Shape wird ein Flavor, das Image wird neu gebaut oder importiert, und angehängte Volumes und Netzwerkschnittstellen ziehen mit.
Wo im Ausgabeordner welche Antwort steht
- index.html
- Die Ansicht Einheit für Einheit, offline im Browser lesbar.
- assessment.json
- Jede Einheit mit Klasse, Konfidenz, Ziel, Begründung, Welle, Vorhandensein und den Einstellungen, die bei Ihnen bleiben.
- engineering/architect-report.md
- Pro Einheit: Ziel, Begründung, kritische Einstellungen und Warnungen, dazu die Validierungsmatrix.
- migration/technical-sequencing.md
- Wellen aus den Abhängigkeiten und die Voraussetzungen, die keiner Welle angehören.
- migration/data-movement.md
- Zustandsbehaftete Einheiten, für die eine Person das Verfahren für den Datenumzug wählen muss.
- execution/manual/actions.md
- Die manuellen Schritte in Arbeitspaketen mit Verantwortlichem und Abschlussbedingung.
- inputs-template.yaml
- Die Fragen des Laufs als Vorlagen zum Ausfüllen und Zurückgeben.
- review/
- Bearbeitbare Kopien: decisions.yaml, inputs.yaml, progress.yaml und target-values.tfvars.
- terraform/
- Bei einer Oracle-Cloud-Quelle nur terraform.tf, variables.tf und eine README: keine STACKIT-Ressourcenblöcke.
Die zwei Anfragen, die den Lauf blockieren
Beide Vorlagen stammen aus inputs-template.yaml des Demo-Laufs. Links: die Region mit den zwei Optionen, die der Lauf anbietet. Rechts: der Wert der Root-Variablen app_names.
# target.region (TARGET_SELECTION, request state OPEN)
# needed: The STACKIT region the migrated estate is built in.
- id: INP-TSE-1eaf5b60fa62
kind: TARGET_SELECTION
topic: target.region
scope:
profile: default
# options: eu01 | eu02
value: "" # pick one of the options above
# explanation: why you chose this (optional; remove the # to write it)
answered_by: CUSTOMER_ARCHITECT # a role, not a person
answered_at: "2026-11-04" # YYYY-MM-DD
recorded_with:
basis_digest: sha256:94a1663bf63dd33750f12f962a5adedcc2bf291ebf4b101eee03238a48e95e54 # source.variable (SOURCE_PARAMETER, request state OPEN)
# needed: The value the running environment gives the root variable app_names, which the source sets only as a default that a variable file or the command line can override.
- id: INP-SPA-5bd4d3b73362
kind: SOURCE_PARAMETER
topic: source.variable
scope:
profile: default
subject: app_names
value: "" # fill one value
# explanation: why you chose this (optional; remove the # to write it)
answered_by: CUSTOMER_ARCHITECT # a role, not a person
answered_at: "2026-11-04" # YYYY-MM-DD
recorded_with:
basis_digest: sha256:9ba8056e684e8cca3711c1ee31ff62a5a4e562be04ff3b7c83ee925980b200c5Zuerst die Region beantworten
Die Vorlage sagt es selbst: Anfragen, die von der Region abhängen, werden bis zur Antwort aus dem eu01-Katalog abgeleitet. Wählen Sie eu02, wird eine für eu01 erfasste Antwort als STALE_CATALOG markiert, nicht angewendet und erneut erfragt.
Einen Wert eintragen, die Bindung nicht anfassen
Eine leer gelassene Vorlage ist weder Antwort noch Fehler: Die Anfrage bleibt offen, und die ausgefüllten Antworten gelten trotzdem. id, kind, topic, scope und recorded_with binden die Antwort an diese Quelle und diese Wissensbasis; ändern Sie sie nicht.
Rollen statt Personen
answered_by nimmt eine Rolle wie CUSTOMER_ARCHITECT, answered_at den Tag der Antwort. In der optionalen explanation-Zeile halten Sie die Begründung für die nächste Prüfung fest.
Was aus den vier Ressourcen wurde
| OCI-Ressource | STACKIT-Ziel | Klasse und Welle |
|---|---|---|
| oci_core_vcn.main | STACKIT-Netzwerk | RECONFIGURE, Welle 1 |
| oci_objectstorage_bucket.assets | STACKIT Object Storage | RECONFIGURE, Welle 1 |
| oci_core_subnet.app | STACKIT-Netzwerk | RECONFIGURE, Welle 2 |
| oci_core_instance.app (3 Instanzen) | STACKIT Compute Engine | RECONFIGURE, Voraussetzung |
Alle vier haben Konfidenz MEDIUM: Ohne Lock-Eintrag für oci ist das die Obergrenze. Der Ordner terraform/ enthält für keine davon einen Ressourcenblock; der Oracle-Cloud-Adapter klassifiziert und ordnet die Einheiten, die STACKIT-Seite baut Ihr Team.
Was Sie ändern, bevor Sie etwas anwenden
Quelle festlegen und validieren
Committen Sie die Lock-Datei und stellen Sie die Provider-Pakete über --provider-mirror oder einen Plugin-Cache bereit; laut Dokumentation braucht die Validierung außerdem OpenTofu im PATH und eine Sandbox ohne Netzwerkzugriff auf dem Host, heruntergeladen wird dabei nichts. Im Demo-Lauf wurde die OpenTofu-Prüfung der Quelle übersprungen (LOCK_FILE); die eingebauten Prüfungen liefen. Das ist weder ein Bestehen noch ein Scheitern der Quelle.
Provider authentifizieren
Wenn Ihr Team die STACKIT-Ressourcen schreibt, braucht es einen Service Account. Die Dokumentation des STACKIT-Providers 0.121.0, der Version, die der Lauf festlegt, nennt zwei Wege der Authentifizierung: Workload Identity Federation und den Key-Flow mit einem Service-Account-Key. Der Provider versucht zuerst Workload Identity Federation und sucht Zugangsdaten im Provider-Block, dann in Umgebungsvariablen, dann in einer Credentials-Datei. Richten Sie auch ein State-Backend ein; deklariert ist keines.
Die 4 Einheiten entscheiden
Alle vier liegen bei Ihnen: Der Lauf schreibt dafür keinen Block. Bauen Sie die STACKIT-Gegenstücke anhand der Ziele im Bericht (Netzwerk, Object Storage, Compute Engine) oder halten Sie fest, dass eine keines braucht.
Die Zahlen richtig lesen
Die Konsole meldet 12 von 12 bestandenen Invarianten; 9 davon prüften nichts, weil keine Ressource erzeugt wurde. Das ist eine leere Prüfung, keine Zusicherung.
Fragen vor dem ersten Lauf
Braucht der Lauf Zugriff auf unseren Oracle-Cloud-Tenant?
Nein. Er liest die Terraform- oder OpenTofu-Dateien des Root-Moduls und verbindet sich nicht mit einem Tenant. Werte, die erst zur Planzeit feststehen, etwa eine überschriebene Variable, werden in der Antwortdatei erfragt.
Warum nennt die Zusammenfassung 3 Einheiten bei 4 gescannten Ressourcen?
Die 3 sind die sicher vorhandenen Einheiten: VCN, Subnetz und Bucket mit je einer Instanz. Die vierte Ressource, der Instanzblock, zählt getrennt als 1 bedingte Einheit, weil ihr for_each von einer Variablen abhängt. Der Klassenbalken (RECONFIGURE 3) zählt nur die sicheren Einheiten; die bedingte wäre ebenfalls RECONFIGURE.
Brauchen wir OpenTofu?
Nicht für die Bewertung selbst. Laut Dokumentation dient OpenTofu der Quellvalidierung, wenn Sandbox und Provider-Pakete verfügbar sind. Der Demo-Lauf fand OpenTofu 1.13.1, übersprang die Quellprüfung aber mangels Lock-Datei; die eingebauten Prüfungen liefen trotzdem.
Schreibt der Lauf STACKIT-Terraform für eine Oracle-Cloud-Quelle?
Nein. Für Oracle Cloud enthält der Ordner terraform/ nur die Provider- und Variablendateien. Der Nutzen des Laufs liegt in Klassifizierung, Zielen, Wellen und offenen Fragen; daraus bauen Ihre Architekten die STACKIT-Ressourcen.
Quellen
Ihr nächster Schritt: STACKIT.
Erzählen Sie uns von Ihrer Umgebung. Wir zeigen Ihnen, was StackToIT dafür liefert: Zielarchitektur, Terraform-Artefakte und einen strukturierten Migrationsplan.