AWS → STACKIT · MIGRATIONSLEITFADEN
Der vollständige Leitfaden für die Migration von AWS zu STACKIT
Migrieren Sie in dieser Reihenfolge: den Terraform-Code bewerten, entscheiden, wofür es kein gleichwertiges Ziel gibt, das Netzwerk aufbauen, die Datendienste bereitstellen, die Daten übertragen, die Clients umstellen und die Quelle stilllegen. Der Leitfaden begleitet eine AWS-Umgebung mit 12 Ressourcen durch einen StackToIT-Lauf und zeigt je Schritt, welche Datei der Ausgabe die Antwort enthält und welche Entscheidungen bei Ihren Architekten liegen.
Die sieben Schritte
Die Reihenfolge entspricht den Wellen und Arbeitspaketen des Laufs.
1. Den Terraform-Code bewerten
Richten Sie StackToIT auf den Ordner mit Ihrem AWS-Terraform. Es liest Konfiguration und Module offline, baut einen Abhängigkeitsgraphen auf und weist jeder Ressource Klasse und Ziel zu. In AWS oder STACKIT wird nichts aufgerufen.
2. Klassen lesen und Entscheidungen klären
DIRECT- und RECONFIGURE-Einheiten sind Routinearbeit. REPLATFORM-, CONTAINERIZE- und REDESIGN-Einheiten ändern das Programmiermodell. Kopieren Sie decisions-template.yaml, tragen Sie Ihre Antworten ein und führen Sie die Bewertung mit --decisions erneut aus; der neue Bericht zeigt, welche Antworten übernommen wurden und welche Entscheidungen noch offen sind.
3. Das Fundament bauen
Legen Sie Projektstruktur, Netzwerke und Security Groups an. Im Lauf ist das Welle 2, nach der VPC-Einheit.
4. Daten- und Messaging-Dienste bereitstellen
Wenden Sie die Entwürfe für PostgreSQL Flex, Valkey, RabbitMQ, MongoDB Flex und Object Storage an. Sie sind leer, bis Sie die Daten übertragen.
5. Die Daten übertragen
Der Lauf schreibt je zustandsbehafteter Einheit ein Dokument zur Datenübernahme. StackToIT überträgt keine Daten; Ihr Team führt die Befehle nach einer Generalprobe aus.
6. Producer, Consumer und Clients umstellen
Die Cutover-Arbeitspakete des Laufs stellen zuerst die Datenkonsumenten, dann die Clients und danach die Workloads samt Nachrichten-Producern und -Consumern um. Diese Nummerierung als Reihenfolge zu lesen, ist unsere Zusammenfassung; verbindlich sind die Vorgängerschritte, die execution/manual/actions.md für jeden Schritt nennt.
7. Prüfen, Rückweg offenhalten, stilllegen
Führen Sie die Prüfungen aus, halten Sie die Rollback-Grenze fest, behalten Sie die Quelle für die beschlossene Aufbewahrungsdauer und legen Sie sie danach still.
Die Befehle hinter den Schritten
Dies sind die dokumentierten StackToIT-Befehle, jeweils wörtlich zitiert aus der darüber genannten Seite der öffentlichen Dokumentation. Der optionale Schritt discover ergänzt ein schreibgeschütztes AWS-Inventar zum Vergleich mit dem Terraform; explain führt eine Einheit auf ihre Belege zurück; verify prüft einen fertigen Lauf gegen sein Manifest.
stacktoit assess ./aws-terraformstacktoit discover commands
stacktoit discover aws ./aws-terraform-stacktoit --region eu-central-1
stacktoit assess ./aws-terraform ./aws-terraform-stacktoitstacktoit explain ./terraform-stacktoit 'UNIT_ADDRESS'stacktoit verify ./terraform-stacktoitStandardmäßig offline
assess selbst verbindet sich nicht mit einem AWS-Konto. discover aws nutzt Ihre lokalen AWS-CLI-Zugangsdaten und rein lesende Abfragebefehle.
Ein Entwurf ist keine Freigabe
Die Dokumentation sagt es ausdrücklich: Das Vorhandensein eines Terraform-Entwurfs ist keine Freigabe zum Anwenden.
Der Lauf: 12 Ressourcen, 11 Einheiten
Eine für diese Seite geschriebene Umgebung, am 4. November 2026 bewertet: eine VPC mit zwei Subnetzen, eine Security Group, eine EC2-Instanz, eine RDS-PostgreSQL-Datenbank, ein S3-Bucket, eine ElastiCache-Gruppe, eine SQS-Queue, eine Lambda-Funktion und eine DynamoDB-Tabelle. Die Klassen stammen aus der assessment.json; die DB-Subnetzgruppe geht in der Datenbank auf.
| AWS-Einheit | STACKIT-Ziel | Klasse |
|---|---|---|
| aws_vpc.main | Projektnetzwerk, Network Area, wo Netzwerke privat miteinander sprechen müssen | Rekonfigurieren |
| aws_subnet.private_a, private_b | Je ein stackit_network, gleiches IPv4-Präfix | Rekonfigurieren |
| aws_security_group.app | STACKIT Security Group mit Regeln | Rekonfigurieren |
| aws_instance.app | STACKIT-Server, Netzwerkschnittstelle, Volume | Rekonfigurieren |
| aws_db_instance.main (PostgreSQL 16) | PostgreSQL Flex | Replatforming |
| aws_s3_bucket.uploads | Object-Storage-Bucket und Credentials Group | Direkt |
| aws_elasticache_replication_group.sessions | Key Value Store (Valkey) | Rekonfigurieren |
| aws_sqs_queue.jobs | RabbitMQ-Instanz | Replatforming |
| aws_lambda_function.thumbnailer | Cloud-Foundry-Organisation, Handler in einem dauerlaufenden Prozess | Containerisieren |
| aws_dynamodb_table.audit | MongoDB-Flex-Instanz, als Alternative zu einem JSONB-Design | Redesign |
Nach Klassen: 6 RECONFIGURE, 2 REPLATFORM, 1 DIRECT, 1 CONTAINERIZE, 1 REDESIGN, alle mit mittlerer Konfidenz. Bei keiner der 11 Einheiten sind die kritischen Einstellungen schon geschlossen: 5 kommen dorthin, sobald ihre offenen Punkte beantwortet sind, 6 erfordern in diesem Build Handarbeit.
Fundament: Subnetze werden zu Netzwerken
Links die VPC mit ihren zwei Subnetzen. Rechts die beiden stackit_network-Blöcke des Entwurfs, jeweils mit der Kommentarzeile, die die nicht übernommene Availability Zone nennt; die übrigen Kommentarzeilen der Datei sind ausgelassen. STACKIT kennt kein VPC-Containerobjekt; daher bildet das Projekt, in dem der Entwurf angelegt wird, die Grenze der VPC.
resource "aws_vpc" "main" {
cidr_block = "10.30.0.0/16"
}
resource "aws_subnet" "private_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.30.1.0/24"
availability_zone = "eu-central-1a"
}
resource "aws_subnet" "private_b" {
vpc_id = aws_vpc.main.id
cidr_block = "10.30.2.0/24"
availability_zone = "eu-central-1b"
}
# NOT CARRIED (aws_subnet.private_a): availability_zone = eu-central-1a — stackit_network has no availability zone (pinned provider): the network serves the region; servers and volumes choose their zone.
resource "stackit_network" "private_a" {
project_id = var.project_id
name = "private-a"
ipv4_prefix = "10.30.1.0/24"
ipv4_nameservers = var.default_ipv4_nameservers
}
# NOT CARRIED (aws_subnet.private_b): availability_zone = eu-central-1b — stackit_network has no availability zone (pinned provider): the network serves the region; servers and volumes choose their zone.
resource "stackit_network" "private_b" {
project_id = var.project_id
name = "private-b"
ipv4_prefix = "10.30.2.0/24"
ipv4_nameservers = var.default_ipv4_nameservers
}Gleiche Präfixe, keine Zone
Subnetze behalten ihre IPv4-Präfixe; Adresspläne bleiben damit stabil. Die Availability Zone entfällt: Ein STACKIT-Netzwerk bedient die Region, Server und Volumes wählen ihre Zone selbst.
Öffentlich oder privat ist keine Subnetz-Eigenschaft
Auf STACKIT werden Servern öffentliche IP-Adressen explizit zugewiesen. Der Lauf vermerkt, dass sich ausgehender Internetzugang für ein Netzwerk nicht so abschalten lässt, wie er in einem privaten AWS-Subnetz fehlte, und lässt das als offene Entscheidung stehen.
Daten: RDS wird zu PostgreSQL Flex
Links die RDS-Instanz. Rechts die Entwurfsinstanz mit den beiden NOT-CARRIED-Kommentarzeilen, die ihr in der Datei vorangehen; die übrigen Kommentarzeilen sind ausgelassen. Flavor und Speicher werden aus der Quelle abgeleitet: 2.16 steht für 2 vCPU und 16 GiB, den kleinsten Single-Node-Flavor, der db.m6g.large abdeckt. Der Speicher wird von 100 GiB auf 108 aufgerundet, weil STACKIT Gigabyte angibt, ohne die Einheit zu definieren.
resource "aws_db_instance" "main" {
identifier = "app-db"
engine = "postgres"
engine_version = "16.4"
instance_class = "db.m6g.large"
allocated_storage = 100
db_subnet_group_name = aws_db_subnet_group.main.name
username = "app"
manage_master_user_password = true
storage_encrypted = true
backup_retention_period = 7
}# NOT CARRIED (aws_db_instance.main): db_subnet_group_name — stackit_postgresflex_instance has no subnet, availability-zone or IP-family attribute (pinned provider): clients reach the instance at the endpoint STACKIT assigns.
# NOT CARRIED (aws_db_instance.main): manage_master_user_password — the master secret in AWS Secrets Manager (managed master password) is not carried: STACKIT generates the credential (pinned provider) and has no rotation schedule; keep the new one in STACKIT Secrets Manager or the application's own store.
resource "stackit_postgresflex_instance" "main" {
project_id = var.project_id
name = "app-db"
version = "16"
flavor_id = "2.16"
storage = {
class = var.postgresflex_storage_class
size = 108
}
backup_schedule = "0 2 * * *"
network = {
acl = var.relational_database_allowed_cidrs
access_scope = var.relational_database_access_scope == "SNA" ? "SNA" : null
}
retention_days = 32
}Zugangsdaten ändern sich
STACKIT erzeugt das Master-Passwort; die Anwendung erhält das neue. Einen Rotationsplan gibt es nicht zu übernehmen.
Endpunkt statt Subnetz
Die Instanz hat einen eigenen Endpunkt und eine Zugriffsliste; die Platzierung der Quelle in einer Subnetzgruppe wird nicht übernommen. Die Erreichbarkeit ist eine Entscheidung.
Instanzschutz einschalten
Die PostgreSQL-Flex-Dokumentation von STACKIT warnt: In API v3 führt das Löschen einer Instanz ohne aktiven Instanzschutz zu sofortigem, endgültigem Datenverlust. Aktivieren Sie den Schutz, bevor die Datenbank Produktionsdaten hält.
Die vom Lauf vorgeschlagene Reihenfolge
Wellen werden aus Abhängigkeiten berechnet. Einheiten derselben Welle können parallel umziehen; der Lauf nennt das einen Ausgangspunkt für Ihren Plan, keinen Terminplan.
| Welle | Einheiten | Warum hier |
|---|---|---|
| 1 | VPC, S3-Bucket, ElastiCache-Gruppe, SQS-Queue, Lambda-Funktion, DynamoDB-Tabelle | Sie hängen von keiner anderen Einheit der Umgebung ab |
| 2 | Security Group, beide Subnetze | Sie hängen von der VPC ab |
| 3 | RDS-Instanz, EC2-Instanz | Sie hängen von den Subnetzen ab |
Das Ausführungspaket enthält 24 automatisierte Schritte (18 Ressourcenblöcke und 6 API-Aufrufe) und 102 manuelle Schritte in 33 Arbeitspaketen. Von den 24 automatisierten Schritten sind 19 frei von Entscheidungen und manuellen Voraussetzungen, warten aber noch auf Werte wie project_id.
Entscheidungen Ihrer Architekten
Das Register dieses Laufs führt 26 Einträge. Diese haben die größte Wirkung.
DynamoDB
Auf STACKIT gibt es keinen DynamoDB-kompatiblen Dienst. Der Entwurf schlägt eine MongoDB-Flex-Instanz vor, den verwalteten MongoDB-Dienst von STACKIT, mit je einer Collection pro Tabelle; relationales JSONB auf PostgreSQL Flex ist die andere Option. In beiden Fällen wird die Zugriffsschicht neu geschrieben; Schlüsseldesign, Kapazitätsmodi und bedingte Schreibvorgänge lassen sich nicht übernehmen.
Lambda
Der Lauf vermerkt, dass STACKIT keinen allgemein verfügbaren Functions-Dienst hat. Der Handler läuft in einem dauerhaft laufenden Prozess: als Cloud-Foundry-App oder in einem Container. Das Ausführungsmodell wechselt von der Ausführung pro Aufruf zum Dauerbetrieb.
Boot-Image
Eine AMI wird durch ein STACKIT-Image ersetzt, das Sie wählen. Bis das beantwortet ist, warten Konnektivitätsprüfung und Cutover-Schritte.
Egress und Endpunkte
Der Entwurf hält ausgehenden Verkehr geschlossen und stellt die Datenbanken über einen öffentlichen, per Zugriffsliste beschränkten Endpunkt bereit; beides sind Vorgaben, die Sie bestätigen oder ersetzen. Füllen Sie die Zugriffslisten selbst: Laut RabbitMQ-Dokumentation von STACKIT erhält ein neuer Datendienst eine Standard-Zugriffsliste, die STACKIT-IP-Bereiche enthält.
Verfahren für den Datenumzug
Dump und Restore oder logische Replikation für PostgreSQL, Sync-Werkzeuge für Buckets. Die richtige Wahl hängt von Datenmenge und Schreibstopp-Fenster ab, die nicht im Terraform-Code stehen.
Fragen, die Architekten zuerst stellen
Wo fange ich an?
Mit einer Bewertung Ihres Terraform-Codes. Sie liest den Ordner Ihrer AWS-Konfiguration und schreibt Bericht, Entwurf und Plan. Lesen Sie zuerst index.html, dann die Klassen in der assessment.json.
Ändert StackToIT etwas in AWS oder STACKIT?
Nein. assess liest Dateien und schreibt Dateien. Die erzeugten Skripte und den Terraform-Entwurf wendet eine Person an.
Was, wenn meine Umgebung nicht in Terraform liegt?
Der dokumentierte, optionale Schritt discover sammelt mit Ihren lokalen CLI-Zugangsdaten ein schreibgeschütztes AWS-Inventar zum Abgleich mit dem Terraform. Er ergänzt die Terraform-Eingabe, ersetzt sie aber nicht.
Welche Dienste sind am schwersten zu migrieren?
Die ohne gleichwertiges Ziel: in diesem Lauf DynamoDB (REDESIGN) und Lambda (CONTAINERIZE). Queues und verwaltete Datenbanken sind Replatforming: gleicher Zweck, andere API oder anderes Release.
Woran erkenne ich, dass die Migration abgeschlossen ist?
Wenn die Prüfungen des Plans bestanden sind, die Rollback-Grenze festgehalten ist und die Quelle nach der beschlossenen Aufbewahrungsdauer stillgelegt wurde. Der Lauf führt diese Prüfungen je Einheit in execution/verify/checks.md auf.
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.