GOOGLE CLOUD → STACKIT · TUTORIAL
Google Cloud-Terraform naar STACKIT: de migratieworkflow
StackToIT leest uw Terraform met de Google-provider offline, zonder Google Cloud-account, en schrijft een STACKIT-concept plus de lijst met beslissingen die het niet voor u kan nemen. Deze tutorial voert één demo-omgeving twee keer uit: eerst zoals ze is, daarna met de ontbrekende variabele en het eerste antwoord aangeleverd. U ziet wat de console meldt, welke bestanden u opent, welke blokken de run schrijft en wat een persoon nog moet doen vóór een plan.
Eerste run: één commando, één samenvatting
Een demo-omgeving die voor deze pagina is geschreven en op 4 november 2026 door StackToIT is beoordeeld, met de google-provider vastgezet op 8.4.0: een netwerk met één subnetwork, een firewallregel, een virtuele machine, een bucket en een Cloud SQL-instance met gebruiker. Boven: het commando, met het uitvoerpad ingekort. Onder: geselecteerde regels van de samenvatting in de console, letterlijk. De demo is gedraaid met de optionele bronvalidatie uitgeschakeld, omdat er geen providermirror beschikbaar was.
stacktoit assess . ./stacktoit-out --offline --no-validateSource 7 resources · 6 units · visibility: Variable unresolved
Migration 5 drafted · 1 need no resource (of 6 units the draft considered)
Attention 3 decisions to make (1 of them with the draft's DEFAULT to confirm or change, 1 of the 3 holds plan steps) · 5 units to review · 6 open requests (2 block the draft, marked in inputs-template.yaml)Zeven resources, zes eenheden
De omgeving bevat zeven Terraform-resources. De run groepeert ze in zes eenheden om te beoordelen, omdat de Cloud SQL-gebruiker deel uitmaakt van de eenheid van zijn instance. Elke eenheid wordt apart ingedeeld, dus u leest het plan per eenheid en niet per bestand.
Niets maakt verbinding met Google Cloud
De StackToIT-documentatie geeft aan dat de Google Cloud-invoer wordt gelezen uit Terraform- en OpenTofu-rootmodules en dat de tool geen verbinding maakt met een Google Cloud-project. De run heeft uw code en variabelewaarden nodig, geen inloggegevens.
De variabele zonder waarde
db_password is gevoelig en heeft geen standaardwaarde, dus de bron wordt gemeld als variable unresolved. De run geeft aan dat dit het assessment niet stopt en dat er nooit om een waarde wordt gevraagd. De eenheid die de variabele leest, kan pas volledig worden beoordeeld wanneer een variabelenbestand de waarde aanlevert.
Waarom elke eenheid op zekerheidsniveau MEDIUM staat
De demo heeft geen lockbestand, dus de run kan niet bewijzen welke versie van de google-provider een plan zou gebruiken. De run meldt dit één keer voor de hele omgeving en beperkt het zekerheidsniveau van alle zes eenheden tot MEDIUM. Die beperking blijft gelden totdat de exacte versie is vastgezet met een vastgelegde .terraform.lock.hcl.
Tweede run: lever de variabele en het eerste antwoord aan
De eerste run schreef review/inputs.yaml. De eerste groep bevat de verzoeken die het concept wijzigen wanneer ze worden beantwoord. Links: het verzoek voor de doelregio zoals de template het schreef, met een lege waarde. Daarna het commando van de tweede run (uitvoerpad ingekort), het variabelenbestand dat die las en dezelfde twee consoleregels daarna. Het antwoord eu01 is in een kopie van het bestand geschreven; het variabelenbestand bevat een placeholder die geen echte secret is.
# target.region (TARGET_SELECTION, request state OPEN)
# needed: The STACKIT region the migrated estate is built in.
- id: INP-TSE-1eaf5b60fa62
kind: TARGET_SELECTION
topic: target.region
scope:
profile: default
# options: eu01 | eu02
value: "" # pick one of the options abovestacktoit assess . ./stacktoit-out2 --offline --no-validate \
--var-file ./vars.tfvars \
--inputs ./inputs.yamldb_password = "demo-only-not-a-real-secret"Source 7 resources · 6 units · visibility: Complete
Attention 3 decisions to make (1 of them with the draft's DEFAULT to confirm or change, 1 of the 3 holds plan steps) · 5 units to review · 4 open requestsBron compleet, verzoeken van zes naar vier
Met het variabelenbestand wordt de bron als compleet gelezen. De twee verzoeken die het concept blokkeerden, de regio en de variabele, zijn gesloten en vier openstaande verzoeken blijven over. De template koppelt elk antwoord aan deze bron met velden die u niet mag wijzigen, en een leeg gelaten stub wordt nooit als standaardwaarde behandeld.
De Terraform is niet gewijzigd
Een vergelijking van de terraform-mappen van beide runs toont één verschil: de run-identifier en de brondigest in terraform/README.md. De regiovariabele had al eu01 als standaardwaarde. Antwoorden herschrijven het concept niet altijd; hier veranderden ze de status van het plan.
Antwoorden staan buiten de runmap
De documentatie raadt aan uw ingevulde antwoorden buiten de gegenereerde rapportmap te bewaren en bij de volgende run met --inputs mee te geven. Volgens de documentatie verplaatst een nieuwe run op dezelfde uitvoermap de eerdere run standaard naar een map met de naam previous-<run id>. Voor deze pagina ging de tweede run naar een aparte map, ./stacktoit-out2, zodat beide runs naast elkaar konden worden vergeleken.
Welk bestand beantwoordt welke vraag
Paden in de uitvoermap van de tweede run. Ze bestaan allemaal in de demorun; open ze in deze volgorde.
- index.html
- De samenvatting en de beslissingen die moeten worden genomen. Begin hier.
- assessment.json
- Per eenheid: klasse, zekerheidsniveau, doeldienst, reden en bevindingen.
- terraform/
- Het STACKIT-Terraform-concept, één bestand per gebied (netwerk, beveiliging, compute, data, opslag), plus variables.tf en terraform.tf.
- terraform/README.md
- Wat het concept bevat, de services die u eerst inschakelt, de target security checklist en wat niet wordt overgenomen.
- engineering/not-carried.csv
- Elke bron-eigenschap die het concept niet overneemt, eigenschap voor eigenschap.
- migration/technical-sequencing.md
- Golven berekend uit de afhankelijkheden tussen eenheden.
- execution/
- Bestanden voor de uitvoerder: handmatige stappen, de OpenTofu-stappen en controles.
- review/
- De antwoordtemplates: inputs.yaml, decisions.yaml en het bestand met doelwaarden.
Hoe de demo-omgeving is ingedeeld
| Google Cloud-resource | STACKIT-doel | Klasse |
|---|---|---|
| google_compute_network | Geen resource: elk subnetwork wordt een netwerk in het project | Herconfiguratie |
| google_compute_subnetwork | stackit_network met hetzelfde IPv4-prefix | Herconfiguratie |
| google_compute_firewall | stackit_security_group met één regel per allow-regel | Herconfiguratie |
| google_compute_instance | stackit_server met een netwerkinterface | Herconfiguratie |
| google_sql_database_instance met zijn gebruiker | stackit_postgresflex_instance en stackit_postgresflex_user | Replatforming |
| google_storage_bucket | stackit_objectstorage_bucket | Herconfiguratie |
Klassen zoals de run ze bepaalde, allemaal met zekerheidsniveau MEDIUM. De netwerkcontainer heeft geen STACKIT-resource nodig; het concept meldt dat en telt het als één eenheid die geen resource nodig heeft.
Netwerk, firewall en server, omgezet
Eerste paneel: de firewallregel en de virtuele machine uit de invoer. Daarna de blokken die de engine schreef voor netwerk, security group met regel en server, één paneel per bestand; de reviewcommentaren boven elk blok in het bestand zijn hier weggelaten, evenals het interfaceblok en de database.
resource "google_compute_firewall" "web" {
name = "allow-web"
network = google_compute_network.portal.name
direction = "INGRESS"
allow {
protocol = "tcp"
ports = ["443"]
}
source_ranges = ["0.0.0.0/0"]
target_tags = ["web"]
}
resource "google_compute_instance" "web" {
name = "portal-web-1"
machine_type = "e2-standard-4"
zone = "europe-west3-a"
tags = ["web"]
boot_disk {
initialize_params {
image = "debian-cloud/debian-12"
size = 50
}
}
network_interface {
subnetwork = google_compute_subnetwork.app.id
}
}resource "stackit_network" "app" {
project_id = var.project_id
name = "app"
ipv4_prefix = "10.20.0.0/24"
ipv4_nameservers = var.default_ipv4_nameservers
}resource "stackit_security_group" "web" {
project_id = var.project_id
name = "allow-web"
}
resource "stackit_security_group_rule" "web_allow_web" {
project_id = var.project_id
security_group_id = stackit_security_group.web.security_group_id
direction = "ingress"
ether_type = "IPv4"
ip_range = "0.0.0.0/0"
port_range = {
max = 443
min = 443
}
protocol = {
name = "tcp"
}
}resource "stackit_server" "web" {
project_id = var.project_id
name = "portal-web-1"
machine_type = var.web_machine_type
availability_zone = var.availability_zone
boot_volume = {
source_type = "image"
source_id = var.web_image_id
size = 50
delete_on_termination = true
}
network_interfaces = [stackit_network_interface.web_1.network_interface_id]
}Tags worden een expliciete keuze
De firewallregel selecteert servers op de netwerktag web. STACKIT security groups kennen geen tagselector, dus het concept maakt de groep en de regel aan en laat de koppeling open: u bepaalt welke netwerkinterfaces de groep vermelden. De run noemt dit als eerste vervolgactie, met de security architect als eigenaar.
Prioriteit en beleidslagen worden niet overgenomen
STACKIT kent geen regelprioriteit en de scan ziet geen organisatie- of folderbeleid dat de bron verder kan beperken. De commentaren in het concept geven aan dat de geschreven regels toestaan wat de gescande regels toestaan en mogelijk meer toestaan dan de bron in werkelijkheid doet.
Zone en image zijn aan u
De zone van de bron wordt niet overgenomen. De server staat in een zonevariabele; het machinetype en het image zijn variabelen zonder standaardwaarde, met de bronwaarden in hun omschrijving.
De workflow in volgorde
Zet de provider vast en leg het lockbestand vast in versiebeheer
Declareer de google-versie in required_providers en bewaar .terraform.lock.hcl bij de code. Zonder lockregel waarschuwt de run dat de versie niet is bewezen en beperkt het zekerheidsniveau tot MEDIUM.
Beoordeel offline
Voer het commando uit vanuit de map met de rootmodule, niet vanuit een submap van een grotere configuratie. Met de offline-optie gebruikt de run alleen lokale bestanden en caches en doet hij geen uitgaande verzoeken.
Lever variabelen en antwoorden aan
Geef voor elke gevoelige invoer een variabelenbestand op, bijvoorbeeld met de var-file-optie, en vul de waarderegels van het invoerbestand in. Een leeg gelaten stub blijft een openstaand verzoek en is geen fout.
Lees de eerste vervolgactie
De console eindigt met één vervolgactie en een eigenaarsrol. Hier is dat de security architect die de servers noemt waarvoor een security group bedoeld is.
Beoordeel het concept met de eigenaren
Open terraform/ en engineering/not-carried.csv met de eigenaren van platform, netwerk en beveiliging. Elk blok bewaart een korte opmerking over zijn herkomst, zijn waarden en wat niet wordt overgenomen.
Maak een plan in een testproject
Voer tofu init, validate en plan uit tegen een testproject. De README van het concept vermeldt dat StackToIT nooit apply uitvoert.
Wat u vóór het eerste plan wijzigt
Vier variabelen zonder standaardwaarde
postgresflex_storage_class, project_id, web_image_id en web_machine_type hebben geen standaardwaarde. Het bestand met doelwaarden in review/ noemt ze met hun omschrijving.
Toegang tot de database
De Cloud SQL-instance is openbaar met één geautoriseerd netwerk. Het concept beperkt de STACKIT-instance met een toegangslijst van dezelfde CIDR, een variabele die u kunt wijzigen. Het wachtwoord van de gebruiker wordt niet gekopieerd: STACKIT genereert het en u geeft het nieuwe wachtwoord door aan de applicatie.
Rollen van de databasegebruiker
Cloud SQL-gebruikers zijn lid van een superuserrol die het concept niet overneemt. De rollenvariabele staat standaard op alleen login; kies de rollen per gebruiker.
Egress en DNS
De run kan niet bewijzen of het bronsubnet een internetroute had, dus hij behoudt de standaardgateway van STACKIT en meldt de twijfel. De nameservers staan standaard op de resolveradressen van STACKIT; privénamen vereisen een eigen DNS-server.
Inloggegevens en state
De README van het concept raadt Workload Identity Federation aan voor de provider en waarschuwt dat state locking op een S3-backend op STACKIT Object Storage geen effect heeft; voer apply uit vanuit één job tegelijk of gebruik de PostgreSQL-backend waarnaar de provider verwijst.
Bucket met versiebeheer
De bucket heeft versiebeheer aan. De bucketresource heeft geen versioning-attribuut, dus u schakelt het in via de S3 API nadat de bucket bestaat.
Vragen van platformteams
Hebben we Google Cloud-inloggegevens nodig om het uit te voeren?
Nee. De StackToIT-documentatie geeft aan dat de Google Cloud-invoer wordt gelezen uit Terraform- en OpenTofu-rootmodules die de Google-provider gebruiken en dat er geen verbinding met een Google Cloud-project wordt gemaakt.
Waarom meldt de run de bron als unresolved?
Een gevoelige variabele zonder standaardwaarde of waarde kan niet worden gelezen. De run noemt de variabele en het bestand en de regel waarin die wordt gelezen, zet het assessment voort en vraagt om een variabelenbestand; hij vraagt nooit om de waarde zelf.
Wijzigen de antwoorden de Terraform?
Soms. In deze demo sloot het regioantwoord een blokkerend verzoek zonder één regel van het concept te wijzigen, omdat de standaardwaarde al overeenkwam. Antwoorden die een waarde noemen die het concept gebruikt, herschrijven de betrokken blokken bij de volgende run wel.
Kunnen we het concept zo toepassen?
Nee. Het is een voorstel voor review. Vul de variabelen in, bepaal welke interfaces de security group krijgen, maak een plan in een testproject en laat eerst een architect de openstaande beslissingen afhandelen.
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.