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.
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
}[
{
"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.
────────────────────────────────────────────
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 timewave,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.
## 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
| Inventarisatievraag | Bestand van de run | Wat het bevat |
|---|---|---|
| Wat bestaat er nu? | assessment.json | Elke 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.md | Module-aanroepen, hoe elke is geladen, eenheden per module en golf |
| Wat hangt van wat af? | migration/waves.csv, architecture/dependencies.mmd | Volgorde van afhankelijkheid en de graaf erachter |
| Waar staat de data? | migration/data-movement.md | Stateful eenheden, doelservice, ingerichte capaciteit, openstaande datavragen |
| Wat is nog onbekend? | decisions.json, migration/prerequisites.md | Beslissingen, 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 · 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 · 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 · 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 · 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 · 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 · 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
Hartelijk dank.
Uw verzoek is bij ons binnengekomen. Onze specialisten nemen contact met u op.