← Back to list

I Wasted Years Doing AWS the Hard Way — These 7 Services Changed Everything

The moment I stopped fighting the cloud and started letting it work for me

Nazia Saeed in Write A Catalyst · 2026-02-03 16:20 · 92 claps · 3.4 min read paywalled
#aws #aws-lambda-functions #data-science #programming #web-development
Open on Medium ↗
Wiki topics: ML · Machine Learning 💻 · Programming 🌐 · Web Development ☁️ · DevOps & Cloud 🔬 · Science · General

Image by author

Image by author

I Wasted Years Doing AWS the Hard Way — These 7 Services Changed Everything

The moment I stopped fighting the cloud and started letting it work for me

I still remember the night I rage-quit AWS.

It was 2:13 AM. My coffee was cold, my EC2 instance wouldn’t connect, my logs were scattered across three places, and I had just spent 40 minutes SSH-ing into a server to restart a Python script like it was 2012. I leaned back and thought, “This can’t be what ‘the cloud’ was supposed to feel like.”

I wasn’t building systems. I was babysitting them.

Four years into Python. Decent at architecture. Yet somehow I was using AWS like an expensive remote computer instead of an automation machine. The turning point came when I stopped asking, “How do I host this?” and started asking, “How do I never touch this again?”

That shift led me to seven AWS services that quietly replaced half my manual work. If you’re still SSH-ing, cron-ing, or duct-taping scripts together… this is your intervention.

1. Lambda: I stopped managing servers and nothing broke

I used to spin up EC2 for everything. Cron jobs? EC2. Background workers? EC2. Tiny automation scripts? Yep… EC2 again.

Lambda felt “limited” until I realized most of my tasks were just short Python functions pretending to be servers.

Now my automations are just event-driven functions.

Example: Auto-process files uploaded to S3

import json

def lambda_handler(event, context):
    for record in event['Records']:
        file_name = record['s3']['object']['key']
        print(f"New file uploaded: {file_name}")
        # Trigger processing logic here
    return {"status": "done"}

This runs automatically whenever a file lands in S3. No server. No daemon. No SSH.

Bold opinion: If your script runs for under 10 minutes and doesn’t need a GPU, you probably don’t need a server.

2. S3: My new hard drive, message queue, and trigger system

I used to think S3 was just storage. It’s actually an automation hub.

Now I use S3 to:

  • Trigger pipelines
  • Store intermediate data
  • Version outputs
  • Archive logs automatically

Uploading files programmatically

import boto3

s3 = boto3.client('s3')

s3.upload_file("report.csv", "my-automation-bucket", "reports/report.csv")
print("Uploaded successfully")

Upload → Event fires → Lambda runs → Processing happens. That’s an entire backend without a single running server.

3. EventBridge: The cron replacement I wish I found earlier

I ran cron jobs on EC2 for years. When the server died, so did my automations.

EventBridge schedules tasks without machines.

Trigger a Lambda every morning

import boto3

events = boto3.client("events")

events.put_rule(
    Name="DailyJobRule",
    ScheduleExpression="cron(0 9 * * ? *)",
    State="ENABLED"
)

Attach this to a Lambda and AWS handles the rest.

Pro tip: The best automation is the one you forget exists because it never fails.

4. Step Functions: I stopped writing fragile workflow code

My old pipelines looked like spaghetti: retries inside retries, nested try/except blocks, manual state tracking.

Step Functions gave me visual workflows with built-in retries.

Instead of:

try:
    step1()
    step2()
    step3()
except Exception:
    retry_logic()

I now define workflows where AWS handles:

  • Retries
  • Failures
  • Branching logic

I write less glue code and more actual logic.

5. DynamoDB: When I needed state but not a database headache

I resisted DynamoDB because “NoSQL sounded scary.” Turns out, for automation metadata, it’s perfect.

I use it to track:

  • Job statuses
  • Processed files
  • Idempotency keys

Insert tracking data

import boto3
from datetime import datetime

table = boto3.resource("dynamodb").Table("job-tracker")

table.put_item(Item={
    "job_id": "file_123",
    "status": "processed",
    "timestamp": datetime.utcnow().isoformat()
})

No schema migrations. No server maintenance. Just state storage that scales forever.

6. SQS: My safety net for unreliable tasks

Before SQS, a failed API call could break an entire pipeline.

Now I queue tasks and process them asynchronously.

Send a message to a queue

import boto3

sqs = boto3.client("sqs")
queue_url = "https://sqs.us-east-1.amazonaws.com/123456789012/my-queue"

sqs.send_message(
    QueueUrl=queue_url,
    MessageBody="process_file_456"
)

If processing fails? Message goes back into the queue. No data loss. No panic.

7. CloudWatch Logs: I finally stopped SSH-ing just to debug

Logging used to mean:

  1. SSH into server
  2. Find the log file
  3. Grep like a caveman

Now everything logs centrally.

Logging inside Lambda

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info("Function started")
    # your logic
    logger.info("Function completed")

Searchable. Filterable. No servers involved.

The Automation Mindset That Changed Everything

Here’s the mental shift that took me years:

Old me asked: How do I run this Python script on AWS?

New me asks: What event should trigger this, and how do I make sure I never manage it again?

That one question removed:

  • Server patching
  • Cron babysitting
  • Manual restarts
  • Log hunting
  • Scaling anxiety

AWS stopped being infrastructure and started being an automation engine.

If You’re Still Doing AWS the Hard Way

If your workflow involves:

  • SSH
  • Manual restarts
  • Long-running EC2 scripts
  • Custom retry logic

You’re not building cloud systems. You’re renting someone else’s computer.

Start small:

  1. Move one cron job to EventBridge
  2. Move one script to Lambda
  3. Store one state table in DynamoDB

That’s how I started. One lazy decision at a time.

And ironically, that laziness is what finally made my systems scalable.


메타데이터
post_id
5d98c8ea31db
slug
i-wasted-years-doing-aws-the-hard-way-these-7-services-changed-everything-5d98c8ea31db
url
https://medium.com/write-a-catalyst/i-wasted-years-doing-aws-the-hard-way-these-7-services-changed-everything-5d98c8ea31db
canonical_url
https://medium.com/write-a-catalyst/i-wasted-years-doing-aws-the-hard-way-these-7-services-changed-everything-5d98c8ea31db
author_url
https://medium.com/@smartoonaaz
status
ok
fetched_at
2026-06-22 19:40:15