Placing LocalStack within the SDLC: from development and unit testing to integration testing, migration strategies to real AWS in staging and CI, a golden path for teams, and Pro features like Cloud Pods, Web Application, and AWS Replicator.

In episode 20 we mapped the 2026 releases: calendar versioning, a single image, and the stable 2026.07.0 features. But having a great emulator doesn't mean the team's workflow becomes great. The real question: at which point does LocalStack enter the software development lifecycle (SDLC), and how do you leave it smoothly?
This episode builds that bridge. You'll see LocalStack's role in each SDLC phase, a gradual migration strategy to real AWS without drastically changing code, a golden path the whole team can use, and the Pro and Ultimate features that make cross-developer collaboration far more practical.
| SDLC Phase | LocalStack's Role | Key Tools |
|---|---|---|
| Development | Fast feedback loop at no AWS cost | localstack start, PERSISTENCE=1 |
| Unit test | Pure mocking for logic | test framework, moto |
| Integration test | Full cross-service emulation | Testcontainers, awslocal |
| Staging / CI | Parity verification before deploy | service container, health check |
| Production | Not used; replaced by real AWS | production endpoint |
This is the most basic use: server running, code changing, fast testing. In this phase speed is everything — LocalStack gives you a feedback loop in seconds rather than minutes, and with zero AWS cost.
localstack start
awslocal sts get-caller-identity
awslocal sqs create-queue --queue-name orders-devTip
Use PERSISTENCE=1 in development so state doesn't disappear every time the image restarts — imagine having to recreate your DynamoDB table every morning because the container changed.
Unit tests target a single component, and here mocking (e.g. moto) is still reasonable because we're testing pure logic. But once a test touches cross-service interactions — S3 triggering a Lambda that writes to DynamoDB — mocking starts to lie. That's the point where LocalStack comes in.
For integration tests, the cleanest approach is Testcontainers: a LocalStack container is spawned automatically when the test starts and destroyed when it finishes. Every test suite gets a clean emulator, with no port conflicts between parallel tests. This maintains the isolation that was the theme of episode 15.
The common pattern: the localstack/localstack:stable image is created once per test run, the /_localstack/health health endpoint is waited on, then tests run. The only thing changing in the application code is the endpoint URL.
LocalStack's design from the start: the same code runs locally and on AWS — only the endpoint differs. If you consistently use AWS_ENDPOINT_URL with modern SDKs, or store the endpoint in a single configuration point, migrating to staging is just a matter of removing that endpoint.
# Lokal: menunjuk ke emulator
export AWS_ENDPOINT_URL=http://localhost:4566
# Staging: hapus variabel, SDK memakai AWS asli
unset AWS_ENDPOINT_URLDon't move everything at once. A healthy order:
In CI, run LocalStack as a service container with exactly the same image and version as locally:
jobs:
test:
services:
localstack:
image: localstack/localstack:stable
env:
SERVICES: s3,sqs,dynamodb
ports:
- 4566:4566Wait for the health endpoint to be ready before tests start: curl http://localhost:4566/_localstack/health — the same pattern as episode 19. To monitor errors, use localstack logs --follow | grep -i error.
"Works on my machine" is born from differing configurations. A golden path removes that variation with a single source of truth:
docker-compose.yml used by all developers, including CI.SERVICES, PERSISTENCE, DEBUG.The result: every team member — and the CI robot — tests exactly the same thing. Behavioral differences only appear from version differences, not from setup.
Cloud Pods are LocalStack state snapshots shareable across machines. Instead of re-simulating a tricky bug, a developer simply saves a pod and a colleague loads it.
localstack cloudpod create bug-repro-orders
localstack cloudpod save bug-repro-orders
localstack cloudpod load bug-repro-ordersThe most valuable use case: bug reproduction across teams and across CI. A pod stores the entire state — tables, queues, objects — so "reproduce in this environment" becomes a single command.
The Web Application (app.localstack.cloud) provides a graphical view of your instance: seeing active services, created resources, and managing Cloud Pods from the browser. For quick observability while debugging, this is far more comfortable than guessing from logs.
AWS Replicator (episode 17) pulls resources from a real AWS account into LocalStack — SNS, RDS, VPC, IAM, and more. This transforms regression testing: instead of synthetic data, you test against real resource structure.
awslocal replicator all --sns --iam --region us-east-1The ecosystem extends beyond AWS: LocalStack for Snowflake and LocalStack for Azure apply the same emulation approach to other ecosystems. If your team is multi-cloud, that means one development pattern — emulate, test, migrate — applies everywhere.
All the features above run behind a Pro/Ultimate license, with enterprise support: SLA, internal deployment, and direct access to the engineering team. For startups and small teams, the Community features already cover most needs; move to Pro when state collaboration and advanced parity become requirements.
Summary of this episode:
LocalStack isn't a replacement for AWS — it's a bridge to AWS. In episode 22 — the final episode of this series — we compare LocalStack with other alternatives (moto, SAM Local, Testcontainers Cloud, sandbox accounts), recap the entire journey from episodes 0 to 22, and close with a production-grade emulation checklist and the future direction of cloud emulation. See you at the finale!