GOOGLE CLOUD → STACKIT · CHECKLIST

Google Cloud to STACKIT migration checklist

Twenty-four checks in six phases, each tied to the file that holds the answer. They come from running StackToIT on a nine-unit Google Cloud estate (a VM, a network, a Cloud SQL instance, a bucket, a topic, a secret, a DNS zone and a service account); your estate will have more units, but the files and the questions are the same.

The demo estate and what the run decided

Google Cloud resourceSTACKIT targetClass
VPC networkProject networking or Network AreaReconfigure
Subnetworkstackit_network, same IPv4 prefixReconfigure
Compute Engine instancestackit_server with a network interfaceReconfigure
Cloud Storage bucketstackit_objectstorage_bucketReconfigure
Cloud SQL for PostgreSQLstackit_postgresflex_instanceReplatform
Pub/Sub topic and subscriptionOne RabbitMQ instance for all topicsReplatform
Secret Manager secretOne Secrets Manager instanceReconfigure
Cloud DNS zonestackit_dns_zoneDirect
Service accountstackit_service_accountReconfigure

Ten resources became nine units: the subscription is folded into its topic. Confidence is MEDIUM on every unit, because the source declares google 8.4.0 without a lock file. The run was made on 4 November 2026.

1. Discovery

  • Scan result is complete

    Open assessment.json and read summary.source_status and source_validation. COMPLETE with built-in checks passed means every file was read; a missing module or an unreadable file shows up here, not later.

  • Provider version is pinned

    Commit .terraform.lock.hcl and run again. An unpinned provider caps every unit at MEDIUM confidence, as the demo run states for all nine.

  • What Terraform does not know is listed

    Resources created in the console, organisation policies and shared networks managed elsewhere are not in the scan. migration/technical-sequencing.md states plainly that a name, address or certificate outside the scanned source is not seen. Write down who owns each gap.

  • Stateful units are named

    migration/data-movement.md lists them: two in the demo, the database and the bucket, both with the mechanism marked unknown.

2. Design

  • The target region is answered

    inputs-template.yaml holds one request that blocks the draft: target.region. Answer it first, because the region-dependent requests are asked again for the region you choose.

  • Every class is reviewed

    engineering/architect-report.md carries the review queue. In the demo: one DIRECT, six RECONFIGURE, two REPLATFORM, none REDESIGN or BLOCKED. Anything REDESIGN needs its own design page, not a ticket.

  • Critical settings have an owner

    decisions.json groups them: six units and fifteen critical settings in the demo. Assign each to a role; execution/manual/actions.md already proposes owners.

  • The landing zone exists

    migration/landing-zone-requirements.md states what the organisation and project must provide before the first apply, and lists the values you supply. Create the project first.

Evidence: a Cloud SQL instance, checked

From the same run. Left: the instance as the input declares it. Right: the PostgreSQL Flex block the engine wrote; the review comments above it in the file are left out here. The checks in the data phase below start from this block.

Example inputmain.tf
resource "google_sql_database_instance" "core" {
  name             = "core-pg"
  region           = "europe-west3"
  database_version = "POSTGRES_15"

  settings {
    tier    = "db-custom-2-7680"
    disk_size = 100
  }
}
STACKIT Terraform by StackToITterraform/data.tf
resource "stackit_postgresflex_instance" "core" {
  project_id = var.project_id
  name       = "core-pg"
  version    = "15"
  flavor_id  = "2.16"
  storage = {
    class = var.postgresflex_storage_class
    size  = 100
  }
  backup_schedule = "0 2 * * *"
  network = {
    acl = var.core_allowed_cidrs
  }
  retention_days = 32
}
  • Flavor from the catalogue

    2.16 is the smallest single-node flavor that covers the source tier of 2 vCPU and 7.5 GiB.

  • Access list instead of a network

    The source states no authorized networks; the STACKIT instance is reached through core_allowed_cidrs, which has no default and which you fill with client prefixes.

  • Retention is a floor, not a copy

    The source retention is not visible statically, so 32 days, the STACKIT minimum, is drafted.

3. Build

  • Every variable without a default has a value

    In the demo: project_id, batch_image_id, batch_machine_type, batch_boot_volume_size_gb, core_allowed_cidrs, postgresflex_storage_class and three RabbitMQ values (plan name, version, allowed CIDRs). terraform/variables.tf describes each.

  • NOT CARRIED lines are read

    The demo shows 26 source properties checked, 20 carried or explained, 6 named NOT CARRIED and none unaccounted. Search terraform/ for the words and decide each, for example the service account's display name.

  • Machine types are chosen on load

    The draft leaves the flavor to batch_machine_type. STACKIT's general purpose family pairs 4 vCPU with 16 GB (g2i.4); pick from measured use.

  • Secrets are recreated by hand

    The run drafts a Secrets Manager instance, not the secret. Create the key in it, set its value from your vault, and grant access to the service account.

4. Data

  • A mechanism is chosen per stateful unit

    State the size, the change rate, the tolerated downtime and the recovery point for the database and the bucket. The run lists the data class, recovery point and downtime as not provided and the size as not in the source; no plan is sound without them.

  • Database backup and restore are tested

    The draft schedules a daily backup at 02:00. Backups are kept 32 to 90 days, and a point-in-time restore creates a cloned instance. Practise one restore before cutover.

  • Bucket versions are decided

    The bucket has versioning on, and the run flags it. Decide whether old object versions move or are left behind, and use an S3-compatible tool such as rclone for the copy.

  • Messaging clients are scheduled

    Pub/Sub publishers and subscribers change to AMQP. The draft creates the RabbitMQ instance only; exchanges and queues are created by hand.

5. Cutover

  • Waves match your dependencies

    migration/technical-sequencing.md orders the demo in three waves: seven units, then the subnetwork, then the instance. It is a starting point, not a schedule.

  • Names and addresses outside the scan are listed

    The run states that it found no cutover facts for DNS or certificates, and adds that this does not mean none exist. List every name that points into the estate.

  • Rollback is written down

    Each manual step in execution/manual/actions.md says the plan does not know how to undo it. Whoever carries out the step records the undo.

  • Egress and DNS resolution are proven

    network.tf flags private egress as unproven for the subnet, and notes that Google's resolver answers internal names that STACKIT's default name servers do not.

6. After

  • The checks are ticked

    execution/verify/checks.md lists a check before and after each step, such as whether a variable has a value and whether a resource exists in state.

  • The assessment is run again

    After you change variables or answer requests, run it again on the same output folder: the draft is regenerated, and the earlier run moves to a previous-<run id> subfolder (or is removed with --replace), so you can compare the two.

  • Access is reviewed

    Roles are assigned to the new service account by a person. Google advises against basic roles in production; give the account the least that works.

  • The source is retired after a quiet period

    Delete Google resources, keys and service accounts only when nothing has called them for an agreed time, and keep an export.

Questions teams ask about the checklist

Can I use this checklist without StackToIT?

The phases and questions apply to any Google Cloud to STACKIT move. The file references are specific to a StackToIT run, so without one, read them as the list of answers you need to have written down.

How many units will my estate have?

The demo has ten resources and nine units. Real estates are larger, and modules, loops and counts add instances. The assessment counts resources, units and instances separately in its summary.

Which items block everything else?

The target region, the variables without a default and the open critical settings. The demo run reports none of its automated steps as ready to run as written until these are settled.

Where do GKE, Cloud Run and BigQuery fit?

They are not in this demo. Kubernetes and Cloud Run have their own pages in this guide, and BigQuery is a redesign that needs an architecture decision before any checklist applies.

Sources

Your next move: STACKIT.

Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.