HUAWEI CLOUD → STACKIT · TUTORIAL

Huawei Cloud Terraform zu STACKIT, Schritt für Schritt

Ihre Huawei-Cloud-Umgebung liegt als Terraform vor, und Sie wollen wissen, was ein Wechsel zu STACKIT von Ihnen verlangt. Dieses Tutorial begleitet ein kleines Modul vom Befehl bis zum geprüften Ergebnis: was Sie ausführen, welche Dateien Sie zuerst öffnen, wie die eine offene Anfrage beantwortet wird und was der zweite Lauf ändert. Alle gezeigten Werte hat der Lauf am 4. November 2026 geschrieben.

Die Eingabe: ein Modul mit Variablen

Sechs Ressourcen in einer main.tf (VPC, Subnetz, Security Group mit einer Regel, Server und OBS-Bucket), dazu eine Variablen- und eine terraform.tfvars-Datei. Links die Variablen, rechts Server und Bucket, die sie lesen.

Variablenvariables.tf
variable "project" {
  type    = string
  default = "shop"
}

variable "image_id" {
  type = string
}

variable "flavor_id" {
  type    = string
  default = "s6.large.2"
}
Server und Bucketmain.tf
resource "huaweicloud_compute_instance" "app" {
  name               = "${var.project}-app-01"
  image_id           = var.image_id
  flavor_id          = var.flavor_id
  availability_zone  = "eu-west-101a"
  security_group_ids = [huaweicloud_networking_secgroup.app.id]
  system_disk_type   = "SSD"
  system_disk_size   = 40

  network {
    uuid = huaweicloud_vpc_subnet.app.id
  }
}

resource "huaweicloud_obs_bucket" "uploads" {
  bucket     = "${var.project}-uploads"
  acl        = "private"
  versioning = true
}
  • Variablen werden aufgelöst

    terraform.tfvars liefert image_id, daher meldet der Lauf die Quelle als vollständig. Eine Variable ohne Default und ohne Wert würde stattdessen als Lücke benannt; der DMS-Leitfaden zeigt diesen Fall.

  • Lock-Datei mitführen

    Der Lauf warnt bei jeder Einheit, dass die Provider-Version nicht durch eine Lock-Datei festgelegt ist. Die Angabe in required_providers genügt dafür nicht; committen Sie .terraform.lock.hcl neben dem Modul.

  • Nichts verlässt Ihren Rechner

    StackToIT liest die Dateien. Es verbindet sich nicht mit einem Huawei-Cloud-Konto, und dieser Lauf wurde offline ausgeführt.

Der Befehl und die erste Zusammenfassung

Ein Befehl mit Modul und Ausgabeordner, in der Syntax der StackToIT-CLI-Dokumentation; die beiden Ordnernamen sind Beispiele; der Demo-Lauf selbst wurde im Modulordner mit einem separaten Ausgabeordner gestartet. Der Lauf nutzte --offline und --no-validate: Letzteres überspringt die OpenTofu-Prüfung der Quelle, die den Provider lokal braucht. Die Zusammenfassung lesen Sie zuerst.

Befehlshell
stacktoit assess ./shop-terraform ./shop-out --offline --no-validate
Konsolenzusammenfassungconsole.txt
Source        5 migration units · visibility: Complete
Target        0 Terraform-only · 0 hybrid · 0 API-only · 5 manual · 0 no resource (of 5 units the draft considered)
Execution     Partially executable · 0 Terraform · 0 API · 0 design inputs · 5 manual migration work · 0 lifecycle (cutover/verify/retire) (of 5 plan steps)
Decisions     no open item · no decision holds a plan step · Inputs: 0 design inputs wait · 5 open requests (1 blocks the draft — inputs-template.yaml marks it, 4 are preferences this build cannot apply — inputs-template.yaml, NOT APPLICABLE IN THIS BUILD, says where to set each)
Checks        12/12 invariants passed (9 of them checked nothing) · Static validation: not run · Published (manifest.json lists every file of the package except itself and the review/ files you fill in)
  • Fünf Einheiten, nicht sechs

    Die Regel der Security Group wird zusammen mit ihrer Gruppe bewertet; so werden aus sechs Ressourcen fünf Einheiten.

  • Nichts entworfen

    „0 Terraform-only … 5 manual“ ist für eine Huawei-Cloud-Quelle in diesem Build die ehrliche Lesart: Jede Einheit ist eingestuft und hat Ziel und Begründung, und die STACKIT-Seite richtet eine Person ein.

  • Die letzten beiden Zeilen lesen

    Eine offene Anfrage blockiert den Entwurf, und laut Lauf sind vier weitere Präferenzen, die er nicht anwenden kann. Beides wird weiter unten erklärt.

Welche Datei beantwortet welche Frage

Der Lauf schreibt einen Ordner, keinen einzelnen Bericht. In dieser Reihenfolge waren die Dateien für dieses Modul nützlich.

DateiFrage, die sie beantwortetWas dieser Lauf enthielt
index.htmlWie sieht die gesamte Umgebung aus?Die Ansicht Einheit für Einheit; sie öffnet sich offline im Browser.
assessment.jsonWelche Klasse, welches Ziel und welche Begründung hat jede Ressource?Fünf Einheiten, alle RECONFIGURE: die Security Group mit Konfidenz LOW, die übrigen vier MEDIUM.
engineering/architect-report.mdWarum, und was bleibt bei uns?Ein Eintrag je Einheit mit dem Beleg zur Regel und der Provider-Warnung.
migration/technical-sequencing.mdIn welcher Reihenfolge ziehen die Einheiten um?Drei Wellen, abgeleitet aus den Verweisen zwischen den Ressourcen.
migration/data-movement.mdWelche Daten müssen umziehen, und wer entscheidet, wie?Eine zustandsbehaftete Einheit, der Bucket; ihr Mechanismus ist UNKNOWN, der Stand DECISION REQUIRED.
execution/manual/actions.mdWas erledigt eine Person?Fünf manuelle Schritte in vier Arbeitspaketen; das erste liegt beim Network Architect.
review/inputs.yamlWas fragt der Lauf noch?Ein Eintrag, target.region, der den Entwurf blockiert.
terraform/Was enthält der STACKIT-Entwurf?terraform.tf, variables.tf und README.md; keine Ressourcenblöcke.

Dateinamen und Zahlen stammen aus dem Lauf dieses Moduls. Alle Ergebnisdateien führt die StackToIT-Dokumentation auf.

Der Ablauf in sieben Schritten

Dieselbe Reihenfolge trägt auch bei einer großen Umgebung; nur das Lesen dauert länger.

  1. Den Lauf auf das Root-Modul richten

    Wählen Sie das Verzeichnis, das die Infrastruktur deklariert, nicht ein Unterverzeichnis einer größeren Konfiguration. Lock-Datei und Variablendateien bleiben daneben liegen.

  2. Offline laufen lassen

    --offline untersagt ausgehende Anfragen; das Ergebnis hängt daher nur von Ihren Dateien ab. Mit --var-file geben Sie Werte an, die nicht in den üblichen Variablendateien stehen.

  3. Zuerst die Zusammenfassung lesen

    Prüfen Sie die Sichtbarkeit der Quelle (hier: Complete), die Zahl der Einheiten, wie viele entworfen und wie viele manuell sind und wie viele Anfragen offen sind.

  4. assessment.json öffnen

    Jede Einheit hat Klasse, Konfidenz, Zieldienst und Begründung. Eine LOW-Konfidenz ist der Anlass, vor der Planung den Berichtseintrag zu lesen.

  5. Die Reihenfolge lesen

    technical-sequencing.md nennt die Wellen. Einheiten einer Welle können parallel umziehen; eine Einheit zieht erst um, wenn die Einheiten, von denen sie abhängt, umgezogen sind.

  6. Beantworten, was gefragt wird

    Kopieren Sie review/inputs.yaml aus dem Ausgabeordner, füllen Sie die „value“-Zeilen, halten Sie Ihre Kopie unter Versionskontrolle und übergeben Sie sie mit --inputs wieder an den Lauf.

  7. Arbeitspakete weitergeben

    actions.md gruppiert die manuellen Schritte nach Rolle. Geben Sie jedem Verantwortlichen sein Paket und bewahren Sie den Laufordner als Nachweis auf, was damals gefragt war.

Die offene Anfrage beantworten

Den Eintrag schreibt der Lauf und bindet ihn an diese Quelle; Sie füllen „value“ und lassen die übrigen Zeilen unverändert. Links der Eintrag wie geschrieben, rechts dieselben Zeilen in der Kopie für den zweiten Lauf.

Vorlage wie geschriebenreview/inputs.yaml
  - 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
Ausgefüllte Kopieinputs.yaml
  - id: INP-TSE-1eaf5b60fa62
    kind: TARGET_SELECTION
    topic: target.region
    scope:
      profile: default
    # options: eu01 | eu02
    value: eu01
    # 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

Was der zweite Lauf geändert hat

Der zweite Lauf nutzte --inputs mit der ausgefüllten Kopie und schrieb einen neuen Ausgabeordner. Vergleichen Sie die Zeile „Decisions“ der Konsole: links der erste, rechts der zweite Lauf.

Erster Laufconsole.txt
Decisions     no open item · no decision holds a plan step · Inputs: 0 design inputs wait · 5 open requests (1 blocks the draft — inputs-template.yaml marks it, 4 are preferences this build cannot apply — inputs-template.yaml, NOT APPLICABLE IN THIS BUILD, says where to set each)
Zweiter Laufconsole.txt
Decisions     no open item · no decision holds a plan step · Inputs: 0 design inputs wait · 4 open requests (0 block the draft, 4 are preferences this build cannot apply — inputs-template.yaml, NOT APPLICABLE IN THIS BUILD, says where to set each)
  • Geändert

    Die blockierende Anfrage ist weg: aus 5 offenen Anfragen wurden 4, und keine der verbleibenden vier blockiert den Entwurf. Der zweite Lauf meldet die Antwort außerdem als angewandt, mit 0 veralteten und 0 ungültigen.

  • Nicht geändert

    Der Entwurf ist derselbe: variables.tf führte eu01 bereits als Standardregion, und die Einheiten bleiben manuell. Die Antwort gibt den Entwurf frei; für eine Huawei-Cloud-Quelle schreibt sie keine STACKIT-Ressourcen.

  • Vier Präferenzen

    Öffentliche Adressen, Egress, Observability und das Zielprojekt sind als Anfragen vermerkt, die dieser Build nicht anwenden kann. Die Vorlage nennt, wo jede stattdessen gesetzt wird, etwa die Variable project_id des Entwurfs.

  • Beide Ordner behalten

    Ein erneuter Lauf auf demselben Ausgabeordner legt den früheren Lauf standardmäßig in einem Unterordner previous-<Lauf-ID> ab; getrennte Ordner wie hier machen den Vergleich einfacher.

Die Reihenfolge, wie der Lauf sie schrieb

Aus technical-sequencing.md. Das Subnetz wartet auf die VPC, der Server auf Subnetz und Security Group; der Bucket hängt von nichts ab und liegt in Welle 1.

Wellenmigration/technical-sequencing.md
## Wave 1 — 3 unit(s)

| Unit | Class | Target |
|---|---|---|
| `huaweicloud_networking_secgroup.app` | RECONFIGURE / LOW | STACKIT security groups |
| `huaweicloud_obs_bucket.uploads` | RECONFIGURE / MEDIUM | STACKIT Object Storage |
| `huaweicloud_vpc.main` | RECONFIGURE / MEDIUM | STACKIT network |

## Wave 2 — 1 unit(s)

| Unit | Class | Target |
|---|---|---|
| `huaweicloud_vpc_subnet.app` | RECONFIGURE / MEDIUM | STACKIT network |

## Wave 3 — 1 unit(s)

| Unit | Class | Target |
|---|---|---|
| `huaweicloud_compute_instance.app` | RECONFIGURE / MEDIUM | STACKIT Compute Engine |

## Cutover (decision support — performed by the customer)

No cutover facts: the scan and the draft established no DNS record set whose value the draft re-binds to a generated address, no public address re-binding, no DNS record unit, no certificate unit and no open cutover decision. That is not a statement that nothing has to be cut over: a name, an address or a certificate outside the scanned source is not seen, and a unit that exists only if OpenTofu decides so at plan time is not read here. StackToIT performs no cutover and gives no time estimate.

So wurden die fünf Einheiten eingestuft

Huawei-Cloud-RessourceSTACKIT-ZielMigrationsklasse
VPCSTACKIT-Netzwerk, mit Network Area, wo Routing nötig istRekonfigurieren
SubnetzSTACKIT-Netzwerk mit eigenem AdressbereichRekonfigurieren
Security Group und ihre RegelSTACKIT Security GroupsRekonfigurieren
ECS-InstanzSTACKIT Compute EngineRekonfigurieren
OBS-BucketSTACKIT Object StorageRekonfigurieren

Klassen, wie der Lauf sie entschieden hat. Die Security Group ist die einzige Einheit mit LOW. Der Lauf vermerkt, dass ihre Regel ohne Zuordnung katalogisiert ist; was die Regel für die Gruppe bedeutet, wird daher nicht bewertet. Richtung, Port und Quellbereich prüfen Sie selbst.

Entscheidungen, die bei Ihren Architekten bleiben

Der Lauf benennt sie, er trifft sie nicht.

  • Region

    eu01 oder eu02. Die Antwort oben wählte eu01; die andere Region ist ein anderer Katalog und eine andere Antwort.

  • Regeln der Security Group

    STACKIT-Regeln erlauben nur Verkehr; eine Deny-Regel oder eine Prioritätsreihenfolge aus der Quelle braucht daher eine Entscheidung. Dieses Modul hat eine Ingress-Regel auf Port 443 für 0.0.0.0/0; entscheiden Sie, ob sie bleibt.

  • Image und Flavor

    Der Flavor wird zu einem STACKIT-Flavor, das Image wird neu gebaut oder importiert; beides wählt der Lauf nicht für Sie.

  • Wie die Bucket-Daten umziehen

    Größe, Änderungsrate und tolerierte Ausfallzeit stehen nicht im Terraform; daher hält der Lauf den Mechanismus als offen fest. Der OBS-Leitfaden behandelt die Optionen.

Fragen vor dem ersten Lauf

Braucht der Ablauf Zugriff auf unser Huawei-Cloud-Konto?

Nein. StackToIT liest Terraform- und OpenTofu-Root-Module, die den Provider huaweicloud/huaweicloud nutzen, und verbindet sich nicht mit einem Huawei-Cloud-Konto.

Warum meldet der Lauf 0 entworfene Einheiten?

Für Huawei-Cloud-Quellen stuft dieser Build jede Ressource ein und nennt ein STACKIT-Ziel und eine Begründung; er schreibt terraform.tf, variables.tf und eine README für das Ziel, aber keine STACKIT-Ressourcenblöcke. Diese schreiben die Architekten anhand von Einstufung und Bericht.

Was, wenn eine Variable keinen Wert hat?

Der Lauf benennt die Lücke und markiert die Quelle als unvollständig, statt zu raten. Geben Sie den Wert über eine Variablendatei oder --var-file an und wiederholen Sie den Lauf; die Einheit wird dann damit bewertet.

Können wir den Lauf nach jeder Änderung am Terraform wiederholen?

Ja. Jeder Lauf liest die Quelle, wie sie ist, schreibt eine neue Lauf-ID und bindet Antworten an diese Quelle; eine Antwort, die für etwas Geändertes geschrieben wurde, gilt als veraltet und wirkt nicht.

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.