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.
variable "project" {
type = string
default = "shop"
}
variable "image_id" {
type = string
}
variable "flavor_id" {
type = string
default = "s6.large.2"
}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.
stacktoit assess ./shop-terraform ./shop-out --offline --no-validateSource 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.
| Datei | Frage, die sie beantwortet | Was dieser Lauf enthielt |
|---|---|---|
| index.html | Wie sieht die gesamte Umgebung aus? | Die Ansicht Einheit für Einheit; sie öffnet sich offline im Browser. |
| assessment.json | Welche 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.md | Warum, und was bleibt bei uns? | Ein Eintrag je Einheit mit dem Beleg zur Regel und der Provider-Warnung. |
| migration/technical-sequencing.md | In welcher Reihenfolge ziehen die Einheiten um? | Drei Wellen, abgeleitet aus den Verweisen zwischen den Ressourcen. |
| migration/data-movement.md | Welche Daten müssen umziehen, und wer entscheidet, wie? | Eine zustandsbehaftete Einheit, der Bucket; ihr Mechanismus ist UNKNOWN, der Stand DECISION REQUIRED. |
| execution/manual/actions.md | Was erledigt eine Person? | Fünf manuelle Schritte in vier Arbeitspaketen; das erste liegt beim Network Architect. |
| review/inputs.yaml | Was 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.
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.
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.
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.
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.
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.
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.
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.
- 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 - 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-DDWas 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.
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)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.
## 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-Ressource | STACKIT-Ziel | Migrationsklasse |
|---|---|---|
| VPC | STACKIT-Netzwerk, mit Network Area, wo Routing nötig ist | Rekonfigurieren |
| Subnetz | STACKIT-Netzwerk mit eigenem Adressbereich | Rekonfigurieren |
| Security Group und ihre Regel | STACKIT Security Groups | Rekonfigurieren |
| ECS-Instanz | STACKIT Compute Engine | Rekonfigurieren |
| OBS-Bucket | STACKIT Object Storage | Rekonfigurieren |
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.