AWS → STACKIT · ARCHITECTUUR

Van een AWS landing zone naar een STACKIT-organisatie

Een AWS landing zone bestaat uit accounts, organisatie-eenheden, service control policies, een gedeeld netwerk en een audittrail. STACKIT biedt een organisatie, folders, projecten en een network area, maar geen laag om policies aan te koppelen. StackToIT beoordeelde een compacte landing zone: de helft kon naar Terraform worden vertaald, de andere helft kwam terug als ontwerpwerk voor uw architecten.

Drie manieren om de organisatie in te richten

De vraag is hoeveel van de accountgrens u wilt behouden. De run behandelt de AWS-organisatie, de organisatie-eenheden en de accounts als ontwerpwerk, niet als resources om te kopiëren.

IndelingZo wordt het gekoppeldAfweging
Eén organisatie, folders, één project per accountEen organisatie-eenheid wordt een folder; een account wordt een project. Dit is de vergelijkbare groepering die de run voorstelt.Het dichtst bij de AWS-opzet. De run merkt op dat een project geen aparte grens voor account, facturatie en IAM is. Het toegangsbeleid richt u daarom opnieuw in; het wordt niet overgenomen.
Een aparte organisatie voor accounts die harde isolatie nodig hebbenDe run noemt dit voor accounts die echt geïsoleerd moeten zijn van de rest.Sterkste scheiding, maar een tweede organisatie betekent eigen rollen, een eigen network area en een tweede plek om te beheren.
Eén project met meerdere netwerkenElk subnet wordt een netwerk in één project; het project is de grens van de VPC.Het eenvoudigst voor een omgeving met één VPC. Security groups gelden voor het hele project. De scheiding tussen lagen houdt u dus in stand met groepen, niet met accounts.

Resource Manager-rollen beheren de hiërarchie en geven volgens de documentatie van STACKIT geen toegang tot cloudresources binnen een project. Plan de rolbindingen per project expliciet.

Wat de run van elke landing zone-resource maakte

Elf eenheden: 1 DIRECT, 5 RECONFIGURE, 5 REDESIGN. Vijf zijn als Terraform opgesteld, één heeft geen resource nodig en vijf zijn overgelaten aan een architect.

AWS-resourceSTACKIT-doelKlasse en zekerheidsniveau
aws_organizations_organizationGeen: de organisatie wordt niet door de provider aangemaakt; rollen worden ontworpen op organisatie, folders en projectenREDESIGN, MEDIUM
aws_organizations_organizational_unitResource Manager-folder, een groeperingsniveau zonder policykoppelingREDESIGN, LOW
aws_organizations_accountResource Manager-project, een vergelijkbaar containerniveauREDESIGN, LOW
aws_organizations_policy (service control)Niet beheerd: policy as code in de deliverypipelineREDESIGN, LOW
aws_vpc en aws_subnetNetwerken in het projectRECONFIGURE, MEDIUM
aws_ec2_transit_gatewayNetwork area en network area regionRECONFIGURE, MEDIUM
aws_kms_keyKMS-keyring en -sleutelRECONFIGURE, MEDIUM
aws_s3_bucket (trail)Object Storage-bucketDIRECT, MEDIUM
aws_cloudtrail (organisatietrail)Telemetry Router-instance met een Object Storage-bestemmingRECONFIGURE, MEDIUM
aws_guardduty_detectorGeen: detectie wordt opnieuw ontworpen op Audit Log en Logs, met een SIEM of een tool van een derde partijREDESIGN, MEDIUM

De koppeling noemt Resource Manager-folders en -projecten, maar het concept schrijft er geen blok voor. Het bestand met landing zone-vereisten van de run vermeldt beide als gekoppeld en niet aangemaakt.

Hubnetwerk en transit gateway

Invoer die voor deze pagina is geschreven en op 4 november 2026 is beoordeeld. Links: een VPC, een subnet en een transit gateway. Rechts: de network area, de regio-instellingen en het netwerk dat de engine heeft opgesteld, zonder de reviewcommentaren boven elk blok.

Voorbeeldinvoermain.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 van 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
  }
}
  • Het project is de VPC-grens

    Er is geen VPC-container. Het subnet werd een netwerk in het project en de transit gateway werd een network area die privé routeert tussen netwerken van de organisatie.

  • Voor scheiding zijn security groups nodig

    Netwerken in één area bereiken elkaar en de area kent geen object per koppeling. Een VPC die in AWS niet was verbonden, kan zijn buur bereiken zodra beide in de area zitten.

  • Waarden die u aanlevert

    De adresbereiken van de area en het transfernetwerk zijn variabelen, omdat de bron ze niet vermeldt.

Encryptiesleutel en organisatietrail

De sleutel en de trail zijn opgesteld; de aansluiting van de auditstream niet. Eerste paneel: de sleutel, de trailbucket en de trail. Daarna het sleutelblok uit terraform/security.tf en de routerblokken uit terraform/observability.tf, zonder de reviewcommentaren boven elk blok. De S3-bestemming neemt zijn endpoint en toegangssleutel als variabelen.

Voorbeeldinvoermain.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 van 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 van 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
      }
    }
  }
}
  • Rotatie wordt niet overgenomen

    De providerdocumentatie noemt geen rotatieattribuut voor stackit_kms_key, dus rotatie wordt een operationeel proces.

  • De scope van de trail is een koppeling, geen vlag

    is_organization_trail heeft geen tegenhanger. Een medewerker koppelt de STACKIT-organisatie, folder of het project met een aparte resource aan de router; het concept schrijft die resource niet.

  • De router verwerkt het Audit Log van STACKIT

    Hij levert de auditgebeurtenissen van STACKIT-producten. Volgens de documentatie van STACKIT wordt beheeractiviteit standaard vastgelegd en 90 dagen in het portaal getoond; via routering bewaart u die langer.

  • De scope van de sleutel bepaalt u zelf

    access_scope komt uit een variabele zonder standaardwaarde. De providerdocumentatie geeft PUBLIC als standaard van het attribuut, waardoor de sleutel bereikbaar is op het publieke KMS-endpoint; SNA houdt hem alleen bereikbaar via de network area.

De structuur die het concept aan u overlaat

Deze blokken leverden geen Terraform op. De organisatie-eenheid, het account en de policy kwamen elk terug als REDESIGN met een reden, omdat hun werking in beleid en mensen zit, niet in een resource. De policykoppeling wordt beoordeeld als onderdeel van de policy-eenheid.

Voorbeeldinvoermain.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
}

Zo beslist u

  1. Tel de echte grenzen

    Som de accounts op en vraag wat elk ervan scheidt: facturatie, identiteit, de reikwijdte van een incident of een toezichthouder. Een project dekt een deel hiervan; een aparte organisatie dekt meer.

  2. Verplaats guardrails naar de pipeline

    Een AWS service control policy beperkt wat rollen mogen doen en verleent niets. Op STACKIT wordt dezelfde bedoeling een reeks controles in de pipeline die Terraform toepast, plus zorgvuldig rolontwerp.

  3. Beslis vroeg over de network area

    Bereiken en het transfernetwerk mogen geen bijzaak zijn. Volgens de documentatie van de STACKIT-provider maakt u een project in een network area aan door het label networkArea in te stellen, en is dit niet meer te wijzigen nadat het project is aangemaakt.

  4. Leg de auditscope expliciet vast

    Noteer of de trail één account, alle regio's of de hele organisatie dekte en koppel dan de overeenkomende STACKIT-scope aan de router.

  5. Plan detectie apart

    GuardDuty heeft geen managed tegenhanger in de provider die de run gebruikte. Bepaal welke tool Audit Log en Logs uitleest.

Vragen van architecten

Is een STACKIT-project gelijk aan een AWS-account?

Niet precies. De run koppelt een account aan een project als vergelijkbaar containerniveau en meldt dat een project geen gelijkwaardige grens voor account, facturatie en IAM is. Toegang wordt per project gebonden.

Kan ik mijn service control policies behouden?

In de gebruikte providerversie is er geen managed policylaag. De run stelt policy as code in de pipeline voor, plus rolontwerp op de organisatie, folders en projecten.

Wat vervangt de transit gateway?

Een network area. Projecten in de area zijn verbonden via een intern transfernetwerk en routeringstabellen worden automatisch bijgewerkt. Verkeer tussen regio's gaat volgens de documentatie van STACKIT momenteel over het publieke internet.

Maakt StackToIT de folders en projecten aan?

Nee. De run vermeldt ze als gekoppelde doelen zonder blok in het concept. Uw team maakt ze aan en stelt op elk project het area-label in.

Bronnen

Uw volgende stap: STACKIT.

Vertel ons over uw omgeving, dan laten wij zien wat StackToIT daarvoor oplevert: doelarchitectuur, Terraform-artefacten en een gestructureerd migratieplan.

Laat uw gegevens achter, onze specialisten nemen contact met u op.

Liever zelf een e-mail sturen? connect@stacktoit.com

Wij gebruiken uw gegevens alleen om dit verzoek te beantwoorden en een mogelijke pilot te bespreken. Privacyverklaring