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.
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.
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.
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.
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.
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.
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.
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.
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
}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
}
}
}environment = "prod"
retention_days = 90Waarom 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.
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.bucketResources 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 runWaartegen 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.
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
}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"
}{
"Rules": [
{
"ID": "expire",
"Status": "Enabled",
"Filter": {
"Prefix": ""
},
"Expiration": {
"Days": 90
}
}
]
}{
"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.
| Bronconstructie | Resultaat in de run | Waar u het leest |
|---|---|---|
| module "exports" en module "archive", lokale bron | Twee module-aanroepen geladen, 6 resources daarbinnen gescand, elk 1 eenheid | Consoleoverzicht, architect-report.md |
| Moduleresources bucket, versioning, lifecycle | Eén eenheid per instance: RECONFIGURE, STACKIT Object Storage | migration/technical-sequencing.md |
| var.retention_days met standaardwaarde 30, in prod.tfvars op 90 gezet | De regel verloopt na 90 dagen; de letterlijke 365 blijft 365 | terraform/s3api/*/lifecycle.json |
| aws_sqs_queue.jobs | REPLATFORM naar een STACKIT RabbitMQ-instance met open variabelen voor plan, versie en toegangslijst | terraform/messaging.tf, review/target-values.tfvars |
| provider region eu-central-1 | Geplaatst in var.region, standaard eu01; dataresidentie verandert en moet eenmalig worden bevestigd | engineering/architect-report.md |
| required_version >= 1.6 | Het 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 pipeline | terraform/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
Hartelijk dank.
Uw verzoek is bij ons binnengekomen. Onze specialisten nemen contact met u op.