Google Cloud Dynamic Python Web App

Explore how StackToIT analyzed Google Cloud's own dynamic Python web app, a Cloud Run and Cloud SQL estate published by Google, and generated a structured migration assessment, proposed STACKIT infrastructure, architecture diagrams and a detailed migration plan.

Google Cloud → STACKIT · assessed 2026-11-07 · StackToIT 0.6.0-13076-ga19ea28c64 · knowledge base 0.394.0

View Full AssessmentBrowse the Terraform draft

Route
Google Cloud STACKIT
Status
Migration assessment generated
Resources analyzed
37
Migration units identified
11
Target units drafted
11 of 16 considered
Original Google Cloud source Google Cloud (GoogleCloudPlatform) / terraform-dynamic-python-webapp Assessed commit 7c9e8fb8f0d4 · root infra · link above: current main
StackToIT generated outputs stacktoit-examples / examples / gcp-python-webapp assessment, STACKIT Terraform draft, architecture and migration decisions, published as the run wrote them · link: current main

Overview

Google's own Jump Start Solution for a dynamic Python web app: a Django API on Cloud Run with a migration job, Cloud SQL for PostgreSQL, Secret Manager, a Cloud Storage media bucket, Pub/Sub, service accounts and Firebase Hosting for the front end. StackToIT read the Terraform as published by Google Cloud and wrote a STACKIT migration package: 11 units assessed plus 5 decided at plan time, 11 drafted as 10 STACKIT resource blocks that pass OpenTofu validation, the open decisions named with an owner.

Resources read37
Migration units11 + 5 decided at plan time
Files · module calls18 files · 1 calls (1 registry, 0 local)
Package statePartially executable migration package

What stood out

  1. Every unit gets a verdict

    All 11 units are assessed: 6 RECONFIGURE (service accounts, secrets, the media bucket), 2 REPLATFORM (Cloud SQL to STACKIT PostgreSQL Flex, Pub/Sub to STACKIT RabbitMQ), 2 CONTAINERIZE (the Cloud Run service and job to STACKIT Kubernetes Engine) and 1 MANUAL_REVIEW (the Firebase project). 5 more units (three Cloud Build triggers, the Firebase Hosting site and an init service account) exist only if a variable holds at plan time; they are assessed too and marked as such.

  2. Serverless becomes containers on Kubernetes

    STACKIT has no Cloud Run, so the API service and the migration job become workloads on a STACKIT Kubernetes Engine cluster. The draft writes the cluster and Kubernetes manifests and asks for the machine type and node counts instead of guessing them.

  3. A draft that passes OpenTofu validation

    11 of the 16 units considered are drafted as 10 STACKIT resource blocks with 13 variables; 4 are proposed and switched off until someone decides; the Firebase project is left to the architect. tofu init and tofu validate (OpenTofu 1.13.1) accepted the draft. That is static validation, not a plan against STACKIT.

  4. The first required action has an owner

    6 decisions are open. The first is to allow STACKIT APIs that are not generally available (Pub/Sub v1beta for RabbitMQ, Secrets Manager): Owner: Platform Architect. 10 of the 12 automated steps are free of decisions and wait only for values such as project_id; none can run as written, none is approved.

  5. The source provider is not pinned

    The repository commits no .terraform.lock.hcl and constrains google to ">= 6, < 8", which excludes the 8.4.0 release the knowledge base was checked against. StackToIT caps every unit at MEDIUM confidence, marks none automation-eligible and names the remedy: commit a lock file.

  6. No cost comparison is stated

    The price cache holds no Google Cloud record and no price tool was installed next to the binary. 2 of 8 STACKIT lines are priced (164.67 EUR partial, list prices); the report refuses to call a one-sided subtotal a saving and prints the commands that fill the missing prices.

Source infrastructure

terraform-dynamic-python-webapp is a Google Cloud Jump Start Solution: a Django REST API ("server") on Cloud Run, a Cloud Run job that runs the database migrations, Cloud SQL for PostgreSQL, two Secret Manager secrets (Django settings and admin password), a Cloud Storage bucket for media, a Pub/Sub topic, service accounts for the server, client and automation, Firebase Hosting for the JavaScript client, and Cloud Build triggers used for the first deployment. The estate assessed is its infra/ root module and the registry module it calls.

Terraform rootinfra
Infrastructure codeTerraform (OpenTofu-readable)
Registry modules1 registry module downloaded by the run (terraform-google-modules/project-factory/google//modules/project_services 18.0.0)
Upstream licenceApache-2.0 (upstream LICENSE)

The estate was assessed exactly as published upstream: nothing in it was edited. Its one required variable without a default, project_id, was given in a variable file holding the single line project_id = "example-project" (an invented name). It ships no .terraform.lock.hcl, so the OpenTofu validation of the source did not run and every unit is capped at MEDIUM confidence; its google constraint ">= 6, < 8" also excludes 8.4.0, the release StackToIT's knowledge base was checked against, so the source provider is UNVERIFIED.

Source visibility as read by StackToIT: Complete. Domains of the 11 units: identity 5, compute 2, platform 1, messaging 1, data 1, storage 1.

Assessment summary

Classification of the 11 units present in the source, as the knowledge base 0.394.0 decided them. The strip shows the share of each class; the legend keeps the classes with zero units so that what did not happen is visible too.

  • 0 DIRECT same service, same settings
  • 6 RECONFIGURE same kind of service, settings change
  • 2 REPLATFORM a different managed service
  • 2 CONTAINERIZE packaged into a container first
  • 0 REDESIGN no counterpart; the architecture changes
  • 1 MANUAL_REVIEW a person decides
  • 0 BLOCKED cannot move as it stands
Confidence0 HIGH · 10 MEDIUM · 1 LOW capped at MEDIUM: the source provider version is not verified (no lock file, and its constraint excludes the release the knowledge base was checked against)
Units the draft considered16 = 11 present + 5 decided when OpenTofu plans
Fate of those units11 generated (9 Terraform-only, 2 hybrid) · 0 need no resource · 1 left to the architect

Applications

2 applications proposed by StackToIT from the service structure, none confirmed by a customer: 0 ready · 0 blocked · 0 redesign · 2 not ready.

ApplicationStateWhy
serverNOT READYproposed by StackToIT, not confirmed by anyone: the Cloud Run API service with what only it reaches; 2 automated steps wait for a value, 4 open security decisions to accept it
migrateNOT READYproposed by StackToIT, not confirmed by anyone: the Cloud Run migration job with what only it reaches; 4 automated steps wait for a value, 1 waits for a decision, 6 open security decisions to accept it

Cost

Financial comparisonNOT AVAILABLE
STACKIT partial estimate164.67 EUR / month 2 of 8 lines priced, list prices, not a bill
Source lines priced0 of 14
Price sourceStackToIT price cache (STACKIT list prices, cache last filled 2026-11-02); no Google Cloud price was available

No price source for 5 lines (the price cache holds no Google Cloud record and stacktoit-prices was not installed); 6 of 8 STACKIT lines have no price; 13 source resources are outside the model and can carry a charge.

Architecture

Three views StackToIT draws from the same graph: the source as read, the proposed STACKIT target, and the delta between them. The Mermaid sources are published beside the renderings.

Current (Google Cloud, as read)SVGMermaid
Current architecture diagram of the Google Cloud estate as StackToIT read it
Target (STACKIT, proposed)SVGMermaid
Proposed STACKIT target architecture diagram
Delta (what changes)SVGMermaid
Delta diagram between the Google Cloud source and the STACKIT target

Also in the package: data flows, dependencies (Mermaid only), identity (Mermaid only), network security.

Migration readiness

StackToIT states readiness as three measures with their denominators and lists what closes each open item. On this estate the package is Partially executable migration package; the full register is in the report.

ApprovalNOT PROVIDED Live verificationNever applied to STACKIT — no plan was run against a live project

Three measures, not one

Automated steps that can run as written0 of 1210 are free of decisions and manual prerequisites, 10 of them wait for a value · 0 waits for a manual prerequisite · 2 require a design decision · 0 of the 10 rest on a default nobody confirmed · 0 approved
Automation-eligible units0 of 118 more become eligible once their open items are answered · 9 cannot be automated in this build
Critical settings resolved12 of 62the rest are listed with an owner and the condition that closes them

The plan, step by step

Plan steps78
Terraform steps10
STACKIT API steps2 2 wait for an opt-in
Manual steps64 29 can start now
Lifecycle steps (cutover, verify, retire)2
Refused2 cannot be carried out whatever is decided
Not runnable now26
Decisions to make6 1 draft defaults to confirm

1 record nobody has answered rests on a draft default that no step waits for (the STACKIT region the draft builds in); a person confirms it or changes it.

Open decisions and inputs

First required actionAllow the calls of STACKIT APIs that are not generally available — Owner: Platform Architect
Open input requests27 7 block parts of the draft

The full register is the report's Decisions page; the answer files a customer would fill in are published unanswered under review/. The executive brief restates every figure above with its owner and closing condition.

Generated infrastructure

The STACKIT Terraform draft as StackToIT wrote it: 11 of the 16 units the draft considered (11 present in the source, 5 decided only when OpenTofu plans) have a generated resource; 0 need none and 1 are left to the architect. 13 variables. OpenTofu static validation PASSED. It is a draft for an architect, validated against the provider schema, never planned against a live project. Each file opens in a read-only viewer; the raw file is linked from there.

Plans and documents

The execution package under execution/ holds the Terraform apply notes, the STACKIT API scripts and the manual actions; migration/ holds the waves, work packages and data-movement plan as CSV, Markdown and JSON.

Full assessment

The Migration Intelligence Workspace is the HTML report StackToIT writes beside its files. Its content is published here unchanged, under one added navigation bar; every link inside it resolves within the package.

View Full Assessment

Pages of the report

Provenance

Commandstacktoit assess . ../../run-python-webapp --var-file ../../example.tfvarsRun from the infra/ folder of a clone of the upstream repository at the pinned commit. ../../example.tfvars is the variable file with project_id = "example-project"; the run reads it after terraform.tfvars and *.auto.tfvars. The output directory is this example's output/ folder, unchanged; ../../run-python-webapp is the name it had when it was written.
Verificationstacktoit verify ../../run-python-webappVERIFIED — 146 files match manifest.json (size and SHA-256); 7 of 7 checks PASS
StackToIT0.6.0-13076-ga19ea28c64 commit a19ea28c64
Knowledge base0.394.0 sha256 480e323d0c501840bc553e30e3073fca5f51c5c45a9e7d91ed4a4ff36d6a50d0
Assessment schema · OpenTofu0.24.0 · 1.13.1
Run6f8f72b2-1c34-4cfc-8483-344c41245364 2026-11-07T04:24:17Z
Source digestsha256:19bfed642d5789ccada81b91d5c36e33175dcafd66dc46b1644ffa105d020000
Modeonline (default options; the run downloaded the one registry module; no provider mirror; STACKIT list prices from the local price cache retrieved 2026-11-02; OpenTofu 1.13.1 validated the draft)

What has been established, and what has not

CheckStateScope
Source completenessPARTIALsource status RUNTIME_TOPOLOGY_PARTIAL: 5 unit(s) have a count/for_each that is not known statically; whether and how often they exist is decided at plan time
Source providerUNVERIFIEDgoogle constraints >= 6, < 8, tested against 8.4.0; no lock file records the version of registry.terraform.io/hashicorp/google, and the constraint ">= 6, < 8" excludes it (pinned 8.4.0)
Source validation (OpenTofu)NOT_RUNLOCK_FILE — the source has no dependency lock file (.terraform.lock.hcl) and the validation runs the engine with the lock file read-only, so it never installs a provider without one: commit the lock file (tofu init writes it) and run again. Also not available from a provider mirror or cache: hashicorp/google, hashicorp/google-beta, hashicorp/http, hashicorp/random, hashicorp/time (Failed to query available provider packages); once the source has a lock file, run with network access so that the packages the lock file names are prepared, or give --provider-mirror DIR (an offline run needs it); nothing is downloaded by the validation. No validation result exists; this is neither a pass nor a failure of the source.
Draft generationGENERATEDthe draft is in terraform/
Draft checks (StackToIT)PASSED20 checks, none found a violation
Global invariantsPASSED12 of 12 invariants PASS; vacuous, they checked nothing: NO_SECURITY_WIDENING, VARIABLE_IDENTITY_PRESERVED, APPLICATION_READY_IMPLIES_REQUIRED_ENV_SECRETS_DEPENDENCIES
Draft validation (OpenTofu)PASSEDtofu init -backend=false and tofu validate accepted the draft; tofu 1.13.1 — static validation of the draft against the pinned provider schema — not target behaviour, not approval
Run folder (stacktoit verify)VERIFIED146 files match manifest.json; EVIDENCE, SCHEMA, RUN_ID, BASIS, INPUTS_DIGEST, INVALIDATION_KEYS, EXECUTION_PLAN PASS
Stackit PlanNOT_RUNthis build runs no plan against a STACKIT project
Architect ApprovalNOT_PROVIDEDno review decision is recorded for this run
Semantic EquivalenceNOT_ASSESSEDthis build has no measure for it
Safe To ApplyNOT_ASSERTEDStackToIT never asserts it

Publication

The output folder is published exactly as StackToIT wrote it. No file was removed, edited or redacted; stacktoit verify passes on the published copy. The source code is not republished here; the links point to the exact upstream revision.

Files published151
Files in manifest.json145
Outside the manifestmanifest.json, review/applications.yaml, review/decisions.yaml, review/inputs.yaml, review/progress.yaml, review/target-values.tfvarsreview/ is the customer's answer area the run writes beside its files; it is excluded from the manifest by design. manifest.json lists every other file.
Excluded for publicationnone
Modified for publicationnone
Metadataexample.json · schema

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.