DEV Community

Cover image for EC2 vs Lambda — When to Use Which (With Real Examples)
Prashik besekar
Prashik besekar

Posted on

EC2 vs Lambda — When to Use Which (With Real Examples)

The question every AWS developer gets asked. Here's the honest, practical answer.


The Confusion Is Real

When I first started learning AWS I was genuinely confused.

Both EC2 and Lambda run your code on AWS infrastructure. Both scale. Both are used by millions of companies.

So why do both exist? When do you use one over the other?

I spent weeks reading documentation and tutorials that gave me theoretical answers but no real clarity.

So I built things with both. Made mistakes with both. And now I'm writing the guide I wish existed when I started.

Let's settle this once and for all. 🚀


Quick Overview — What Are They?

EC2 (Elastic Compute Cloud)

EC2 is a virtual server in the cloud.

Think of it like renting a computer from AWS. You get a machine with a specific CPU, RAM, and storage. You install whatever you want on it. You run whatever you want on it. It runs 24/7 until you stop it.

You are responsible for:

  • The operating system
  • Installing software
  • Managing updates
  • Scaling when needed
  • Security configuration

Lambda

Lambda is serverless computing.

Think of it like a function that runs only when called. You write code. AWS runs it when triggered. You pay only for the exact milliseconds it runs. When it's not running — you pay nothing.

You are responsible for:

  • Just your code
  • Nothing else

AWS handles everything else automatically.


The Key Differences — Simple Table

Feature EC2 Lambda
Server management You manage everything AWS manages everything
Pricing Pay per hour running Pay per millisecond executed
Max runtime Unlimited 15 minutes maximum
Startup time Minutes Milliseconds
Scaling Manual or Auto Scaling Automatic instantly
State Stateful — keeps data Stateless — no memory between runs
Use case Long running processes Short event-driven tasks
Cost when idle Costs money always Costs nothing

EC2 — When to Use It

Use EC2 when your application runs continuously

If your application needs to be running 24/7 — EC2 is the right choice.

Real examples:

  • A web server serving your website all day
  • A Node.js API that needs to always be available
  • A database server running continuously
  • A background worker processing jobs constantly
# EC2 is perfect for this:
# A Node.js API server running all day
node server.js  # Runs continuously on EC2
Enter fullscreen mode Exit fullscreen mode

Use EC2 when you need more than 15 minutes

Lambda has a hard limit of 15 minutes per execution. If your task takes longer — EC2 is your only option.

Real examples:

  • Video processing — encoding a 2 hour video
  • Large data migrations — moving millions of records
  • Machine learning model training
  • Complex report generation

Use EC2 when you need full server control

Sometimes you need complete control over the environment.

Real examples:

  • Custom software that needs specific OS configuration
  • Legacy applications that can't be broken into functions
  • Applications with specific hardware requirements
  • When you need to install custom software or tools

Use EC2 when you have consistent predictable traffic

If you know your traffic is steady and consistent — EC2 is more cost effective.

Traffic pattern where EC2 wins:
Monday 9am - Friday 6pm: 1000 requests/hour consistently
EC2 cost: $0.0116/hour × 24 hours = $0.28/day
Lambda cost at this volume: More expensive
Enter fullscreen mode Exit fullscreen mode

Lambda — When to Use It

Use Lambda for event-driven tasks

Lambda shines when something happens and you need to react to it.

Real examples:

  • User uploads image to S3 → Lambda resizes it automatically
  • New record in DynamoDB → Lambda sends notification
  • API Gateway receives request → Lambda processes it
  • Scheduled task runs every hour → Lambda executes
# Perfect Lambda use case — resize image when uploaded to S3
import boto3
from PIL import Image
import io

def lambda_handler(event, context):
    s3 = boto3.client('s3')

    # Get the uploaded image details from event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    # Download image
    response = s3.get_object(Bucket=bucket, Key=key)
    image_data = response['Body'].read()

    # Resize image
    image = Image.open(io.BytesIO(image_data))
    image.thumbnail((800, 800))

    # Save resized image
    buffer = io.BytesIO()
    image.save(buffer, format='JPEG')
    buffer.seek(0)

    # Upload resized image
    s3.put_object(
        Bucket=bucket,
        Key=f"resized/{key}",
        Body=buffer
    )

    return {"statusCode": 200, "body": "Image resized successfully"}
Enter fullscreen mode Exit fullscreen mode

This runs only when an image is uploaded. Zero cost when nothing is uploaded. ✅

Use Lambda for unpredictable or spiky traffic

If your traffic is unpredictable — Lambda scales automatically with zero configuration.

Traffic pattern where Lambda wins:
Normal day: 10 requests/hour
Viral moment: 100,000 requests/hour suddenly
Lambda: Scales automatically, handles all requests
EC2: Would crash without manual intervention
Enter fullscreen mode Exit fullscreen mode

Use Lambda for small background tasks

Short tasks that run occasionally are perfect for Lambda.

Real examples:

  • Send welcome email when user registers
  • Clean up old files every night
  • Generate daily report at 6am
  • Validate data when form is submitted
# Perfect Lambda use case — send welcome email
import boto3

def lambda_handler(event, context):
    ses = boto3.client('ses', region_name='ap-south-1')

    user_email = event['email']
    user_name = event['name']

    ses.send_email(
        Source='hello@yourapp.com',
        Destination={'ToAddresses': [user_email]},
        Message={
            'Subject': {'Data': f'Welcome {user_name}!'},
            'Body': {'Text': {'Data': 'Thanks for joining us!'}}
        }
    )

    return {"statusCode": 200}
Enter fullscreen mode Exit fullscreen mode

Runs only when someone registers. Costs fractions of a rupee per execution. ✅

Use Lambda when you want zero server management

If you want to focus purely on code and not worry about servers — Lambda is perfect.

No OS updates. No security patches. No capacity planning. Just write your function and deploy.


Real World Architecture — Using Both Together

Here's the secret most tutorials don't tell you —

Most real applications use BOTH EC2 and Lambda together.

They're not competitors. They're teammates.

Example — A Real Application Architecture

User visits website
        ↓
EC2 — Node.js API Server (runs 24/7)
        ↓
User uploads profile photo
        ↓
Photo saved to S3
        ↓
Lambda triggered automatically
        ↓
Lambda resizes photo to 3 sizes (thumbnail, medium, large)
        ↓
Resized photos saved back to S3
        ↓
EC2 API notified — updates user profile

User registers
        ↓
EC2 saves user to MongoDB
        ↓
Lambda triggered — sends welcome email
        ↓
Another Lambda — creates free trial in billing system
Enter fullscreen mode Exit fullscreen mode

EC2 handles the main application. Lambda handles event-driven tasks around it. Perfect combination. 💪


Cost Comparison — Real Numbers

Scenario 1 — Simple API with low traffic

EC2 t2.micro running 24/7:

  • Cost: $0.0116/hour × 720 hours = $8.35/month
  • Whether you get 1 request or 10,000 requests — same cost

Lambda for same API:

  • 100,000 requests/month × avg 200ms = $0.20/month
  • Pay only for actual usage

Winner for low traffic: Lambda 🏆

Scenario 2 — High traffic application

Lambda at 10 million requests/month:

  • 10M requests × avg 500ms × 512MB memory
  • Cost: approximately $16.70/month

EC2 t2.medium handling same traffic:

  • Cost: $0.0464/hour × 720 hours = $33.41/month

Winner for high traffic: Lambda 🏆

Scenario 3 — Always-on complex application

EC2 running a full MERN stack:

  • Predictable cost — $8-35/month depending on instance
  • Everything included — database, API, frontend

Lambda for same complex app:

  • Cold starts add latency
  • State management is complex
  • Can become expensive at scale

Winner for always-on complex apps: EC2 🏆


The Decision Framework

Ask yourself these 4 questions:

Question 1: Does it need to run longer than 15 minutes?
YES → EC2
NO → Continue

Question 2: Is it triggered by an event?
YES → Lambda
NO → Continue

Question 3: Is traffic unpredictable or spiky?
YES → Lambda
NO → Continue

Question 4: Do you need full server control?
YES → EC2
NO → Lambda probably works
Enter fullscreen mode Exit fullscreen mode

Common Mistakes I've Seen

Mistake 1 — Using EC2 for everything

Running EC2 24/7 for a task that runs once a day. Lambda would cost 99% less.

Mistake 2 — Using Lambda for long processes

Trying to process a large video with Lambda — it times out at 15 minutes every time.

Mistake 3 — Ignoring cold starts with Lambda

Lambda functions that haven't run recently take 1-3 seconds to start. For real-time APIs this can frustrate users.

Fix: Use Provisioned Concurrency for latency-sensitive Lambdas, or keep them warm with scheduled pings.

Mistake 4 — Not considering state

Lambda is stateless — it doesn't remember anything between invocations. If your application needs to maintain state — EC2 or use external storage like Redis.


Quick Decision Guide

Your situation Use
Web server always running EC2
Process triggered by S3 upload Lambda
Video encoding job EC2
Send notification on event Lambda
Machine learning training EC2
Scheduled daily report Lambda
Full stack application EC2
Microservices Lambda
Unpredictable traffic spikes Lambda
Consistent steady traffic EC2

What I Use in My Projects

For my personal projects I use both:

EC2 — for my main Nginx web server that serves my portfolio site. Needs to be always available. Makes sense to run continuously.

Lambda — for small background tasks like sending notifications, processing uploads, and scheduled cleanups. Runs only when needed. Costs almost nothing.

The combination gives me the best of both worlds — reliability from EC2, efficiency from Lambda.


Final Thoughts

EC2 and Lambda are both powerful tools. Neither is universally better.

The right choice depends on your specific use case — how long your task runs, how predictable your traffic is, and how much control you need.

Now you have a clear framework to make that decision every time. 💪

Start with Lambda for new projects — it's simpler to get started and cheaper for low traffic. Add EC2 when you need more control or longer running processes.

And remember — most real applications use both. They're teammates, not competitors.


Follow LearnWithPrashik for more practical AWS and backend development content.

Connect with me:
LinkedIn: linkedin.com/in/prashik-besekar
GitHub: github.com/prashikBesekar

Top comments (0)