DEV Community

Cover image for Knowing AWS Services Isn't Enough. Knowing When NOT to Use Them Is.
Shashank Pandey
Shashank Pandey

Posted on Originally published at builder.aws.com

Knowing AWS Services Isn't Enough. Knowing When NOT to Use Them Is.

We learn Amazon SQS, Lambda, SNS, EventBridge, DynamoDB, ElastiCache, and API Gateway. Then we start building projects, and suddenly, every operation needs a queue, every function deserves a Lambda, and every interaction becomes an event.
Before we realize it, we've built an architecture that looks impressive on a diagram but is unnecessarily complicated to maintain.

AWS services should be like salt in tea, not sugar. The point isn't that salt belongs in tea; it's that adding more of something doesn't automatically make the result better. Every component needs a reason to exist.
The Problem with Overengineering
Imagine building a backend application that accepts requests, processes data, stores it in a database, and returns a response. A straightforward backend and database might be enough.
But what if we introduce API Gateway, Lambda, SQS, SNS, EventBridge, and several other services without identifying a real need for them? We've added infrastructure to manage, IAM permissions to configure, failure scenarios to debug, and costs to monitor. We've also introduced distributed-systems challenges such as retries, duplicate messages, and eventual consistency.
These services are powerful, but power without purpose creates complexity.
The Right Service Depends on the Problem
Consider three common architectural decisions:
Amazon SQS: Excellent for decoupling components and processing background jobs asynchronously. But does a simple request-response operation really need a queue?

AWS Lambda: Great for event-driven workloads and tasks that benefit from managed execution. But is it the right choice for every long-running service?

Amazon ElastiCache: Useful when caching can meaningfully reduce database load and latency. But does your application actually have a caching problem?

The answer depends on your workload, reliability requirements, expected traffic, budget, and operational capabilities.
The mistake is choosing a service because you know it exists rather than because you've identified a problem it solves.
A Lesson from My Backend Development Experience
Working across backend technologies has taught me to think about requirements before adding another component.
For example, in a straightforward CRUD application, I'd first focus on sound API design, appropriate database queries, authentication, and error handling. I'd consider asynchronous processing when the workload justifies it, and caching when measurements show that repeated reads are creating a bottleneck.
Introducing a message broker or caching layer prematurely can create more maintenance work than value.
This doesn't mean avoiding AWS services. It means understanding why you're introducing them in the first place.
Build for the requirements you have, not the architecture you want to show off.
How to Design Better Cloud Architectures
My approach comes down to five principles:
Understand the requirements. Establish expected traffic, latency, availability, and budget before selecting services.

Start simple. Build the smallest architecture that meets those requirements.

Measure before optimizing. Identify real bottlenecks instead of solving hypothetical problems.

Add services with intent. Every additional component should solve a specific problem that justifies its operational cost.

Revisit decisions as you scale. What works for a small application may not work at a much larger scale, and that's perfectly fine.

Simplicity Is an Engineering Skill
There's a difference between an architecture that's simple because someone overlooked important requirements and one that's simple because an engineer deliberately avoided unnecessary complexity.
The first can be dangerous. The second takes judgment.
Sometimes the right solution is a distributed, event-driven architecture involving multiple AWS services. Sometimes it's a backend, a database, and a straightforward deployment.
Neither approach is inherently superior. The requirements determine the answer.

A diagram containing fifteen AWS services isn't automatically more impressive than one containing three. Choosing three when fifteen would be unnecessary might demonstrate better engineering judgment.

The goal isn't to use every service AWS offers. It's to build systems that are reliable, secure, maintainable, and cost-effective.
Learn the services. Understand their trade-offs. Experiment with them. But never confuse using more services with being a better engineer.

Knowing what to use matters. Knowing what NOT to use matters just as much.

Top comments (0)