Case Studies
Aug 20248 min read

Case Study: Serverless Cloud Architecture for a Rewards-Based Social Network

Design and implementation of serverless infrastructure on AWS for an innovative social network featuring a proprietary coin system and redeemable rewards.

FT

Felix Tineo

Technology Strategist · Fractional CTO

Case Study: Serverless Cloud Architecture for a Rewards-Based Social Network

The Project: An Innovative Social Network

A startup wanted to launch a disruptive social network where users earned virtual coins through interactions (posts, likes, comments) that they could later redeem for real products, discounts, or services.

My Role: Cloud Consultant & Architect

I was hired as a cloud specialist consultant to:

  • Design the complete architecture on AWS
  • Implement scalable serverless infrastructure
  • Set up CI/CD pipelines
  • Establish security best practices
  • Mentor the development team

The Technical Challenge

Business Requirements

  • Massive scalability: Ready for millions of users
  • Optimized costs: Startup with a limited budget
  • Fast time-to-market: Launch in 4 months
  • Reliable coin system: Precise transactions with no losses

Technical Requirements

  • High availability: 99.9% minimum uptime
  • Low latency: Responses < 200ms
  • Auto-scaling: No manual intervention
  • Security: Compliance with financial regulations

The Solution: Serverless Architecture

We decided to go 100% serverless on AWS because:

  • Pay-per-use: You only pay for what you use (ideal for startups)
  • Auto-scaling: Automatic scaling with zero configuration
  • Minimal maintenance: No servers to patch
  • Rapid development: Focus on business logic, not infrastructure

High-Level Architecture

+-----------------------------------------------------+
|              CloudFront (CDN)                        |
|         SSL, caching, DDoS protection                |
+---------------+-------------------------------------+
                |
         +------v--------+
         | API Gateway   | (REST + WebSocket)
         +------+--------+
                |
     +----------+----------+
     |                      |
+----v-----+          +-----v------+
| Lambda   |          |  Lambda    |
|  Auth    |          | Functions  | (Microservices)
+----+-----+          +-----+------+
     |                      |
     |      +---------------+---------------+
     |      |               |               |
+----v------v----+   +------v------+  +-----v------+
|  DynamoDB      |   |   RDS       |  |    SQS     |
| (NoSQL)        |   | (Postgres)  |  |  (Queue)   |
| Users, Posts   |   |   Wallet    |  |   Jobs     |
+----------------+   +-------------+  +------------+

Architecture Components

1. Frontend: React SPA on S3 + CloudFront

S3 Bucket (Static Hosting)
  +-- React App (build artifacts)
      +-- CloudFront Distribution
          +-- SSL Certificate (ACM)
          +-- Caching rules
          +-- WAF (Web Application Firewall)

Benefits:

  • Ultra-cheap hosting ($1-5/month)
  • Low global latency (CDN edge locations)
  • Infinite automatic scaling
  • HTTPS by default

2. API Gateway: The Front Door

We implemented two types of APIs:

REST API (CRUD operations)

// Endpoint example
POST /api/posts
GET /api/posts/:id
PUT /api/posts/:id
DELETE /api/posts/:id

WebSocket API (Real-time)

// Real-time notifications
ws://api.example.com
  +-- $connect (on user connection)
  +-- $disconnect (on user disconnection)
  +-- sendMessage (broadcast to users)

Configured features:

  • Rate limiting (1000 req/second per user)
  • API Keys for integrations
  • CORS configured
  • Request/Response validation
  • CloudWatch logging

3. Lambda Functions: Business Logic

Serverless microservices architecture:

functions/
+-- auth/
|   +-- login.ts
|   +-- register.ts
|   +-- refresh-token.ts
+-- posts/
|   +-- create-post.ts
|   +-- get-posts.ts
|   +-- delete-post.ts
+-- wallet/
|   +-- get-balance.ts
|   +-- earn-coins.ts
|   +-- redeem-coins.ts
+-- notifications/
    +-- send-notification.ts
    +-- websocket-handler.ts

Lambda Function example:

// functions/posts/create-post.ts
import { APIGatewayProxyHandler } from 'aws-lambda'
import { DynamoDB } from 'aws-sdk'
import { v4 as uuid } from 'uuid'

const dynamodb = new DynamoDB.DocumentClient()

export const handler: APIGatewayProxyHandler = async (event) => {
  const userId = event.requestContext.authorizer.claims.sub
  const { content, imageUrl } = JSON.parse(event.body)

  const post = {
    id: uuid(),
    userId,
    content,
    imageUrl,
    likes: 0,
    createdAt: Date.now()
  }

  // Save to DynamoDB
  await dynamodb.put({
    TableName: process.env.POSTS_TABLE,
    Item: post
  }).promise()

  // Award coins for posting (async)
  await awardCoins(userId, 10, 'post_created')

  return {
    statusCode: 201,
    body: JSON.stringify(post)
  }
}

4. Databases: Hybrid DynamoDB + RDS

DynamoDB (NoSQL) for:

  • Users: User profiles
  • Posts: Social content
  • Interactions: Likes, comments
  • Timeline: User feed

Why DynamoDB:

  • Auto-scaling
  • Consistent latency (single-digit ms)
  • Ideal for key-value patterns
  • Pay-per-request pricing

RDS PostgreSQL for:

  • Wallet: Coin and transaction system
  • Orders: Redemption orders
  • Transactions: Complete history

Why RDS for the wallet:

  • ACID transactions (critical for money)
  • Complex queries (financial reports)
  • Automatic backups and point-in-time recovery

5. Cognito: Managed Authentication

AWS Cognito User Pool
  +-- Email/Password authentication
  +-- Social logins (Google, Facebook)
  +-- JWT tokens (access + refresh)
  +-- MFA support
  +-- Password policies

Benefits:

  • No writing auth code (error-prone)
  • Enterprise-grade security
  • Auto-scaling
  • Built-in compliance (GDPR, HIPAA)

6. Coin System: Reliable Architecture

The wallet system was designed for financial consistency:

// Atomic transaction for earning coins
async function earnCoins(userId: string, amount: number, reason: string) {
  const client = await pool.connect()

  try {
    await client.query('BEGIN')

    // 1. Update balance
    await client.query(`
      UPDATE wallets
      SET balance = balance + $1,
          updated_at = NOW()
      WHERE user_id = $2
    `, [amount, userId])

    // 2. Create transaction record
    await client.query(`
      INSERT INTO transactions (user_id, type, amount, reason, created_at)
      VALUES ($1, 'earn', $2, $3, NOW())
    `, [userId, amount, reason])

    await client.query('COMMIT')
  } catch (error) {
    await client.query('ROLLBACK')
    throw error
  } finally {
    client.release()
  }
}

Implemented business rules:

  • Create a post: +10 coins
  • Receive a like: +2 coins
  • Comment: +5 coins
  • Daily limit: 500 coins
  • Redeem rewards: -X coins

7. SQS + Lambda: Asynchronous Processing

For non-critical operations, we used event-driven architecture:

User Action (Like Post)
  +--> API Gateway
       +--> Lambda (Record Like)
            +--> DynamoDB (Save interaction)
            +--> SQS (Queue: award_coins)
                 +--> Lambda (Process Coins)
                      +--> RDS (Update wallet)

Advantages:

  • Decouple fast operations from slow ones
  • Automatic retries on failures
  • Dead Letter Queue for errors
  • Backpressure handling

8. EventBridge: Event Orchestration

We configured scheduled events:

# Daily activity digest
Schedule: cron(0 20 * * ? *)  # 8 PM daily
Target: Lambda (send_daily_digest)

# Old data cleanup
Schedule: cron(0 2 * * 0)      # 2 AM Sunday
Target: Lambda (cleanup_old_data)

# Weekly bonus
Schedule: cron(0 0 ? * 1)      # Monday midnight
Target: Lambda (weekly_bonus)

CI/CD Pipeline

Infrastructure as Code

We used AWS CDK (TypeScript) to define all infrastructure:

// lib/api-stack.ts
export class ApiStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id)

    // DynamoDB Table
    const postsTable = new dynamodb.Table(this, 'PostsTable', {
      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      stream: dynamodb.StreamViewType.NEW_AND_OLD_IMAGES,
    })

    // Lambda Function
    const createPostFn = new lambda.Function(this, 'CreatePost', {
      runtime: lambda.Runtime.NODEJS_18_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('functions/posts/create-post'),
      environment: {
        POSTS_TABLE: postsTable.tableName
      }
    })

    postsTable.grantWriteData(createPostFn)

    // API Gateway
    const api = new apigw.RestApi(this, 'Api', {
      restApiName: 'Social Network API'
    })

    const posts = api.root.addResource('posts')
    posts.addMethod('POST', new apigw.LambdaIntegration(createPostFn))
  }
}

Automated Pipeline

# .github/workflows/deploy.yml
name: Deploy to AWS

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

      - name: Build
        run: npm run build

      - name: Deploy to AWS
        run: npx cdk deploy --require-approval never
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

Security

Key Implementations

  1. WAF (Web Application Firewall)

    • SQL injection protection
    • XSS prevention
    • Rate limiting by IP
  2. Secrets Management

    • AWS Secrets Manager for API keys
    • Automatic secret rotation
    • Encryption at rest (KMS)
  3. IAM Roles & Policies

    • Principle of least privilege
    • Separate roles per Lambda
    • MFA for AWS console access
  4. Logging & Monitoring

    • CloudWatch Logs for all Lambdas
    • CloudTrail for auditing
    • Alarms for errors and latency

Results

Infrastructure Metrics

  • Scalability: Supports 10,000 concurrent users with no changes
  • Availability: 99.95% uptime (exceeded target)
  • Latency: P95 < 150ms
  • Costs: $200-500/month in the initial stage (very cost-effective)

Development Metrics

  • Time-to-market: MVP ready in 3.5 months
  • Deploys: 15-20 per week with zero downtime
  • Incidents: Only 2 minor incidents in 6 months

Team Impact

  • Team could focus on features, not infrastructure
  • Confidence in deployments (easy rollback)
  • Clear problem monitoring

Key Takeaways

1. Serverless Is Ideal for Startups

  • Low costs in the early stage
  • Automatic scaling as you grow
  • Fewer operational concerns

2. Multi-Database Strategy

  • NoSQL (DynamoDB) for high-scale social data
  • SQL (RDS) for critical transactional data
  • There's no "one size fits all"

3. Event-Driven Architecture Wins

  • Decouples systems
  • Enables asynchronous processing
  • Makes it easy to add features without breaking existing ones

4. Infrastructure as Code Is a Must

  • CDK allowed us to version infrastructure
  • Recreate environments in minutes
  • Implicit documentation (code is documentation)

5. Observability from Day 1

  • CloudWatch Dashboards
  • Alarms for key metrics
  • X-Ray for distributed tracing

Need Cloud Architecture?

If you're building a product and need:

  • Architecture design on AWS/GCP/Azure
  • Migration to serverless
  • Cloud cost optimization
  • CI/CD setup
  • Mentoring on cloud best practices

Let's talk about your project


Result: A scalable serverless platform on AWS, ready for millions of users, with optimized costs and an automated deployment pipeline that enables rapid iteration.

Need help with this?

If your team faces these challenges, I can help you design and implement a strategy tailored to your context.

Let's talk