AWS Microservices Migration & Cost Optimization
Tech: .NET Core, AWS SQS, Lambda, API Gateway, Fargate, ECS, Terraform
Context: Legacy Classic ASP/.NET 4.6.1 app with rising ops costs, brittle release cycles, and scaling challenges.
Approach: Domain assessment → microservice decomposition → serverless patterns (SQS/Lambda) where fit → containers on Fargate/ECS for others. Introduced CI/CD with CodeBuild/CodePipeline and Infra as Code.
What changed: Work that used to happen inline during a request became messages on a queue, so a slow or failing consumer stopped being an outage and became a backlog with a dead-letter queue behind it. Capacity followed load instead of being provisioned for the worst hour of the month, and infrastructure became a file in the repository rather than a configuration somebody remembered making.
What it cost: Queue-backed decomposition buys resilience by giving up the thing a monolith gives away free — a single place to look when something is wrong. Every asynchronous boundary needs idempotent handlers, because at-least-once delivery means a message arrives twice eventually, and it needs correlation IDs threaded through, or a failed operation is spread across four services with nothing joining them up. That work is not optional and it is not visible in a diagram.