← Google Cloud Dynamic Python Web AppExamplesLegal NoticePrivacy

StackToIT Migration Intelligence Workspace

FOR REVIEW — generated by StackToIT Assess. Architect review required before any decision.

Partially executable migration package · For review only · Not approved.

Technical details: run, versions, digest and evidence freshness

Assessment

Assessment
gcp-candidates/terraform-dynamic-python-webapp/infra (assessment format 0.24.0)
Assessment timestamp
Generated 2026-11-07 04:24 UTC by stacktoit 0.6.0-13076-ga19ea28c64 (a19ea28c64)
Run
6f8f72b2-1c34-4cfc-8483-344c41245364 · source digest sha256:19bfed642d5789ccada81b91d5c36e33175dcafd66dc46b1644ffa105d020000
Source snapshot
partly decided only at plan time · google not locked; google-beta not locked; http not locked; random not locked; time not locked
STACKIT target profile
Stable network model: the experimental STACKIT VPC resources are not used (STACKIT_STABLE)
STACKIT provider version
0.121.0
Knowledge base version
0.394.0
Evidence freshness
Not assessed — Evidence freshness as one measure is not assessed in this build. Dated evidence is shown where it is used: each STACKIT support option and each assurance row states when it was verified (verified_at, and recheck_after for support), in support_suitability and assurance. The date beside a readiness dimension is the assessment date, not a retrieval date.

Staleness: Not assessed — This build has no change detection, so there has been no re-check since the assessment was made (Generated 2026-11-07 04:24 UTC). The source may have changed since.

Source checks: Built-in source checks passed — OpenTofu validation of the source did not run (LOCK_FILE)

Run status: COMPLETE (report published). Source: partly decided only at plan time. Draft: GENERATED. The report was written whole; this is not a statement that the migration is ready.

Executive lens: the sections are in the order this reader usually wants, and Architecture and Engineering Evidence are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Architect lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Platform lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Security lens: the sections are in the order this reader usually wants, and Costs and Migration Plan are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Application owner lens: the sections are in the order this reader usually wants, and Engineering Evidence is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Programme lens: the sections are in the order this reader usually wants, and Engineering Evidence is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

FinOps lens: the sections are in the order this reader usually wants, and Architecture and Engineering Evidence are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Engineering lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Applications

Which application each unit belongs to, and each application's migration strategy. Membership is the customer's file only: a unit is confirmed when the selectors of exactly one application match it, a conflict when several applications claim it (it belongs to none of them), unassigned when no selector matches. A module name never makes an application.

By state: 2 groups PROPOSED by StackToIT (nobody has confirmed them, so none is an application yet): 0 Migration-ready · 0 blocked · 0 redesign · 2 not Migration-ready.

No applications file was given, so no unit is grouped into an application. Pass --applications FILE (stacktoit assess --help names the schema of the file) to state the applications and the selectors that assign units to them.

Proposed grouping: SUGGESTED. Suggested from the workloads of the source, not confirmed by the customer: these groups are a reading of names, tags and references in the Terraform. Nothing is an application until the applications file (--applications) or the review file states it, and where it does the stated applications win and the suggestion is shown as a diff against them.

PROPOSED APPLICATION GROUPS — not confirmed

One group per workload that is switched on: an ECS service, a Lambda function, a Kubernetes deployment, stateful set, daemon set, replication controller, pod, job or cron job, a load balancer with the instances and Auto Scaling groups it routes to, an instance or Auto Scaling group no load balancer fronts, or an EKS cluster when the estate holds no Kubernetes workload (such a group is a platform: its workloads are not visible in Terraform). A group holds its workload and the datastores, security groups, roles, log groups, secrets, keys and similar units that only that workload reaches: what the workload depends on (for an ECS service what its task definition names, for a Lambda function what its environment names, for a load balancer what it routes to), what those depend on in turn, the queues, streams, topics, buckets and EventBridge rules that feed a member (an event source mapping, a subscription, a rule target or the permission that names the rule, a bucket notification), the units a policy of a member names in a statement that is not a Deny, the units a DNS record that the workload names points at (a DNS record or a service-discovery registration that only points at a member is shown and adds no member), the datastore behind a security group whose ingress names a security group the workload itself uses, and the units that exist only for a member and depend on it (volumes, autoscaling targets, the secret of a database, the roles and node security group of a cluster, the Service, Ingress, autoscaler, network policy and disruption budget of a Kubernetes workload). An application tag the source states as a literal (Application, App, ApplicationName, AppName, ApplicationId, Workload, or Service where there is none of those) names the application: workloads that share the value are one group, a tagged unit no workload reaches joins the group of its value, and a unit tagged with another value than the group that reaches it is shared. A tag read from a variable is shown and never decides. A unit that more than one group reaches is shared and belongs to no group, unless exactly one of them carries the unit's tag value. The network, the ECS cluster and the gateways belong to no group, and a module name never makes one. A group is named by its application tag, else by the name of its workload, else by the family of its task definition, else by its address. For Google Cloud: a workload is a Cloud Run service, job or worker pool, a Cloud Function, a Compute Engine instance or managed instance group no load balancer fronts, the forwarding rule of a load balancer with the instances, groups and serverless services behind its backend services (the target proxy and the URL map are followed), or a GKE cluster when the estate holds no Kubernetes workload (a platform). A group holds the Cloud SQL, Memorystore, Spanner, Bigtable, Firestore, AlloyDB and Cloud Storage units, and the service accounts, secrets, keys, topics, queues, repositories, disks and addresses, that only the workload reaches: what its runtime configuration names (the environment and the secret mounts of a Cloud Run service or a Cloud Function), what those depend on in turn, and the resources an IAM role binding or member names together with the service account of a member (the role is not read, so it is a reference and not a stated grant). An application label the source states as a literal (application, app, workload, or service where there is none of those) names the application as a tag does; a label read from a variable is shown and never decides.

These groups are not applications: nobody has confirmed them, no unit is a member of an application because of them, and the state count above names them as groups, never as applications. To adopt a group, copy it (its id and selectors) into review/applications.yaml and set review: confirmed on it; an entry that stays review: proposed or is rejected claims no unit. The same groups, one row per group and per unit, are in migration/applications.csv.

Suggested groups, one per workload: the members and how many of them count in the totals of the estate
GroupWorkloadEvidenceMembersCounted in the totalsBy classDepends on
migrate
name from the resource label
Cloud Run service: google_cloud_run_v2_job.migratemedium confidence: reference in the Terraform, named in an IAM policy of a member
The references of the source make the group; no application tag confirms it.
33CONTAINERIZE 1, RECONFIGURE 2
server
name from the resource label
Cloud Run service: google_cloud_run_v2_service.servermedium confidence: reference in the Terraform
The references of the source make the group; no application tag confirms it.
22CONTAINERIZE 1, RECONFIGURE 1
migrate: 3 members (suggested)

Dependencies (PROPOSED group): No AWS SDK use found in the 4 code files in the whole source (no folder of this proposed group's units is known) (static scan of Python, JavaScript, TypeScript, Go, Java, Kotlin and C# files, origin STATIC_CODE_HINT).

  • Can it move now: 0 of 5 automated steps can run as written (4 more are free of decisions and manual prerequisites and wait for a value; 1 waits for decisions); 3 manual steps wait for decisions.
  • What blocks it: 2 of the 6 decisions to make hold its steps; the ones that free most: DEC-GEN-CONVERT-API-OPT-IN frees 3 steps of the plan by itself, DEC-GEN-CONVERT-SOURCE-REGION-MAPPING frees 1 step of the plan by itself; together 4 distinct steps of the plan.
  • How much work: 14 manual steps, 0 data moves. It also reaches 3 units that other groups reach as well: their 33 manual steps and 2 data moves (google_sql_database_instance.postgres, google_storage_bucket.media) are in none of the groups' figures.
  • To accept: 6 open security decisions (DEC-IAM-GOOGLE-CLOUD-RUN-V2-JOB-MIGRATE, DEC-IAM-GOOGLE-SECRET-MANAGER-SECRET-DJANGO-ADMIN-PASSWORD, DEC-IAM-GOOGLE-SERVICE-ACCOUNT-AUTOMATION, DEC-NET-GOOGLE-CLOUD-RUN-V2-JOB-MIGRATE and 2 more).
Unit and its Google Cloud resourceRoleReachedCounted in the totalsSTACKIT targetOpen decisionsOperator steps
google_cloud_run_v2_job.migrate
google_cloud_run_v2_job
the workloadthe workload itselfyesKubernetes Job/CronJob on SKE
candidates: stackit_ske_cluster
drafted: stackit_ske_cluster
DEC-GEN-CONVERT-SOURCE-REGION-MAPPING, DEC-IAM-GOOGLE-CLOUD-RUN-V2-JOB-MIGRATE and 4 morethe step "Decide how google_cloud_run_v2_job.migrate gets its application identity on…"
the review of the open settings of google_cloud_run_v2_job.migrate, google_cloud_run_v2_service.server, google_sql_database_instance.postgres and 1 more
and 7 more
google_secret_manager_secret.django_admin_password
google_secret_manager_secret
support resourcereferenced by a memberyesSTACKIT Secrets Manager
candidates: stackit_secretsmanager_instance, stackit_secretsmanager_user
drafted: stackit_secretsmanager_instance, stackit_secretsmanager_user
DEC-GEN-CONVERT-API-OPT-IN, DEC-GEN-CONVERT-PROPOSED-ALTERNATIVE and 2 morethe review of the open settings of google_secret_manager_secret.django_admin_password
the setting secret-settings of google_secret_manager_secret.django_admin_password
and 5 more
google_service_account.automation
google_service_account
support resourcereferenced by the workloadyesSTACKIT service account
candidates: stackit_service_account, stackit_authorization_project_role_assignment, stackit_authorization_folder_role_assignment, stackit_authorization_organization_role_assignment, stackit_authorization_service_account_role_assignment
drafted: stackit_service_account
DEC-IAM-GOOGLE-SERVICE-ACCOUNT-AUTOMATION, DEC-IAM-STACKITSA-STATEMENT-NOT-DRAFTEDthe step "Decide who may use the STACKIT service account written for…" for google_service_account.automation
the review of the open settings of google_service_account.automation
and 1 more
server: 2 members (suggested)

Dependencies (PROPOSED group): No AWS SDK use found in the 4 code files in the whole source (no folder of this proposed group's units is known) (static scan of Python, JavaScript, TypeScript, Go, Java, Kotlin and C# files, origin STATIC_CODE_HINT).

  • Can it move now: 0 of 2 automated steps can run as written (2 more are free of decisions and manual prerequisites and wait for a value); 1 manual step waits for decisions.
  • What blocks it: 1 of the 6 decisions to make holds its steps; no automated step is among the steps they hold, 1 manual step is; the ones that free most: DEC-GEN-CONVERT-SOURCE-REGION-MAPPING frees 1 step of the plan by itself.
  • How much work: 10 manual steps, 0 data moves. It also reaches 3 units that other groups reach as well: their 33 manual steps and 2 data moves (google_sql_database_instance.postgres, google_storage_bucket.media) are in none of the groups' figures.
  • To accept: 4 open security decisions (DEC-IAM-GOOGLE-CLOUD-RUN-V2-SERVICE-SERVER, DEC-IAM-GOOGLE-SERVICE-ACCOUNT-SERVER, DEC-NET-GOOGLE-CLOUD-RUN-V2-SERVICE-SERVER, DEC-SEC-GOOGLE-CLOUD-RUN-V2-SERVICE-SERVER).
Unit and its Google Cloud resourceRoleReachedCounted in the totalsSTACKIT targetOpen decisionsOperator steps
google_cloud_run_v2_service.server
google_cloud_run_v2_service
the workloadthe workload itselfyesSKE workload (or Cloud Foundry Docker app)
candidates: stackit_ske_cluster
drafted: stackit_ske_cluster
DEC-GEN-CONVERT-SOURCE-REGION-MAPPING, DEC-GEN-GOOGLE-CLOUD-RUN-V2-SERVICE-SERVER and 5 morethe step "Decide how google_cloud_run_v2_service.server gets its application identity on…"
the review of the open settings of google_cloud_run_v2_job.migrate, google_cloud_run_v2_service.server, google_sql_database_instance.postgres and 1 more
and 7 more
google_service_account.server
google_service_account
support resourcereferenced by the workloadyesSTACKIT service account
candidates: stackit_service_account, stackit_authorization_project_role_assignment, stackit_authorization_folder_role_assignment, stackit_authorization_organization_role_assignment, stackit_authorization_service_account_role_assignment
drafted: stackit_service_account
DEC-IAM-GOOGLE-SERVICE-ACCOUNT-SERVER, DEC-IAM-STACKITSA-STATEMENT-NOT-DRAFTEDthe step "Decide who may use the STACKIT service account written for…" for google_service_account.server
the review of the open settings of google_service_account.server
and 1 more

Units several groups reach

These units are members of no suggested group and are in no group's totals: more than one workload reaches each of them.

Not in the figures of any application or group: the units that more than one group reaches have 33 manual steps and 2 data moves (google_sql_database_instance.postgres, google_storage_bucket.media); the units that no application and no group holds have 9 manual steps and 0 data moves. These steps are in the plan and in its totals; the figures of an application or group count only the steps that name its own units.

Kubernetes manifests in the source — ties to Terraform

The source holds 2 Kubernetes objects and 0 Helm charts. Tied to a Terraform unit by an exact, literal match: 0. Not tied: 2; they belong to no proposed group, because nothing is guessed. A manifest object ties to a Terraform unit only when both state the same kind, the same name and the same namespace as literals (a kubernetes_* resource), or, for a Helm chart, when a helm_release names the chart by the literal local path of its folder. A name or namespace that is a variable, an expression or absent in the manifest ties nothing, and so does a namespace of the resource that is a variable or an expression; a kubernetes_* resource that states no namespace at all stands in the namespace default, which the hashicorp/kubernetes provider gives it, so only a manifest that states the namespace default ties to it. An object that more than one object or unit answers is not tied. A tie is evidence for the PROPOSED group that holds the unit (on every group that reaches a shared unit, labelled shared; on the tie itself when no group holds the unit) and never adds or removes a member. A Secret or ConfigMap that a manifest names and no manifest declares is resolved in Terraform only by the same literal name and namespace of exactly one kubernetes_secret or kubernetes_config_map. Every object, with its relations, is in migration/kubernetes-manifests.csv.

AWS SDK use in the application code of the source — STATIC_CODE_HINT

A static scan of the application code that sits inside the source you gave (4 code files read; it reads Python, JavaScript, TypeScript, Go, Java, Kotlin and C#): import and client tokens only, nothing executed and nothing downloaded. A hit is a hint, not proof of a runtime dependency: the code may be dead, behind a feature flag or never deployed. It changes no class, confidence, eligibility or step of the plan.

No AWS SDK use was found in the code files that were read.