AWS Retail Store Sample App
Explore how StackToIT analyzed the AWS Retail Store Sample App and generated a structured migration assessment, proposed STACKIT infrastructure, architecture diagrams and a detailed migration plan.
- Route
- AWS STACKIT
- Status
- Migration assessment generated
- Resources analyzed
- 282
- Migration units identified
- 44
- Target units drafted
- 38 of 52 considered
Overview
A five-service retail application on Amazon ECS: Aurora, DynamoDB, OpenSearch, ElastiCache and Amazon MQ behind an Application Load Balancer. StackToIT read the ECS Terraform estate and wrote a STACKIT migration package.
What stood out
Nothing is DIRECT
All 44 present units need at least a reconfiguration: 34 RECONFIGURE, 9 REPLATFORM (ECS → SKE, Aurora → MariaDB/PostgreSQL Flex, OpenSearch), 1 REDESIGN (DynamoDB has no STACKIT counterpart; MongoDB Flex or PostgreSQL JSONB are the named options).
The source provider is unpinned, so the source was not validated
The upstream estate commits no .terraform.lock.hcl. StackToIT caps every unit at MEDIUM confidence, marks none automation-eligible, and does not run OpenTofu validation on the source, with or without a provider mirror, because no lock file states which provider version to validate against. It names the two remedies (commit a lock file with aws 5.100.0, or raise the constraint to ~> 6.0 and lock 6.67.0); only a lock file and a source validation show that either works.
Catalog is deployment-blocked
The catalog service depends on OpenSearch 3.3; the STACKIT region offers version 2. The draft stays blocked until a test shows the application works on that version or an architecture decision is recorded.
Four STACKIT API steps wait for an opt-in
Secrets Manager steps call a pre-release STACKIT API. The plan does not make the calls until the customer allows them in the decisions file; this is the first required action of the run.
No cost comparison is stated
The source does not name its AWS region, so no AWS price was fetched. 5 of 14 STACKIT lines are priced (878.34 EUR partial, list prices); the report refuses to call a one-sided subtotal a saving.
Source infrastructure
The retail-store-sample-app by AWS Containers is a sample retail application: five services (ui, catalog, carts, checkout, orders) on Amazon ECS behind an Application Load Balancer, with Aurora (catalog, orders), DynamoDB (carts), OpenSearch (catalog), ElastiCache (checkout) and Amazon MQ as managed dependencies in one VPC. The estate assessed is its terraform/ecs/default root module and the local terraform/lib modules it calls.
The estate was assessed exactly as published upstream: nothing in it was edited. It ships no .terraform.lock.hcl. Because of that the source provider is UNPINNED and the OpenTofu validation of the source did not run, even with a provider mirror prepared beforehand: StackToIT validates a source only against the provider versions its lock file records, and will not pick one for it.
Source visibility as read by StackToIT: Partial runtime topology — 8 units have a count/for_each decided only when OpenTofu plans. Domains of the 44 units: network 16, identity 15, compute 6, data 5, observability 1, messaging 1.
Assessment summary
Classification of the 44 units present in the source, as the knowledge base 0.384.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
- 34 RECONFIGURE same kind of service, settings change
- 9 REPLATFORM a different managed service
- 0 CONTAINERIZE packaged into a container first
- 1 REDESIGN no counterpart; the architecture changes
- 0 MANUAL_REVIEW a person decides
- 0 BLOCKED cannot move as it stands
Applications
5 applications proposed by StackToIT from the service structure, none confirmed by a customer: 0 ready · 1 blocked · 2 redesign · 2 not ready.
| Application | State | Why |
|---|---|---|
| carts | REDESIGN | DynamoDB table is a REDESIGN (MongoDB Flex, data-model change) |
| catalog | BLOCKED | OpenSearch engine downgrade 3.3 → 2 until tested or decided |
| checkout | REDESIGN | shares the DynamoDB redesign; TLS-only Valkey endpoint for ElastiCache clients |
| orders | NOT READY | environment values required; workload identity undecided |
| ui | NOT READY | workload identity undecided; functional check not run |
Cost
Source region unknown (30 AWS lines wait for source.aws.region); 9 of 14 STACKIT lines have no price; 10 billable source resources are outside the model.
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.
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.
Three measures, not one
The plan, step by step
8 unanswered decisions rest on a draft default (public endpoint 5, size derived from the source 3); the register groups them in 2 records.
Open decisions and inputs
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: 38 of the 52 units the draft considered (44 present in the source, 8 decided only when OpenTofu plans) have a generated resource; 11 need none and 3 are left to the architect. 60 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.
- README.md44.0 KB
- applications/carts.json13.3 KB
- applications/carts.templates.yaml1.3 KB
- applications/catalog.json15.1 KB
- applications/catalog.templates.yaml1.4 KB
- applications/checkout.json10.9 KB
- applications/checkout.templates.yaml1.4 KB
- applications/orders.json13.6 KB
- applications/orders.templates.yaml1.9 KB
- applications/ui.json6.8 KB
- applications/ui.templates.yaml1.3 KB
- data.tf39.4 KB
- handover/cache-dependencies_checkout_elasticache_redis_default/data-move.md29.4 KB
- handover/cluster-access/kubeconfig.md5.1 KB
- handover/database-dependencies_catalog_rds_this/data-move.md30.1 KB
- handover/database-dependencies_orders_rds_this/data-move.md23.3 KB
- handover/search-dependencies_catalog_opensearch_this/data-move.md16.0 KB
- handover/table-dependencies_dynamodb_carts_this/data-move.md15.9 KB
- identity.tf35.0 KB
- kubernetes/carts/manifests.yaml9.2 KB
- kubernetes/catalog/manifests.yaml9.4 KB
- kubernetes/checkout/manifests.yaml9.2 KB
- kubernetes/orders/manifests.yaml10.5 KB
- kubernetes/ui/manifests.yaml10.6 KB
- kubernetes.tf8.9 KB
- loadbalancing.tf6.4 KB
- messaging.tf6.3 KB
- network.tf12.7 KB
- observability.tf5.1 KB
- security.tf49.3 KB
- terraform.tf439 B
- variables.tf39.0 KB
Plans and documents
- executive/brief.mdexecutive brief
- executive/decisions.mddecision register
- execution/README.mdexecution package
- execution/manual/actions.mdmanual actions
- migration/roadmap.mdroadmap
- migration/data-movement.mddata movement
- console.txtconsole output
- manifest.jsonmanifest
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.
Pages of the report
Provenance
stacktoit assess terraform/ecs/default ./aws-retail-store --provider-mirror /path/to/mirrorRun from the vendored copy of the upstream repository. A local OpenTofu provider mirror (hashicorp/aws 5.100.0, the version the constraints resolve to) was prepared first with `tofu providers mirror`, as the first run's console suggested; the source validation still did not run because the source has no lock file. The output directory is this example's output/ folder, unchanged.stacktoit verify ./aws-retail-storeVERIFIED — 143 files match manifest.json (size and SHA-256); 7 of 7 checks PASSWhat has been established, and what has not
| Check | State | Scope |
|---|---|---|
| Source completeness | PARTIAL | source status RUNTIME_TOPOLOGY_PARTIAL: 8 unit(s) have a count/for_each that is not known statically; whether and how often they exist is decided at plan time |
| Source provider | UNPINNED | aws constraints ~> 5.0, tested against 5.100.0; No lock file entry pins this provider, so the version a plan would use is not proven; the knowledge base was checked against one version only. Until the exact version is pinned (commit .terraform.lock.hcl), the units of this provider are capped at MEDIUM confidence and are not automation eligible. |
| Source validation (OpenTofu) | NOT_RUN | LOCK_FILE — the source has no dependency lock file (.terraform.lock.hcl), so provider identity and integrity cannot be verified; the validation never updates it (Provider dependency changes detected). No validation result exists; this is neither a pass nor a failure of the source. |
| Draft generation | GENERATED | the draft is in terraform/ |
| Draft checks (StackToIT) | PASSED | 100 checks, none found a violation |
| Global invariants | PASSED | 12 of 12 invariants PASS |
| Draft validation (OpenTofu) | PASSED | tofu 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) | VERIFIED | 143 files match manifest.json; EVIDENCE, SCHEMA, RUN_ID, BASIS, INPUTS_DIGEST, INVALIDATION_KEYS, EXECUTION_PLAN PASS |
| Stackit Plan | NOT_RUN | this build runs no plan against a STACKIT project |
| Architect Approval | NOT_PROVIDED | no review decision is recorded for this run |
| Semantic Equivalence | NOT_ASSESSED | this build has no measure for it |
| Safe To Apply | NOT_ASSERTED | StackToIT 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.
Planning a migration to STACKIT?
Let's explore how StackToIT can help assess your infrastructure and prepare a structured migration plan.