Skip to content
All projects
George Brown College capstoneSolo — Cloud, Backend, and Frontend

AceMyCareer

A container-native career coaching platform on AWS ECS, EKS, and RDS.

AWS ECSEKSECRLambdaSQSRDS PostgreSQLTextractNext.jsPythonDocker

Overview

What it is

A résumé-aware career platform: candidates upload a résumé, AWS Textract extracts structure, a Python service scores it against a target role, and the results are surfaced through a Next.js UI. The workload runs on ECS Fargate for the API, EKS for the analysis workers, RDS PostgreSQL for user data, and SQS to decouple ingestion from processing.

  • Résumé ingestion Lambda drops jobs onto SQS; Python workers on EKS pick them up.
  • ECS Fargate serves the customer-facing API behind an ALB.
  • Terraform provisions VPC, ECS/EKS clusters, RDS, and ECR from scratch.
  • Textract handles PDF and image résumés without managing an OCR stack.
  • Next.js frontend deployed as a container, running side-by-side with the API.

Architecture

How it's wired

Architecture at a glance

Grouped view of the stack while the real diagram is prepared

Architecture

Compute

  • EKS
  • ECR
  • Lambda
  • Next.js
  • Python

Data

  • RDS PostgreSQL
  • Textract

Messaging

  • SQS

Delivery & Ops

  • Docker

Other

  • AWS ECS

Challenges

Problems worth solving

  1. Challenge

    Balancing ECS vs. EKS for two very different workloads.

    Solution

    Kept the customer API on ECS Fargate for simplicity, and used EKS for the CPU-heavy scoring workers where finer-grained scheduling paid off.

  2. Challenge

    Textract calls were slow and bursty enough to time out the API.

    Solution

    Moved ingestion behind SQS. The API returns immediately; workers process on their own schedule and update the DB when done.

  3. Challenge

    Keeping RDS credentials out of container images.

    Solution

    Task and pod definitions read credentials from Secrets Manager at start-up; nothing sensitive lives in the image.

Engineering

Decisions I made

  • Split ingestion and processing so a slow OCR call cannot break the request path.
  • Chose RDS PostgreSQL over DynamoDB because the data is relational and query-heavy.
  • Standardized on Docker multi-stage builds for every service.

Security

How it stays safe

  • Private subnets for all compute and RDS; no direct public access.
  • IAM roles for service accounts (IRSA) on EKS for scoped AWS access.
  • S3 buckets for résumé uploads are encrypted and lifecycle-expired.
  • All ingress terminates at an ALB with TLS from ACM.

CI/CD

How it ships

  • GitHub Actions builds Docker images and pushes to ECR on merge.
  • Terraform plan/apply for infra changes gated behind PR review.
  • ECS service updates roll out with health-check-based deploys.
  • EKS workers updated with kubectl set image and monitored via CloudWatch Container Insights.

Retro

What I'd tell myself in week one

  • You do not need Kubernetes to be serious. Use ECS unless you know why EKS earns its keep.
  • Async ingestion is a huge reliability win — worth the extra queue.
  • One Terraform repo per environment scales badly; workspaces + modules scale much better.

Next

Future improvements

  • Add HPA on EKS workers based on SQS queue depth.
  • Introduce Karpenter for smarter node autoscaling.
  • Wire OpenTelemetry across the API, workers, and Postgres.