STACKTOIT · EINE ECHTE BEWERTUNG LESEN
So lesen Sie eine echte StackToIT-Migrationsbewertung
Ein Bewertungsordner enthält weit über hundert Dateien. Sie lesen sie nicht der Reihe nach, sondern fünf Dinge: die Zusammenfassung, die Klasse jeder Einheit, eine Einheit im Detail, eine Entscheidung und den Planschritt, der an ihr hängt. Dieser Leitfaden geht den Weg am veröffentlichten Lauf für AWS Retail Store, sodass sich jede Zahl am öffentlichen Beispiel prüfen lässt.
Zuerst die Zusammenfassung, dann was nicht festgestellt ist
Der veröffentlichte Lauf für AWS Retail Store: 282 Terraform-Ressourcen, 44 Migrationseinheiten. Links der Scan-Block von console.txt, rechts die Validierungsmatrix, die der Lauf darunter ausgibt.
StackToIT Assess
────────────────────────────────────────────
Source: terraform/ecs/default
Source files: 105
Resources scanned: 282 (0 in the root module · 282 inside 23 module calls)
support resources: 34 (+12 Terraform helpers, out of scope; 34 + 12 = the 46 support nodes of summary.support.nodes in assessment.json)
Migration units: 44 known-present (44 instances) · 8 conditional (+41 switched off — see Not in a wave)
Unit dependencies: 109
Modules: 23 module calls (13 external, 10 local): 23 loaded, 0 not downloaded, 0 invalid
module.dependencies ../../lib/dependencies 11 units (RECONFIGURE 7 · REPLATFORM 3 · REDESIGN 1) · 13 switched off · 77 resources (+10 nested calls)
module.retail_app_ecs ../../lib/ecs 30 known-present units (RECONFIGURE 24 · REPLATFORM 6) · 3 conditional · 3 switched off · 126 resources (+8 nested calls)
module.tags ../../lib/tags 0 units · 0 resources
module.vpc ../../lib/vpc 3 known-present units (RECONFIGURE 3) · 5 conditional · 25 switched off · 79 resources (+1 nested call)
Source checks: Built-in source checks passed — OpenTofu validation of the source did not run (LOCK_FILE)
Source completeness: RUNTIME_TOPOLOGY_PARTIAL — 8 unit(s) have a count/for_each that is not known statically; whether and how often they exist is decided at plan time
STACKIT mapping
────────────────────────────────────────────
DIRECT 0
RECONFIGURE 34 ███████████████████████ 77%
REPLATFORM 9 ██████ 20%
CONTAINERIZE 0
REDESIGN 1 █ 2%
MANUAL_REVIEW 0
BLOCKED 0 (the mapping class BLOCKED, not the execution blockers, which Migration readiness counts)
Confidence HIGH 0 · MEDIUM 35 · LOW 9Validation matrix (what has been established; nothing here approves the draft)
Source completeness: PARTIAL (source status RUNTIME_TOPOLOGY_PARTIAL)
Draft generation: GENERATED (the draft is in terraform/)
StackToIT draft checks: PASSED (100 checks, none found a violation)
Global invariants: PASSED (12 of 12 invariants PASS)
OpenTofu validation: PASSED (tofu init -backend=false and tofu validate accepted the draft; tofu 1.13.1)
Output schema validation: PASSED (verified at publish: every JSON file that has a schema is validated against it (see run_verification in manifest.json))
STACKIT plan: NOT RUN (this build runs no plan against a STACKIT project)
Architect approval: NOT PROVIDED (no review decision is recorded for this run)
Semantic equivalence: NOT ASSESSED (this build has no measure for it)
Safe to apply: NOT ASSERTED (StackToIT never asserts it)Zuerst die Zahlen
Die Quelle hat 282 Ressourcen und 44 Einheiten; 8 weitere Einheiten werden erst entschieden, wenn OpenTofu plant, und der Quellstatus ist RUNTIME_TOPOLOGY_PARTIAL. Lesen Sie das vor der Tabelle: Es sagt, dass das Inventar partiell ist, und warum.
Eine Klasse ist Arbeit, kein Urteil
RECONFIGURE 34, REPLATFORM 9, REDESIGN 1, keine BLOCKED. Die Konfidenz ist für 35 Einheiten MEDIUM und für 9 LOW, keine ist HIGH. Den Grund nennt der Architektenbericht: Das Beispiel liefert keine Lock-Datei mit, und solange die Provider-Version nicht gepinnt ist (.terraform.lock.hcl einchecken), sind seine Einheiten auf MEDIUM gedeckelt.
Die Matrix sagt, was der Lauf nicht getan hat
Der STACKIT-Plan wurde nicht ausgeführt, eine Freigabe durch einen Architekten ist nicht erfasst, Äquivalenz wird nicht bewertet, und safe-to-apply wird nie behauptet. Eine bestandene statische Validierung des Entwurfs ist keine Freigabe, und der Lauf kennzeichnet sie so.
Eine Einheit im Detail: die DynamoDB-Tabelle
Die lehrreichste Einheit des Laufs ist die als REDESIGN eingestufte. Links ihr Eintrag in assessment.json (ID, Klasse, Konfidenz, Ziel, Begründung und Review), rechts der Block stackit_mongodbflex_instance, den der Lauf dafür entworfen hat, ohne Review-Kommentare.
{
"id": "module.dependencies.module.dynamodb_carts.aws_dynamodb_table.this",
"result": {
"class": "REDESIGN",
"confidence": "MEDIUM",
"target": {
"service": "STACKIT MongoDB Flex (alternative — data-model redesign; PostgreSQL Flex JSONB is the other option)",
"resources": [
"stackit_mongodbflex_instance"
]
},
"reason": "There is no DynamoDB-compatible service on STACKIT. The access layer is rewritten against a document store (MongoDB Flex) or relational JSONB (PostgreSQL Flex); key design, capacity modes and conditional writes do not carry over. The draft is an alternative, not an equivalent: one MongoDB Flex instance for the estate's tables, each table a collection with its keys and secondary indexes named as MongoDB indexes.",
"review": [
"Rewrite the data access layer against the MongoDB API (queries, conditional writes, transactions).",
"Size the instance from the tables' data volume and request load; capacity units do not translate."
]
}
}resource "stackit_mongodbflex_instance" "dynamodb_tables" {
project_id = var.project_id
name = "dynamodb-tables"
acl = var.dynamodb_tables_allowed_cidrs
version = var.dynamodb_tables_version
flavor = {
cpu = var.dynamodb_tables_cpu
ram = var.dynamodb_tables_ram
}
replicas = 3
storage = {
class = var.mongodbflex_storage_class
size = var.dynamodb_tables_storage_gb
}
backup_schedule = "0 2 * * *"
options = {
type = "Replica"
point_in_time_window_hours = var.dynamodb_tables_pitr_hours
}
}Die Begründung ist der Vertrag
Auf STACKIT gibt es keinen DynamoDB-kompatiblen Dienst, daher ist der Entwurf eine Alternative und kein Äquivalent. Die Begründung nennt, was nicht übernommen wird: Schlüsseldesign, Kapazitätsmodi und bedingte Schreibvorgänge.
Review-Einträge sind Ihre Aufgabenliste
Die beiden Review-Zeilen sind Aufgaben: die Datenzugriffsschicht neu schreiben und die Instanz dimensionieren, weil Kapazitätseinheiten sich nicht übertragen lassen.
Variablen markieren, was nur Sie wissen
cpu, ram, Speicher und die Zugriffsliste sind Variablen ohne Wert. Die Größe Ihrer Daten errät der Lauf nicht.
Eine Entscheidung: vom Register zum Planschritt
Eine Frage, die der Code nicht beantwortet, wird zum Eintrag in decisions.json, zum Stub in review/decisions.yaml und zum manuellen Schritt in execution-plan.json. Hier die NAT-Ausgangsadresse aus demselben Lauf.
{
"id": "DEC-NET-STACKITROUTE-NAT-FIXED-EGRESS-ADDRESS-LOST",
"kind": "NAT_FIXED_EGRESS_ADDRESS_LOST",
"status": "OPEN",
"owner_role": "Network Architect",
"required_by_phase": "BEFORE_PILOT",
"options": [
{
"id": "accept-the-platform-egress-address",
"execution_effect": "ACK_CURRENT_ARTIFACT"
},
{
"id": "reserve-a-public-ip-per-server",
"execution_effect": "REGENERATE_REQUIRED"
}
]
} # DEC-NET-STACKITROUTE-NAT-FIXED-EGRESS-ADDRESS-LOST
# NAT_FIXED_EGRESS_ADDRESS_LOST (PLAN_DECISION, status OPEN, 1 member)
# affects: module.vpc.module.vpc.aws_route_table.private
# options (name one in chosen_option):
# accept-the-platform-egress-address: the draft already carries it out: a review frees the steps that wait for it
# reserve-a-public-ip-per-server: changes the draft, and no answer of this build writes it: change the source (or the draft by hand) and run again; a review frees nothing
- id: DEC-NET-STACKITROUTE-NAT-FIXED-EGRESS-ADDRESS-LOST
resolution: ""
# An option above that changes the draft frees no step by a review alone: its line says how the draft comes to carry it. A review that names none of the options frees nothing either.
# chosen_option: <one of the options above>
rationale: ""
evidence_refs: []
reviewed_by: Network Architect
reviewed_at: "<YYYY-MM-DD>"
members_sha256: sha256:cbfcbf1e12e98cb3608485caffc5de82e33e3517a0845fc9ca14cbcf7e207d0e
artifact_sha256: sha256:37a4992d7cb1b57ebe73b1567f6fec7b6f2f3de527370a9ba50c9d2e600bccea{
"id": "DEC/routing/stackitroute:module.vpc.module.vpc.aws_route_table.private:NAT_FIXED_EGRESS_ADDRESS_LOST",
"mode": "MANUAL",
"phase": "PREPARE",
"capability": "decision",
"operation": {
"manual": {
"owner_role": "Network Architect",
"when": "BEFORE_PILOT",
"success_condition": "the decision DEC-NET-STACKITROUTE-NAT-FIXED-EGRESS-ADDRESS-LOST is answered (accepted or rejected, with its evidence) in the inputs of the run and is no longer open when the run is repeated"
}
},
"runs_as_written": false
}Drei Dateien, eine ID
Die Entscheidungs-ID DEC-NET-STACKITROUTE-NAT-FIXED-EGRESS-ADDRESS-LOST steht in allen dreien, sodass sich eine Antwort vom Register über das Review bis zum wartenden Schritt zurückverfolgen lässt.
Optionen sagen, was sie ändern
accept-the-platform-egress-address führt der Entwurf wie geschrieben aus; daher gibt ein Review die wartenden Schritte frei. reserve-a-public-ip-per-server ändert den Entwurf und braucht einen neuen Lauf; ein Review allein gibt nichts frei.
Eingaben und Reviews sind verschieden
Eine Designantwort gehört in die Eingabedatei und erzeugt den Entwurf neu. Ein Review hält fest, dass ein Architekt geprüft und entschieden hat. Der nächste Lauf liest beides ein; ein Review allein schreibt kein Terraform um.
Wo Sie in welcher Reihenfolge nachsehen
| Schritt | Datei | Was Sie daraus entnehmen |
|---|---|---|
| 1 · Zusammenfassung | index.html, console.txt | Vollständigkeit der Quelle, Klassenverteilung, Paketzustand, erster Blocker |
| 2 · Einheiten | assessment.json | Klasse, Konfidenz, Ziel, Begründung, Review je Einheit, mit Quellzeile |
| 3 · Entwurf | terraform/ | Das STACKIT-Terraform mit NOT-CARRIED-Kommentaren je Einstellung |
| 4 · Entscheidungen | decisions.json, review/ | Offene Fragen mit Optionen, verantwortlicher Rolle und Phase |
| 5 · Plan | execution-plan.json, execution/ | Geordnete Schritte, wer sie ausführt, worauf jeder wartet |
| 6 · Daten | migration/data-movement.md | Zustandsbehaftete Einheiten und offene Datenfragen |
| 7 · Integrität | manifest.json | Die Dateien des Laufs und ihre Prüfsummen für stacktoit verify |
Dateinamen, wie der veröffentlichte Lauf sie schreibt.
Leseregeln, die Diskussionen sparen
Kein Schritt läuft wie geschrieben
Der Retail-Lauf nennt 48 von 57 automatisierten Schritten frei von Entscheidungen, doch 0 laufen wie geschrieben, weil sie auf Werte wie project_id warten. Frei von Entscheidungen heißt nicht anwendungsbereit.
Ein Standardwert ist keine Antwort
Zwei Einträge beruhen auf einem Standardwert des Entwurfs: öffentlicher Endpunkt und aus der Quelle abgeleitete Größe. Bis jemand sie bestätigt oder ändert, sind sie offen.
Nicht übernommen heißt benannt
Jede Einstellung, die der Entwurf auslässt, steht mit Grund in der Datei. Der Lauf meldet 404 geprüfte Quelleigenschaften auf erzeugten Einheiten, 204 übernommen oder erklärt und 200 nicht übernommen, keine unerfasst.
Prüfen, bevor Sie sich auf einen Ordner verlassen
stacktoit verify prüft die Dateien gegen das Manifest. Für den veröffentlichten Lauf meldet es 145 passende Dateien und 7 von 7 bestandene Prüfungen.
Nichts wird angewendet
Der Lauf liest Code und schreibt Dateien. Er legt in keiner Cloud etwas an.
Fragen von Reviewern
Warum gibt es im Lauf keine Einheiten mit HIGH-Konfidenz?
Der Quell-Provider ist nicht gepinnt: Das Retail-Beispiel liefert keine Lock-Datei mit. Die Konfidenz ist auf MEDIUM gedeckelt, bis die exakte Provider-Version gepinnt ist.
Heißt die Klasse REPLATFORM, dass der Umzug leicht ist?
Sie heißt, dass der Workload in ein anderes Plattformmodell wechselt. Review-Einträge und NOT-CARRIED-Kommentare zeigen, wie groß der Aufwand ist.
Wohin gehören meine Antworten?
Kopieren Sie inputs-template.yaml und decisions-template.yaml aus dem Lauf-Ordner heraus, füllen Sie die verlangten Felder aus, ohne die Kennungen zu ändern, und übergeben Sie die Dateien beim nächsten Lauf mit --inputs und --decisions.
Kann ich dem Terraform so vertrauen?
Es ist ein Entwurf zur Prüfung. Der Lauf hat ihn statisch validiert, und gegen ein STACKIT-Projekt wurde kein Plan ausgeführt.
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.