CLOUDMIGRATIE · INVENTARISATIE

Cloudmigratie-inventarisatie: de infrastructuurinventaris opbouwen

Een migratieplan is zo goed als zijn inventaris. In plaats van een spreadsheet met schermafbeeldingen van de console bouwt StackToIT de inventaris uit de code die de omgeving definieert: wat bestaat, wat kan bestaan, tot welke module het behoort, wat van wat afhangt en welke services data bevatten. Deze gids toont de inventaris die een echte run voor een kleine omgeving opleverde.

Wat bestaat, en wat alleen kan bestaan

Een demo-omgeving die voor deze gids is geschreven en op 4 november 2026 door StackToIT is beoordeeld: een database, een wachtrij, een map met buckets, een optionele replica en een module. Links: de regels van de invoer die het bestaan onzeker maken. Rechts: de volledige lijst summary.conditional_units uit assessment.json, opgemaakt voor de leesbaarheid omdat het bestand uit één regel bestaat; er is geen veld weggelaten.

Voorbeeldinvoermain.tf
variable "enable_replica" {
  type    = bool
  default = false
}

resource "aws_s3_bucket" "data" {
  for_each = var.buckets
  bucket   = "acme-${each.key}-${data.aws_caller_identity.current.account_id}"
}

resource "aws_db_instance" "orders_replica" {
  count               = var.enable_replica ? 1 : 0
  identifier          = "orders-replica"
  replicate_source_db = aws_db_instance.orders.identifier
  instance_class      = "db.m6g.large"
  skip_final_snapshot = true
}
StackToIT-assessmentassessment.json · summary.conditional_units
[
  {
    "id": "aws_db_instance.orders_replica",
    "source_type": "aws_db_instance",
    "presence_cause": {
      "kind": "root-variable-overridable",
      "where": "count",
      "expr": "var.enable_replica ? 1 : 0",
      "variables": [
        "var.enable_replica"
      ]
    },
    "would_be_class": "MANUAL_REVIEW",
    "would_be_confidence": "LOW",
    "state": "DISABLED_ON_DEFAULTS_BUT_OVERRIDABLE",
    "state_inputs": [
      "var.enable_replica"
    ],
    "overridden_by": [
      "-var-file",
      "-var",
      "TF_VAR_enable_replica"
    ]
  },
  {
    "id": "aws_s3_bucket.data",
    "source_type": "aws_s3_bucket",
    "presence_cause": {
      "kind": "root-variable-overridable",
      "where": "for_each",
      "expr": "var.buckets",
      "variables": [
        "var.buckets"
      ]
    },
    "would_be_class": "DIRECT",
    "would_be_confidence": "MEDIUM",
    "target": "STACKIT Object Storage",
    "state": "PRESENT_ON_DEFAULTS",
    "state_inputs": [
      "var.buckets"
    ],
    "overridden_by": [
      "-var-file",
      "-var",
      "TF_VAR_buckets"
    ]
  }
]
  • Een telling van nul is een antwoord

    De replica heeft count = var.enable_replica ? 1 : 0. Staat de variabele op de standaardwaarde, dan is de replica uitgeschakeld. De run noemt de replica dan voorwaardelijk, vermeldt dat een variabele die kan inschakelen en bewaart de klasse die de replica zou krijgen, MANUAL_REVIEW, ernaast.

  • Een map met buckets is een aantal buckets

    De for_each over var.buckets maakt één bucket per sleutel. De run legt de eenheid vast als aanwezig op de standaardwaarden, met twee instances, en de variabele die het aantal bepaalt. Een ander variabelenbestand wijzigt de inventaris, dus geef het bestand mee dat uw pipeline gebruikt.

  • Niets valt stilzwijgend weg

    Eenheden die uit staan, onbeslist zijn of pas tijdens de planfase worden bepaald, worden geteld en genoemd. Zo voorkomt een inventaris de gebruikelijke fout dat alleen wordt opgesomd wat vandaag draait en wordt vergeten wat een schakelaar morgen binnenhaalt.

De inventaris in cijfers en in volgorde van afhankelijkheid

Uit dezelfde run. Links: het scanoverzicht dat de engine toont. Rechts: de eerste rijen van migration/waves.csv, dat de eenheden ordent op afhankelijkheid.

Consoleoverzichtconsole.txt
────────────────────────────────────────────
Source:                 input
Source files:           2
Resources scanned:      11  (8 in the root module · 3 inside 1 module call)
  support resources:    1  (+0 Terraform helpers, out of scope; 1 + 0 = the 1 support node of summary.support.nodes in assessment.json)
Migration units:        7 known-present (7 instances) · 2 conditional
Unit dependencies:      6
Modules:                1 module call (0 external, 1 local): 1 loaded, 0 not downloaded, 0 invalid
  module.worker  ./modules/queue_worker  2 units (RECONFIGURE 1 · REDESIGN 1) · 3 resources
Source checks:          Built-in source checks passed — OpenTofu validation of the source was not run
Source completeness:    RUNTIME_TOPOLOGY_PARTIAL — 2 unit(s) have a count/for_each that is not known statically; whether and how often they exist is decided at plan time
Volgorde van afhankelijkheidmigration/waves.csv
wave,wave_state,unit,type,module_call,presence,class,confidence,application,application_status,proposed_group
1,MEMBER,aws_sqs_queue.jobs,aws_sqs_queue,,KNOWN_PRESENT,REPLATFORM,MEDIUM,,PROPOSED,jobs-worker
1,MEMBER,aws_vpc.main,aws_vpc,,KNOWN_PRESENT,RECONFIGURE,MEDIUM,,UNASSIGNED,
1,MEMBER,module.worker.aws_cloudwatch_log_group.worker,aws_cloudwatch_log_group,module.worker,KNOWN_PRESENT,RECONFIGURE,MEDIUM,,UNASSIGNED,
2,MEMBER,aws_subnet.db_a,aws_subnet,,KNOWN_PRESENT,RECONFIGURE,MEDIUM,,UNASSIGNED,
2,MEMBER,aws_subnet.db_b,aws_subnet,,KNOWN_PRESENT,RECONFIGURE,MEDIUM,,UNASSIGNED,
2,MEMBER,module.worker.aws_lambda_function.worker,aws_lambda_function,module.worker,KNOWN_PRESENT,REDESIGN,LOW,,PROPOSED,jobs-worker
3,MEMBER,aws_db_instance.orders,aws_db_instance,,KNOWN_PRESENT,REPLATFORM,MEDIUM,,UNASSIGNED,
0,NOT_A_MEMBER,aws_db_instance.orders_replica,aws_db_instance,,CONDITIONAL,MANUAL_REVIEW,LOW,,UNASSIGNED,
0,NOT_A_MEMBER,aws_s3_bucket.data,aws_s3_bucket,,CONDITIONAL,DIRECT,MEDIUM,,UNASSIGNED,
  • Resources en eenheden zijn verschillende aantallen

    Elf resources leveren negen eenheden op: zeven waarvan bekend is dat ze aanwezig zijn en twee voorwaardelijke. De andere twee zijn te verklaren: de DB subnet group is de ene ondersteunende resource die de console noemt, en assessment.json neemt de Lambda event-source mapping op in de eenheid van de functie, als onderdeel ervan. De drie resources van de module-aanroep zijn meegeteld met de resources van de root.

  • De module hoort bij de inventaris

    De lokale module queue_worker wordt geladen, de drie resources ervan worden toegeschreven aan module.worker en de eenheden zitten in dezelfde golven als die van de root. Een module die niet kan worden opgehaald, wordt gemeld als niet gedownload en nooit stilzwijgend overgeslagen.

  • Golven zijn een volgorde, geen planning

    Golf 1 bevat wat van niets afhangt, golf 3 de database die beide subnets nodig heeft. De eenheden die pas bestaan wanneer OpenTofu plant, hebben nog geen golf. Zo geeft de run aan wat hij niet kan plaatsen.

Waar de data staat

Het nuttigste deel van een inventaris voor een migratielead is de lijst met services die data bevatten. De run schrijft die als migration/data-movement.md. Dit zijn de eerste regels ervan voor de demo-omgeving.

Eenheden met datamigration/data-movement.md
## Stateful source units

| Unit | Source service | Target service | Application | Mechanism | State | Data class | RPO | Downtime tolerance |
|---|---|---|---|---|---|---|---|---|
| aws_db_instance.orders | aws_db_instance | STACKIT PostgreSQL Flex |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
| aws_db_instance.orders_replica | aws_db_instance | NO_TARGET_PROPOSED |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
| aws_s3_bucket.data | aws_s3_bucket | STACKIT Object Storage |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
  • Stateful eenheden worden genoemd, niet verplaatst

    Drie eenheden bevatten data: de database, de replica en de map met buckets. StackToIT verplaatst nooit data; het geeft aan dat iemand voor elk een mechanisme moet kiezen. De allocated_storage = 200 van de database wordt getoond als ingerichte capaciteit, niet als omvang van de data.

  • Wat de code niet kan zeggen, blijft leeg

    Dataklasse, RPO en toegestane downtime staan op NOT_PROVIDED. RPO en toegestane downtime zijn waarden die u in het applicatiebestand schrijft; de dataklasse komt van de data-eigenaar. Een leeg veld is eerlijker dan een verzonnen standaardwaarde.

Welke vraag waar wordt beantwoord

InventarisatievraagBestand van de runWat het bevat
Wat bestaat er nu?assessment.jsonElke eenheid met klasse, zekerheidsniveau, doel, reden en bronregel
Wat kan er bestaan?assessment.json (voorwaardelijke eenheden)Count- en for_each-expressies, de variabelen die ze bepalen, de toestand op de standaardwaarden
Wat hoort bij welke module?assessment.json, migration/technical-sequencing.mdModule-aanroepen, hoe elke is geladen, eenheden per module en golf
Wat hangt van wat af?migration/waves.csv, architecture/dependencies.mmdVolgorde van afhankelijkheid en de graaf erachter
Waar staat de data?migration/data-movement.mdStateful eenheden, doelservice, ingerichte capaciteit, openstaande datavragen
Wat is nog onbekend?decisions.json, migration/prerequisites.mdBeslissingen, standaardwaarden om te bevestigen en eenheden die op een antwoord wachten

Bestandsnamen zoals de run ze schrijft.

Een inventarisatie-aanpak die standhoudt

Algemene praktijk, opgebouwd rond de bovenstaande bestanden.

  1. 1 · Kies de rootmodules die ertoe doen

    Richt de engine op de map die de infrastructuur declareert, niet op een submap van een grotere configuratie. Bewaar het lockbestand en de variabelenbestanden die uw pipeline gebruikt.

  2. 2 · Draai het waar de code staat

    Een standaardassessment draait op uw machine en uploadt de repository niet. Voeg --offline toe als de machine geen netwerk heeft; ontbrekende modules worden dan als ontbrekend gemeld.

  3. 3 · Lees eerst de aantallen

    Resources, eenheden, modules, voorwaardelijke eenheden en volledigheid van de bron vertellen u of de inventaris compleet of gedeeltelijk is, nog voordat u één rij leest.

  4. 4 · Los de voorwaardelijke eenheden op

    Bepaal de variabelen die resources in- of uitschakelen, of geef een variabelenbestand mee, en draai opnieuw. Elke voorwaardelijke eenheid is een vraag aan de platformeigenaar.

  5. 5 · Voeg toe wat code niet kan weten

    Lever applicaties, eigenaren, RTO, RPO en toegestane downtime aan en haal de dataklasse bij de data-eigenaar. Het applicatiebestand groepeert resources tot de applicaties die het bedrijf herkent.

  6. 6 · Vergelijk met de werkelijkheid

    Code is niet de omgeving. Resources die handmatig zijn aangemaakt, staan er niet in. Voor AWS kan een optioneel commando discover een inventaris binnenhalen die u met uw eigen CLI-inloggegevens verzamelt, zodat de run die met de bron kan vergelijken.

Drie soorten bron

  • Terraform en OpenTofu

    Rootmodules met lokale en externe modules en variabelen. Dit is de rijkste invoer: deze bevat configuratie, verwijzingen en tellingen.

  • VMware RVTools

    Een export van virtuele machines, disks en netwerken (bijvoorbeeld de tabbladen vInfo, vDisk en vNetwork). De engine leest alleen het bestand en maakt geen verbinding met vCenter. RVTools bevat geen subnetmaskers en geen applicatiegedrag; die levert u apart aan.

  • Een SourceBundle-archief

    Een archief dat expliciet met een invoeroptie wordt gekozen, voor bronnen die als bundel zijn voorbereid.

Vragen van migratieleads

Heeft de inventarisatie toegang nodig tot ons cloudaccount?

Nee. Een standaardassessment leest alleen code en variabelen, heeft geen cloudinloggegevens nodig en uploadt de repository niet. De optionele AWS-vergelijking gebruikt de inloggegevens van uw eigen AWS CLI.

Wat als sommige resources buiten Terraform zijn aangemaakt?

Die staan niet in de code en dus niet in de inventaris. Vergelijk met een inventaris die uit het account is verzameld, of voeg ze toe aan de code voordat u het assessment uitvoert.

Waarom ontbreken sommige eenheden in de volgorde van afhankelijkheid?

Eenheden waarvan het bestaan pas wordt bepaald wanneer OpenTofu plant, hebben geen golf. Los de variabelen of data waarvan ze afhangen op en de run plaatst ze.

Hoe verhoudt dit zich tot het STACKIT Migration Framework?

Het framework begint met een assessmentfase die een feitelijke nulmeting opbouwt. De inventaris hierboven is die nulmeting, afgeleid uit code.

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