AWS, AZURE, GOOGLE CLOUD → STACKIT · TERRAFORM EN OPENTOFU

Terraform- en OpenTofu-migratie naar STACKIT, stap voor stap

Uw Terraform- of OpenTofu-code zegt al wat uw omgeving moet zijn en is daarmee het beste vertrekpunt voor een migratie naar STACKIT, mits de tool elke module en elke variabele ziet. StackToIT leest de configuratie, koppelt elke eenheid aan een STACKIT-doel en schrijft een nieuw STACKIT-Terraform-concept. Deze gids doorloopt dat pad op een kleine omgeving met twee module-aanroepen, een variabelenbestand en een wachtrij, en toont wat er gebeurt als een invoer ontbreekt. De demo-omgeving is AWS; de StackToIT-gidsen voor Azure en Google Cloud beschrijven hetzelfde assess-commando voor azurerm-, azapi- en Google-providercode, en hun koppelingen verschillen per dienst.

Het pad in zeven stappen

Van een bronrepository naar een beoordeelde STACKIT-configuratie.

  1. Verzamel de roots en hun variabelenbestanden

    Som elke rootmodule op die u wilt laten beoordelen, de variabelenbestanden die er in uw pipelines waarden aan geven (terraform.tfvars, omgevingsbestanden, TF_VAR-instellingen) en de .terraform.lock.hcl. De beoordeelde map is de map die de infrastructuur declareert. Zonder lockbestand waarschuwde de demorun dat geen enkele regel de AWS-provider 5.100.0 vastzet, en de documentatie noemt het lockbestand als voorwaarde voor het valideren van de bron.

  2. Maak de invoer compleet

    Een variabele zonder standaardwaarde en zonder waarde leidt ertoe dat elke eenheid die die variabele leest, wordt geweigerd. In de demo lazen alle drie de eenheden de omgevingsnaam, dus de eerste run schreef geen concept. Bestanden met standaardnamen worden hoe dan ook gelezen; een bestand als prod.tfvars geeft u mee met --var-file, in de volgorde waarin OpenTofu de bestanden zou lezen.

  3. Voer het assessment uit

    stacktoit assess op de rootmap. Voeg --offline toe als geen netwerktoegang tot externe modules is toegestaan. Lokale modules worden van schijf geladen.

  4. Lees de modulesamenvatting

    De console toont elke module-aanroep, of die lokaal of extern is, en hoeveel eenheden en resources eruit voortkwamen. Een module die niet is gedownload of ongeldig is, levert voor de eenheden ervan geen STACKIT-pakket op.

  5. Beoordeel het Terraform-concept

    Het concept is een nieuwe configuratie met een eigen providerblok, geen gepatchte kopie van de bron. Beoordeel het met het platformteam vóór een apply.

  6. Lever waarden en beslissingen aan en draai opnieuw

    Open variabelen gaan in review/target-values.tfvars, ontwerpantwoorden in review/inputs.yaml, en de volgende run leest ze.

  7. Pas toe op een nieuwe state

    Pas het beoordeelde concept toe op een eigen state, met de applyvolgorde en de voorwaarden zoals beschreven in execution/terraform/apply.md. De bronstate blijft waar die is tot u de bron uitfaseert.

De invoer: twee module-aanroepen, één variabelenbestand, één wachtrij

Een kleine AWS-omgeving, geschreven voor deze pagina. De module wordt twee keer geïnstantieerd, één keer met een variabele en één keer met een letterlijke waarde, en prod.tfvars levert de omgevingsnaam.

Rootmodulemain.tf
variable "environment" {
  type = string
}

variable "retention_days" {
  type    = number
  default = 30
}

module "exports" {
  source         = "./modules/bucket"
  bucket_name    = "acme-${var.environment}-exports"
  retention_days = var.retention_days
}

module "archive" {
  source         = "./modules/bucket"
  bucket_name    = "acme-${var.environment}-archive"
  retention_days = 365
}

resource "aws_sqs_queue" "jobs" {
  name                       = "acme-${var.environment}-jobs"
  visibility_timeout_seconds = 60
}
Modulemodules/bucket/main.tf
resource "aws_s3_bucket" "this" {
  bucket = var.bucket_name
}

resource "aws_s3_bucket_versioning" "this" {
  bucket = aws_s3_bucket.this.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_lifecycle_configuration" "this" {
  bucket = aws_s3_bucket.this.id
  rule {
    id     = "expire"
    status = "Enabled"
    filter {}
    expiration {
      days = var.retention_days
    }
  }
}
Variabelenbestandprod.tfvars
environment    = "prod"
retention_days = 90
  • Waarom deze vorm

    Echte omgevingen hergebruiken modules en lezen waarden uit bestanden. Negeert de tool een van beide, dan is het concept fout zonder er fout uit te zien.

Zonder waarden weigert de run te gokken

Beide runs zijn op 4 november 2026 door StackToIT uitgevoerd op dezelfde map. De eerste heeft geen variabelenbestand en stopt voordat er een concept is. De tweede geeft --var-file mee en beoordeelt alle zeven resources.

Run zonder het variabelenbestandconsole.txt
Source inputs missing: 1 required input is not in the package, so what reads it was not assessed.
  variable environment · main.tf:39 · aws_sqs_queue.jobs.name, module.archive.aws_s3_bucket.this.bucket
Run met --var-file prod.tfvarsconsole.txt
Resources scanned:      7  (1 in the root module · 6 inside 2 module calls)
Migration units:        3  (3 instances)
Unit dependencies:      0
Modules:                2 module calls (0 external, 2 local): 2 loaded, 0 not downloaded, 0 invalid
  module.archive  ./modules/bucket  1 unit (RECONFIGURE 1) · 3 resources
  module.exports  ./modules/bucket  1 unit (RECONFIGURE 1) · 3 resources
Source checks:          Built-in source checks passed — OpenTofu validation of the source was not run
  • Waartegen de weigering beschermt

    De eerste run schreef geen terraform-map en geen golven. Alle drie de eenheden lazen de ontbrekende waarde: de twee bucketnamen en de wachtrijnaam. De tool verzint geen waarde voor acme-${var.environment}-exports.

  • Aangegeven weglatingen

    Als een invoer met opzet ontbreekt, geeft --omitted-inputs dat aan. De run is dan gedeeltelijk: eenheden die die invoer lezen worden bij naam geweigerd en de overige krijgen een concept.

Het opgestelde STACKIT-Terraform-concept

Resourceblokken uit de tweede run. Reviewopmerkingen boven de blokken zijn hier weggelaten; de S3 API-documenten zijn de bestanden die de run schrijft voor instellingen waarvoor de provider geen attributen heeft.

STACKIT-Terraform van StackToITterraform/terraform.tf
terraform {
  # Write-only attributes (e.g. a VPN pre-shared key) need Terraform/OpenTofu 1.11 or later.
  required_version = ">= 1.11.0"

  required_providers {
    stackit = {
      source  = "stackitcloud/stackit"
      version = "0.121.0"
    }
  }
}

provider "stackit" {
  default_region = var.region
}
STACKIT-Terraform van StackToITterraform/storage.tf
resource "stackit_objectstorage_bucket" "archive_this" {
  project_id = var.project_id
  name       = "acme-prod-archive"
}

resource "stackit_objectstorage_bucket" "exports_this" {
  project_id = var.project_id
  name       = "acme-prod-exports"
}
S3 API-document, module.exportsterraform/s3api/exports_this/lifecycle.json
{
  "Rules": [
    {
      "ID": "expire",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "Expiration": {
        "Days": 90
      }
    }
  ]
}
S3 API-document, module.archiveterraform/s3api/archive_this/lifecycle.json
{
  "Rules": [
    {
      "ID": "expire",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "Expiration": {
        "Days": 365
      }
    }
  ]
}
  • Variabelen zijn per module opgelost

    De lifecycleregel van module.exports bevat 90 dagen uit prod.tfvars, de regel van module.archive bevat de letterlijke 365 dagen.

  • Eén concept, vlak

    Elke module-instance werd een eigen bucketresource (archive_this, exports_this). De modulestructuur kunt u aan de doelzijde zelf opnieuw opbouwen als u dat wilt.

Wat de run met elke bronconstructie deed

Gelezen uit de tweede run.

BronconstructieResultaat in de runWaar u het leest
module "exports" en module "archive", lokale bronTwee module-aanroepen geladen, 6 resources daarbinnen gescand, elk 1 eenheidConsoleoverzicht, architect-report.md
Moduleresources bucket, versioning, lifecycleEén eenheid per instance: RECONFIGURE, STACKIT Object Storagemigration/technical-sequencing.md
var.retention_days met standaardwaarde 30, in prod.tfvars op 90 gezetDe regel verloopt na 90 dagen; de letterlijke 365 blijft 365terraform/s3api/*/lifecycle.json
aws_sqs_queue.jobsREPLATFORM naar een STACKIT RabbitMQ-instance met open variabelen voor plan, versie en toegangslijstterraform/messaging.tf, review/target-values.tfvars
provider region eu-central-1Geplaatst in var.region, standaard eu01; dataresidentie verandert en moet eenmalig worden bevestigdengineering/architect-report.md
required_version >= 1.6Het concept vereist >= 1.11.0; de commentaarkop koppelt die ondergrens aan write-only attributes, bijvoorbeeld een VPN pre-shared key, dus controleer de versie van uw pipelineterraform/terraform.tf

Klassen zijn een voorstel. Een klasse benoemt het soort werk en geeft er geen toestemming voor.

Beslissingen die uw architecten nemen

De run stelt concepten op. Deze keuzes blijven bij u.

  • Modulestructuur aan de doelzijde

    Het concept is plat. Beslis of u herhaalde buckets opnieuw in een module wilt onderbrengen en hoe u ze noemt.

  • State en pipeline

    Beslis waar de nieuwe state staat en welke pipeline die toepast. Controleer of uw OpenTofu- of Terraform-versie voldoet aan de eis van het concept: 1.11.0 of hoger.

  • Providerversie

    Het concept zet de STACKIT-provider vast op 0.121.0. Het registerrecord dat op 4 november 2026 is gelezen, toont 0.122.0 als nieuwste, gepubliceerd op 3 november. Controleer de versie in het register voordat u toepast.

  • API-opt-in voor S3-instellingen

    Versioning en lifecycle lopen via STACKIT S3 API-aanroepen (vier scripts onder execution/api) die het plan pas uitvoert nadat u de opt-in-beslissing hebt beantwoord. Dezelfde beslissing bevat ook een alternatief pad voor de wachtrij via een STACKIT Messaging-API die niet algemeen beschikbaar is; de RabbitMQ-blokken van het concept wachten daar niet op.

  • Ontwerp van de wachtrij

    De RabbitMQ-instance heeft een plan, een versie en een toegangslijst nodig die de bron niet kan leveren. De run laat ze als variabelen zonder standaardwaarde staan.

  • Wat buiten Terraform blijft

    Alles wat de provider niet kan uitdrukken, blijft een gedocumenteerde stap: de run noemt die instellingen als niet overgenomen of als S3 API-documenten. Twee opmerkingen uit de run: als versioning op STACKIT eenmaal is ingeschakeld, kan die alleen worden opgeschort en niet uitgeschakeld, en zolang de lifecycleregels niet zijn toegepast, verloopt er niets.

Vragen van teams over Terraform en OpenTofu

Leest StackToIT mijn state-bestand?

De gedocumenteerde invoer is configuratie, variabelen en modules; een state-bestand hoort daar niet bij. Het assessment beschrijft wat uw code declareert. Vergelijk zelf met uw state als drift ertoe doet.

Hoe zit het met externe modules?

Externe modules worden eerst uit bestaande lokale bronnen opgelost. Netwerkophaling wordt zo nodig gebruikt, tenzij --offline is gezet. In de demo waren beide module-aanroepen lokaal en telde de console 0 extern.

Kan ik één resource tegelijk omzetten?

De run beoordeelt de hele rootmodule zodat afhankelijkheden zichtbaar zijn, en ordent de eenheden daarna in golven. U kiest welke blokken van het concept u het eerst toepast.

Valideert het de bron met OpenTofu?

Ja, automatisch, wanneer de machine voldoet aan de voorwaarden in de documentatie: OpenTofu in het zoekpad (PATH), een sandbox zonder netwerktoegang en de providers in een lokale mirror (--provider-mirror) of plugincache; voor de bron ook een lockbestand. Er wordt niets gedownload. --no-validate slaat het over, --validate laat de run mislukken als die niet kan draaien. De demoruns gebruikten --no-validate, en de console meldt dat.

Is de uitvoer veilig toe te passen zoals die is geschreven?

Nee. Het pakket is een voorstel en niets erin is goedgekeurd. Pas het pas toe na uw review, in de volgorde die het applybestand geeft.

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