AFHANKELIJKHEDEN → STACKIT · ARCHITECTUUR

Zo bouwt u een migratie-afhankelijkheidsgraaf

Begin met de verwijzingen die uw Terraform al vermeldt, laat die de volgorde van het doel bepalen en voeg daarna handmatig de koppelingen toe die in de applicatieconfiguratie staan. StackToIT leest de verwijzingen tussen resources als edges, sorteert de eenheden in golven zodat niets verhuist vóór datgene waarvan het afhangt, en zegt waar de graaf blind is. Deze pagina toont dat aan een webshop met elf eenheden, waaronder één expliciete depends_on die drie eenheden twee golven verschuift.

Drie edge-typen, waarvan één expliciet

Een kleine omgeving die voor deze pagina is geschreven en op 4 november 2026 door StackToIT is beoordeeld. Links: de webserver, zijn elastic IP en het DNS-record uit de invoer (regels 83 tot 105; de opmerking staat in het invoerbestand). Rechts: de vier edges van de graaf in assessment.json die bij de server en bij het DNS-record beginnen, voor de leesbaarheid opnieuw ingesprongen.

Voorbeeldinvoermain.tf
resource "aws_instance" "web" {
  ami                    = "ami-0abcdef1234567890"
  instance_type          = "m6i.large"
  subnet_id              = aws_subnet.web.id
  vpc_security_group_ids = [aws_security_group.web.id]

  # Nothing in the arguments refers to the database or the bucket:
  # the application reads both from its configuration at run time.
  depends_on = [aws_db_instance.shop]
}

resource "aws_eip" "web" {
  instance = aws_instance.web.id
  domain   = "vpc"
}

resource "aws_route53_record" "www" {
  zone_id = "Z0123456789EXAMPLE"
  name    = "www.shop.example.com"
  type    = "A"
  ttl     = 300
  records = [aws_eip.web.public_ip]
}
Edges van de graafassessment.json
[
  {
    "from": "aws_instance.web",
    "to": "aws_db_instance.shop",
    "type": "DEPENDS_ON",
    "via": "depends_on",
    "explicit": true
  },
  {
    "from": "aws_instance.web",
    "to": "aws_security_group.web",
    "type": "ATTACHED_TO",
    "via": "vpc_security_group_ids"
  },
  {
    "from": "aws_instance.web",
    "to": "aws_subnet.web",
    "type": "DEPLOYED_IN",
    "via": "subnet_id"
  },
  {
    "from": "aws_route53_record.www",
    "to": "aws_eip.web",
    "type": "DEPENDS_ON",
    "via": "records"
  }
]
  • Drie edge-typen

    DEPLOYED_IN zegt waar een resource staat (een subnet, een VPC). ATTACHED_TO zegt wat de resource draagt (een security group). DEPENDS_ON zegt dat een andere resource eerst moet bestaan. Elke edge noemt het argument waaruit hij is gelezen.

  • Expliciet gaat boven stil

    De server verwijst in geen enkel argument naar de database. De edge naar de database bestaat alleen omdat depends_on het zegt, en de edge draagt de vlag explicit.

  • Het record volgt het adres

    Het DNS-record leest het publieke adres van de elastic IP, dus het staat erachter, en die staat achter de server.

Wat de expliciete koppeling met de golven doet

Twee runs van dezelfde omgeving, één met de regel depends_on en één zonder. Golven worden berekend uit de afhankelijkheden: een eenheid verhuist pas na alles waarvan die afhangt, en eenheden in één golf kunnen parallel verhuizen.

EenheidGolf met depends_onGolf zonder
aws_s3_bucket.media11
aws_vpc.shop11
aws_security_group.web22
aws_subnet.data_a22
aws_subnet.data_b22
aws_subnet.web22
aws_security_group.db33
aws_db_instance.shop44
aws_instance.web53
aws_eip.web64
aws_route53_record.www75

De samenvatting telt 14 afhankelijkheden tussen eenheden met de regel en 13 zonder. Zonder de regel deelt de server golf 3 met de security group van de database en wacht hij niet meer op de database. De graaf zelf noemt 15 edges voor de eerste run, omdat de database subnet group deel uitmaakt van de database-eenheid en geen eenheid op zich is.

Waar elk edge-type vandaan komt

Edge-typeTerraform-argument dat het veroorzaaktGezien in deze run
DEPLOYED_INvpc_id, subnet_id, subnet_ids, db_subnet_group_nameSubnets en security groups in de VPC; de server in zijn subnet; de database in zijn subnet group (9 edges)
ATTACHED_TOvpc_security_group_ids, ingress.security_groupsBeide security groups op hun resources; de groep van de database laat de webgroep toe (3 edges)
DEPENDS_ONinstance, records, depends_onElastic IP op de server, record op de elastic IP, server op de database (3 edges)

Aantallen komen uit de eerste run. Welke argumenten als verwijzing gelden, bepaalt de engine per resourcetype.

De plek waar de graaf blind is

Dezelfde run. Het DNS-record noemt zijn zone met een letterlijke identifier, dus er is geen verwijzing om te volgen. Links: het record in de invoer. Rechts: de diagnose die de run ervoor schreef (het veld provenance is weggelaten).

Voorbeeldinvoermain.tf
resource "aws_route53_record" "www" {
  zone_id = "Z0123456789EXAMPLE"
  name    = "www.shop.example.com"
  type    = "A"
  ttl     = 300
  records = [aws_eip.web.public_ip]
}
Diagnose van de graafassessment.json
[
  {
    "severity": "warning",
    "message": "could not find the parent of aws_route53_record.www through attribute zone_id; assessed on its own",
    "node_id": "aws_route53_record.www"
  }
]
  • Op zichzelf beoordeeld

    Het record wordt nog steeds geclassificeerd en zijn adreswijziging staat als cutoverstap in de lijst. Wat ontbreekt, is zijn koppeling met de zone, die het plan u laat binden aan een STACKIT DNS-zone via een variabele.

  • De expliciete koppeling reikt tot de cutoverstap

    Met de regel depends_on noemt de stap die de databaseverbinding omschakelt de webserver als client: de bron verwijst vanuit aws_instance.web naar de database. In de run zonder die regel staat dat geen enkele resource van de bron naar de database verwijst, dat de applicaties buiten de bron liggen en dat hun eigenaar ze opsomt. De mediabucket krijgt in beide runs de tweede formulering.

De graaf opbouwen, stap voor stap

  1. 1. Draai op de Terraform die u hebt

    Laat de engine de verwijzingen lezen. Het resultaat is de graaf, de golven in migration/waves.csv en migration/technical-sequencing.md, en een tekening in architecture/dependencies.mmd.

  2. 2. Lees de diagnoses

    Open de diagnoses van de graaf in assessment.json. Een letterlijke identifier, een data source of een waarde die de run niet kon oplossen betekent een ontbrekende edge; noteer ze stuk voor stuk.

  3. 3. Bevestig de applicatiegroepen

    De run stelt groepen voor op basis van verwijzingen en ingressregels, hier één groep van vijf eenheden. Het voorstel verandert niets totdat u in applications-template.yaml review: confirmed zet en het bestand met --applications teruggeeft.

  4. 4. Voeg de runtimekoppelingen toe

    Vraag elke applicatie-eigenaar welke databases, buckets, wachtrijen en API's de applicatie uit de configuratie leest. In deze run hoort de mediabucket bij geen enkele groep en staat hij in golf 1: de Terraform koppelt die aan niets, dus of de shop de bucket leest, kan alleen de eigenaar ervan beantwoorden.

  5. 5. Draai opnieuw en vergelijk

    Draai na het toevoegen van expliciete koppelingen opnieuw en vergelijk waves.csv. Een koppeling die niets verschuift, is overbodig of staat op de verkeerde eenheid.

  6. 6. Maak van golven een plan

    De golven zijn een vertrekpunt voor het golfplan van de architect, geen planning. Voeg datavolumes, vensters voor de schrijfstop en de volgorde van de cutover toe.

Vragen over het in kaart brengen van afhankelijkheden

Ontdekt StackToIT afhankelijkheden uit draaiende systemen?

Nee. Het leest Terraform-, OpenTofu- en RVTools-invoer. Afhankelijkheden die alleen tijdens runtime bestaan, zoals een connection string in een configuratiebestand, staan niet in de graaf; die voegt u toe via de applicatiegroepen en de beslissingen.

Wat verandert een expliciete depends_on behalve de golven?

In deze run veranderde dat ook het cutoverplan. Met de regel noemt de stap voor de databaseverbinding de webserver als bekende client; zonder de regel zegt de stap dat de applicaties buiten de bron liggen. Een depends_on die een echte runtimekoppeling weerspiegelt, documenteert dus een client in het plan, niet alleen een volgorde.

Zijn golven de volgorde van de cutover?

Nee. Het is de volgorde waarin eenheden vanwege hun afhankelijkheden kunnen worden gebouwd of verplaatst. De cutoverfeiten, zoals DNS en het opnieuw binden van adressen, staan apart in technical-sequencing.md.

Waarom komt een eenheid zonder verwijzingen in golf 1?

Die hoeft nergens op te wachten. De mediabucket staat met de VPC in golf 1. Dat betekent dat de Terraform de bucket aan niets koppelt, niet dat niets de bucket gebruikt.

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