AWS → STACKIT · ARCHITEKTUR

Von der AWS Landing Zone zur STACKIT-Organisation

Eine AWS Landing Zone besteht aus Accounts, Organizational Units, Service Control Policies, einem gemeinsamen Netzwerk und einem Audit-Trail. STACKIT bietet Organisation, Ordner, Projekte und eine Network Area, aber keine Schicht für angehängte Richtlinien. StackToIT hat eine kompakte Landing Zone bewertet: Die Hälfte ließ sich auf Terraform abbilden, die andere Hälfte kam als Designarbeit für Ihre Architekten zurück.

Drei Wege, die Organisation zu gliedern

Die Frage ist, wie viel der Account-Grenze Sie erhalten müssen. Der Lauf behandelt die AWS-Organisation, ihre Organizational Units und ihre Accounts als Designarbeit, nicht als Ressourcen zum Kopieren.

AufbauZuordnungAbwägung
Eine Organisation, Ordner, ein Projekt je AccountEine Organizational Unit wird zum Ordner, ein Account zum Projekt. Das ist die vergleichbare Gruppierung, die der Lauf vorschlägt.Kommt dem AWS-Aufbau am nächsten. Der Lauf hält fest, dass ein Projekt keine eigene Account-, Abrechnungs- und IAM-Grenze ist; daher wird die Zugriffsrichtlinie neu angelegt, nicht kopiert.
Eigene Organisation für Accounts mit harter IsolationDer Lauf nennt diese Option für Accounts, die echte Trennung vom Rest brauchen.Stärkste Trennung, aber eine zweite Organisation bedeutet eigene Rollen, eine eigene Network Area und einen zweiten Ort zur Administration.
Ein Projekt mit mehreren NetzwerkenJedes Subnetz wird zu einem Netzwerk in einem Projekt; das Projekt ist die Grenze der VPC.Am einfachsten für eine Umgebung mit einer VPC. Security Groups gelten projektweit; daher wird die Trennung zwischen Schichten über Gruppen gehalten, nicht über Accounts.

Rollen des Resource Managers verwalten die Hierarchie und gewähren laut STACKIT-Dokumentation keinen Zugriff auf Cloud-Ressourcen im Projekt. Planen Sie die Rollenbindungen je Projekt ausdrücklich.

Was der Lauf aus jeder Landing-Zone-Ressource machte

Elf Einheiten: 1 DIRECT, 5 RECONFIGURE, 5 REDESIGN. Fünf wurden in Terraform entworfen, eine braucht keine Ressource, fünf bleiben Ihren Architekten überlassen.

AWS-RessourceSTACKIT-ZielKlasse und Konfidenz
aws_organizations_organizationKeines: Die Organisation legt der Provider nicht an; Rollen werden auf Organisation, Ordnern und Projekten entworfenREDESIGN, MEDIUM
aws_organizations_organizational_unitResource-Manager-Ordner, eine Gruppierungsebene ohne angehängte RichtlinienREDESIGN, LOW
aws_organizations_accountResource-Manager-Projekt, eine vergleichbare Container-EbeneREDESIGN, LOW
aws_organizations_policy (Service Control)Keines verwaltet: Policy as Code in der Delivery-PipelineREDESIGN, LOW
aws_vpc und aws_subnetNetzwerke im ProjektRECONFIGURE, MEDIUM
aws_ec2_transit_gatewayNetwork Area und Network-Area-RegionRECONFIGURE, MEDIUM
aws_kms_keyKMS-Keyring und SchlüsselRECONFIGURE, MEDIUM
aws_s3_bucket (Trail)Object-Storage-BucketDIRECT, MEDIUM
aws_cloudtrail (Organisations-Trail)Telemetry-Router-Instanz mit Object-Storage-ZielRECONFIGURE, MEDIUM
aws_guardduty_detectorKeines: Die Bedrohungserkennung wird auf Audit Log und Logs mit SIEM oder Drittwerkzeug neu entworfenREDESIGN, MEDIUM

Die Zuordnung nennt Resource-Manager-Ordner und -Projekte, doch der Entwurf schreibt dafür keinen Block. Die Datei mit den Landing-Zone-Anforderungen des Laufs führt beide als zugeordnet und nicht angelegt.

Hub-Netzwerk und Transit Gateway

Eingabe für diese Seite geschrieben und am 4. November 2026 bewertet. Links VPC, Subnetz und Transit Gateway, rechts Network Area, deren Regionseinstellungen und das Netzwerk, das die Engine entwarf, ohne die Prüfkommentare über den Blöcken.

Beispieleingabemain.tf
resource "aws_vpc" "hub" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "hub_a" {
  vpc_id            = aws_vpc.hub.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "eu-central-1a"
}

resource "aws_ec2_transit_gateway" "hub" {
  description = "shared hub"
}

resource "aws_ec2_transit_gateway_vpc_attachment" "hub" {
  transit_gateway_id = aws_ec2_transit_gateway.hub.id
  vpc_id             = aws_vpc.hub.id
  subnet_ids         = [aws_subnet.hub_a.id]
}
STACKIT-Terraform von StackToITterraform/network.tf
resource "stackit_network" "hub_a" {
  project_id       = var.project_id
  name             = "hub-a"
  ipv4_prefix      = "10.0.1.0/24"
  ipv4_nameservers = var.default_ipv4_nameservers
}

resource "stackit_network_area" "migrated" {
  organization_id = var.organization_id
  name            = "migrated-network-area"
}

resource "stackit_network_area_region" "migrated" {
  organization_id = var.organization_id
  network_area_id = stackit_network_area.migrated.network_area_id
  ipv4 = {
    network_ranges   = [for p in var.network_area_ranges : { prefix = p }]
    transfer_network = var.network_area_transfer_network
  }
}
  • Das Projekt ist die VPC-Grenze

    Einen VPC-Container gibt es nicht. Das Subnetz wurde zu einem Netzwerk im Projekt, das Transit Gateway zu einer Network Area, die zwischen Netzwerken der Organisation privat routet.

  • Trennung braucht Security Groups

    Netzwerke einer Area erreichen einander, und die Area hat kein eigenes Objekt je Anbindung. Eine VPC, die in AWS nicht verbunden war, erreicht ihren Nachbarn, sobald beide in der Area liegen.

  • Werte, die Sie liefern

    Adressbereiche der Area und Transfernetz sind Variablen, weil die Quelle sie nicht nennt.

Verschlüsselungsschlüssel und Organisations-Trail

Schlüssel und Trail werden entworfen, die Anbindung des Audit-Stroms nicht. Erster Bereich: Schlüssel, Trail-Bucket und Trail. Danach der Schlüsselblock aus terraform/security.tf und die Router-Blöcke aus terraform/observability.tf, jeweils ohne die Prüfkommentare über den Blöcken. Das S3-Ziel erhält Endpunkt und Zugriffsschlüssel als Variablen.

Beispieleingabemain.tf
resource "aws_kms_key" "logs" {
  description         = "log archive key"
  enable_key_rotation = true
}

resource "aws_s3_bucket" "trail" {
  bucket = "acme-org-trail"
}

resource "aws_cloudtrail" "org" {
  name                  = "org-trail"
  s3_bucket_name        = aws_s3_bucket.trail.id
  is_organization_trail = true
  kms_key_id            = aws_kms_key.logs.arn
}
STACKIT-Terraform von StackToITterraform/security.tf
resource "stackit_kms_key" "logs" {
  project_id   = var.project_id
  keyring_id   = stackit_kms_keyring.migrated.keyring_id
  display_name = "log-archive-key"
  algorithm    = "aes_256_gcm"
  purpose      = "symmetric_encrypt_decrypt"
  protection   = var.kms_protection
  access_scope = var.kms_access_scope == "SNA" ? "SNA" : null
}
STACKIT-Terraform von StackToITterraform/observability.tf
resource "stackit_telemetryrouter_instance" "migrated" {
  project_id   = var.project_id
  display_name = "migrated-telemetry-router"
}

resource "stackit_telemetryrouter_destination" "org" {
  project_id   = var.project_id
  instance_id  = stackit_telemetryrouter_instance.migrated.instance_id
  display_name = "org-trail"
  config = {
    config_type = "S3"
    s3 = {
      bucket   = stackit_objectstorage_bucket.trail.name
      endpoint = var.trail_org_s3_endpoint
      access_key = {
        id     = var.trail_org_s3_access_key_id
        secret = var.trail_org_s3_secret_access_key
      }
    }
  }
}
  • Rotation wird nicht übernommen

    Die Provider-Dokumentation nennt für stackit_kms_key kein Rotationsattribut; daher wird Rotation zum betrieblichen Prozess.

  • Der Trail-Umfang ist ein Link, kein Schalter

    is_organization_trail hat kein Gegenstück. Eine Person verbindet Organisation, Ordner oder Projekt von STACKIT mit dem Router über eine eigene Ressource, die der Entwurf nicht schreibt.

  • Der Router bedient das Audit Log von STACKIT

    Er liefert die Audit-Ereignisse von STACKIT-Produkten. Laut STACKIT-Dokumentation wird Admin-Aktivität standardmäßig aufgezeichnet und 90 Tage im Portal angezeigt; wer länger aufbewahren will, routet sie weiter.

  • Den Schlüsselzugriff wählen Sie

    access_scope stammt aus einer Variablen ohne Standardwert. Laut Provider-Dokumentation ist PUBLIC der Standardwert des Attributs, womit der Schlüssel über den öffentlichen KMS-Endpunkt erreichbar ist; mit SNA bleibt er nur über die Network Area erreichbar.

Die Struktur, die der Entwurf Ihnen überlässt

Diese Blöcke erzeugten kein Terraform. Organizational Unit, Account und Richtlinie kamen jeweils als REDESIGN mit Begründung zurück, weil ihre Wirkung in Richtlinien und Zuständigkeiten liegt, nicht in einer Ressource. Das Anhängen der Richtlinie bewertet der Lauf als Teil der Richtlinien-Einheit.

Beispieleingabemain.tf
resource "aws_organizations_organizational_unit" "workloads" {
  name      = "workloads"
  parent_id = aws_organizations_organization.main.roots[0].id
}

resource "aws_organizations_account" "prod" {
  name      = "acme-prod"
  email     = "aws-prod@example.com"
  parent_id = aws_organizations_organizational_unit.workloads.id
}

resource "aws_organizations_policy" "deny_regions" {
  name = "deny-non-eu-regions"
  type = "SERVICE_CONTROL_POLICY"
  content = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect    = "Deny"
      Action    = "*"
      Resource  = "*"
      Condition = { StringNotEquals = { "aws:RequestedRegion" = ["eu-central-1", "eu-west-1"] } }
    }]
  })
}

resource "aws_organizations_policy_attachment" "workloads" {
  policy_id = aws_organizations_policy.deny_regions.id
  target_id = aws_organizations_organizational_unit.workloads.id
}

So entscheiden Sie

  1. Echte Grenzen zählen

    Listen Sie die Accounts und fragen Sie, was jeder trennt: Abrechnung, Identität, Auswirkungsradius, regulatorische Vorgaben. Ein Projekt deckt manches davon ab, eine eigene Organisation mehr.

  2. Leitplanken in die Pipeline verlegen

    Eine AWS Service Control Policy begrenzt, was Rollen dürfen, und gewährt nichts. Auf STACKIT wird dieselbe Absicht zu Prüfungen in der Pipeline, die Terraform anwendet, ergänzt um ein sorgfältiges Rollenkonzept.

  3. Network Area früh festlegen

    Adressbereiche und Transfernetz sind kein Nachgedanke: Laut Dokumentation des STACKIT-Providers wird ein Projekt über das Label networkArea in einer Network Area angelegt, und das lässt sich nach dem Anlegen des Projekts nicht mehr ändern.

  4. Audit-Umfang explizit halten

    Notieren Sie, ob der Trail einen Account, alle Regionen oder die ganze Organisation abdeckte, und verbinden Sie den passenden STACKIT-Umfang mit dem Router.

  5. Bedrohungserkennung getrennt planen

    GuardDuty hat im Provider des Laufs kein verwaltetes Gegenstück. Entscheiden Sie, welches Werkzeug Audit Log und Logs liest.

Fragen, die Architekten stellen

Entspricht ein STACKIT-Projekt einem AWS-Account?

Nicht genau. Der Lauf ordnet einen Account einem Projekt als vergleichbarer Container-Ebene zu und hält fest, dass ein Projekt keine gleichwertige Account-, Abrechnungs- und IAM-Grenze ist. Zugriff wird je Projekt gebunden.

Kann ich meine Service Control Policies behalten?

Im verwendeten Providerstand gibt es keine verwaltete Richtlinienschicht. Der Lauf schlägt Policy as Code in der Pipeline und Rollendesign auf Organisation, Ordnern und Projekten vor.

Was ersetzt das Transit Gateway?

Eine Network Area. Projekte der Area verbinden sich über ein internes Transfernetz, Routingtabellen aktualisieren sich automatisch. Verkehr zwischen Regionen läuft laut STACKIT-Dokumentation derzeit über das öffentliche Internet.

Legt StackToIT Ordner und Projekte an?

Nein. Der Lauf führt sie als zugeordnete Ziele ohne Block im Entwurf. Ihr Team legt sie an und setzt das Area-Label je Projekt.

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.