01 Portfolio

Projects

01 Kubernetes

2048 on Amazon EKS

A browser game deployed to Kubernetes with Terraform and ArgoCD.

“Follow a change from Git to the running game, then see how a browser request finds its way to a pod.”

Read the full project

I picked 2048 because the game itself is simple. That let me spend my time on Kubernetes: getting traffic to the app, rolling out a new image and checking that it was healthy.

From the browser to a pod

Terraform provisions the AWS environment. The EKS cluster has a managed node group in each of two Availability Zones, and the game runs with replicas across both. An internet-facing Network Load Balancer passes connections to Traefik, which handles HTTPS and routes requests to the Kubernetes service. Cert-manager obtains the certificates, while Prometheus and Grafana give me a view of the game and cluster.

From a commit to the cluster

I separated infrastructure changes from application releases. The app workflow builds the Docker image, scans it with Trivy, pushes it to ECR with the commit SHA as its tag, and writes that tag back to the Kubernetes manifest in Git. ArgoCD reconciles the cluster with the updated manifest. I can update the game without reprovisioning the cluster, and tear the environment down between sessions to control costs.

Here is the full repo

02 Containers

RONIN on Amazon ECS Fargate

A Flask app that reviews a demo AWS environment and generates a report.

“Start with a Flask container, check its health, then put it behind a load balancer on Fargate.”

Read the full project

RONIN is a Flask app that lets you analyse a simulated AWS environment, review potential issues and underused resources, and generate a report. The findings come from demo data, so trying the app requires no connection to a real AWS account. With RONIN, I wanted to be able to build the container, bring up the infrastructure and tear it all down again in a predictable order.

From the container to Fargate

A multi-stage Docker build installs dependencies separately from the runtime image. The final container runs Gunicorn as a non-root user. GitHub Actions starts the image and checks /health before pushing it to ECR. In AWS, CloudFront sends requests through an Application Load Balancer to Fargate tasks in private subnets across two Availability Zones.

Deploying in dependency order

I split Terraform into bootstrap, foundation and main. Bootstrap prepares remote state and GitHub’s OIDC access to AWS. Foundation creates the image registry and DNS setup, so the app workflow can publish the image before the main stage creates the ECS service. Teardown reverses those dependencies, removing the service and its infrastructure before the foundation.

Here is the full repo