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.

Scan-Zusammenfassungconsole.txt
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 9
Validierungsmatrixconsole.txt
Validation 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.

StackToIT-Bewertungassessment.json
{
  "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."
    ]
  }
}
STACKIT-Terraform von StackToITterraform/data.tf
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.

Entscheidungsregisterdecisions.json
{
  "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"
    }
  ]
}
Review-Vorlagereview/decisions.yaml
  # 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
Planschrittexecution-plan.json
{
  "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

SchrittDateiWas Sie daraus entnehmen
1 · Zusammenfassungindex.html, console.txtVollständigkeit der Quelle, Klassenverteilung, Paketzustand, erster Blocker
2 · Einheitenassessment.jsonKlasse, Konfidenz, Ziel, Begründung, Review je Einheit, mit Quellzeile
3 · Entwurfterraform/Das STACKIT-Terraform mit NOT-CARRIED-Kommentaren je Einstellung
4 · Entscheidungendecisions.json, review/Offene Fragen mit Optionen, verantwortlicher Rolle und Phase
5 · Planexecution-plan.json, execution/Geordnete Schritte, wer sie ausführt, worauf jeder wartet
6 · Datenmigration/data-movement.mdZustandsbehaftete Einheiten und offene Datenfragen
7 · Integritätmanifest.jsonDie 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.