Open to DevOps / Cloud / DevSecOps roles

Vasanth A.

DevOps / Cloud Engineer

I build infrastructure, automate delivery,
and investigate what happens when systems fail.

AWS Terraform Docker GitHub Actions Jenkins DevSecOps
3
engineering
case studies
6
documented
incident reports
Active
DevSecOps internship
SecIQ Technologies

What I've Built

Three systems, each built to understand something specific about infrastructure, delivery, and failure.

01

ML Deployment Platform

How do you turn a 30-minute manual AWS deployment workflow into a repeatable, automated platform?

~30 min
manual AWS console
13 steps
orchestration pipeline
<5 min
automated end-to-end
AWS EC2
deployment target
DeployML dashboard showing deployment overview with active instances
DeployML — self-service deployment dashboard
DeployML deployment in progress — live status streaming over Socket.IO
Deployment in progress — real-time status via Socket.IO
Architecture note

A Terraform-based production architecture (CloudFront → ALB → ECS Fargate → RDS) is designed and documented on the feature/aws-production branch. The current deployed orchestration runs against EC2 using boto3 + Paramiko. The IaC design represents the next evolution, not the current deployment.

A self-service platform that accepts a GitHub URL and deploys a live ML application on AWS EC2 through a 13-step orchestration pipeline. The backend coordinates EC2 provisioning, Docker deployment, NGINX configuration, and real-time status streaming over Socket.IO — all triggered by a single form submission.

The front end was built with React 19 + Vite. The orchestration layer uses boto3 for AWS provisioning and Paramiko for SSH-based remote execution. A PostgreSQL database tracks deployments and instance state.

Orchestration pipeline
GitHub URL submitted
Flask API receives request, writes to PostgreSQL
EC2 provisioned via boto3
Security groups, key pair, instance launched
SSH connection via Paramiko
Docker + Git installed, repo cloned
Container built and started
docker build → docker run on EC2
Live URL returned
Status streamed to dashboard via Socket.IO
AWS EC2 Flask React 19 Socket.IO PostgreSQL Docker boto3 Paramiko Gunicorn NGINX
02

AWS DevOps Platform

What does a complete cloud-to-production engineering path look like — infrastructure, delivery, observability, and reliability testing in one project?

0.00%
k6 error rate
1,470
requests sent
20
virtual users
100%
checks passed

End-to-end cloud engineering: Terraform provisions the AWS stack from scratch. GitHub Actions handles build, test, push to GHCR, and SSH-based EC2 deployment. CloudWatch provides dashboards, alarms, log streams, and custom metrics. k6 validates reliability under load before the project was considered complete.

CI/CD pipeline — git push to live
git push → GitHub Actions triggers
Python tests pass
Docker build → push to GHCR
SSH → EC2 pulls image, restarts container
Health check gate — deployment verified
NGINX → Gunicorn → Flask serving requests
Terraform AWS EC2 VPC IAM S3 CloudWatch GitHub Actions Docker NGINX GHCR Flask k6 Checkov
AWS DevOps Platform infrastructure architecture showing VPC, EC2, CloudWatch, and CI/CD flow
AWS infrastructure — Terraform-provisioned stack
IaC security validation

Terraform configuration was scanned with Checkov to identify policy violations. Selected findings were remediated and the configuration was rescanned to verify that the targeted controls passed.

Engineering trade-off

Current: SSH-based deployment from GitHub Actions. Simple, transparent, works for this scope.
Known limitation: SSH keys in CI, no HTTPS, single-instance.
Production path: AWS SSM Session Manager, ALB + ACM certificate, Auto Scaling Group.

03

VoteSecure — DevOps Journey

How do you learn DevOps from first principles — not from tutorials, but by deliberately breaking a real system and documenting what happens?

A full-stack voting platform built as a progressive DevOps project — containerized, proxied, and CI-validated across three phases. The platform uses FastAPI + React 18, PostgreSQL with AES-256 ballot encryption, Redis for rate limiting and JWT blacklisting, and Socket.IO for real-time vote streaming.

The engineering differentiator: six production failures were simulated on purpose. Each incident was reproduced, investigated in depth, documented with root cause and remediation, and used to improve the system. These are not hypothetical exercises — they are full incident reports based on real log output, real error messages, and real recovery steps.

PHASE 1
Containerization
Completed
PHASE 2
Reverse Proxy
Completed
PHASE 3
CI Pipeline
Completed
PHASE 4
AWS Deployment
Upcoming
VoteSecure architecture diagram — Browser to NGINX to FastAPI to PostgreSQL and Redis
Architecture — Browser → NGINX → FastAPI → PostgreSQL + Redis
High Phase 1 Intentional simulation
All DB-dependent endpoints → 500. Frontend loaded. GET /api/auth/me worked (JWT, no DB call). Redis rate limiting active. Container status showed all containers "Up" — monitoring would have shown green while users saw 500s.
When a Docker container stops, it deregisters from the internal bridge network DNS. The hostname postgres became unresolvable — not "connection refused" but "no address associated with hostname." The backend never attempts TCP; DNS fails first.
Docker DNS fails before TCP. Static health checks that return 200 OK without testing the database are liveness probes — not readiness probes. A green health endpoint during a DB outage is actively misleading.
Critical Phase 1 Misconfiguration
Backend exited at startup — never accepted a single request. NGINX returned 502 Bad Gateway on every API call. PostgreSQL, Redis, NGINX, and frontend were all fully healthy. Infrastructure was green; application was dead.
DB_HOST=localhost set instead of DB_HOST=postgres. Inside a Docker container, localhost resolves to the container's own loopback (127.0.0.1). PostgreSQL was running in a separate network namespace, reachable only by its service name. DNS succeeded; TCP was refused. Backend startup event failed; Uvicorn exited.
All infrastructure healthy + application down = configuration error. 502 means dead upstream (check container state). 500 means broken upstream (check application logs). The error code is the first debugging signal. --force-recreate is required for env var changes — restart does not apply them.
High Phase 2 Silent degradation
Live Results page showed no real-time vote updates. All other features worked. No 500 errors. Dashboards green. Users would only discover the failure by noticing vote counts not updating — no alert would catch this.
NGINX strips hop-by-hop headers (including Upgrade and Connection) before forwarding requests upstream. The browser sent a WebSocket upgrade request; NGINX removed the headers; the backend received a plain HTTP request and refused the upgrade. Fix: proxy_set_header Upgrade $http_upgrade; and proxy_http_version 1.1; in NGINX config.
Silent partial failures are harder than total outages. Dashboards stayed green. The feature worked in local dev (no NGINX). Production added a proxy layer that broke one specific protocol. Test the full stack — not just the application in isolation.
High Phase 3 Intentional simulation
CI pipeline failed at the Docker build step. The same docker build succeeded locally. The PR was blocked from merging.
Local Docker build used a cached layer containing a previously valid dependency. CI builds from scratch with no cache — it hit an actual package resolution error that local cache had masked. The Dockerfile had a latent defect that only showed up in a clean build environment.
CI is a clean-room environment — it proves your build is reproducible, not just that it worked on your machine. "Works locally" is not evidence of a correct Dockerfile. Periodically build with --no-cache in local dev to find hidden dependency issues before CI does.
High Phase 3 Misconfiguration
CI smoke test step failed with an authentication error. The application code and Docker build were both correct. The pipeline passed tests and build, then failed at smoke test.
The workflow referenced a GitHub Secret by an incorrect name. GitHub does not error on missing secrets — it silently injects an empty string. The application received an empty database password, failed to authenticate, and the smoke test correctly detected the failure.
Secret name mismatches are invisible until runtime. GitHub won't warn you. Add secret validation at pipeline startup — fail fast with a clear message if a required secret is empty, rather than letting downstream steps fail with cryptic errors.
Critical Phase 3 Silent failure
Code pushed. PR opened. Zero CI workflow runs appeared. No red status, no yellow status — nothing. The PR showed as ready to merge with no quality gate. Any broken code could have been merged without detection.
Workflow trigger changed from branches: [main] to branches: [production]. production does not exist as a branch. The YAML is syntactically valid — GitHub parses it without error. The trigger simply never fires because no PR ever targets a production branch.
A pipeline that fails tells you something is wrong. A pipeline that doesn't run tells you nothing — and you won't notice it isn't running. Validate CI trigger configuration on every workflow change. Require status checks in branch protection rules — a missing check should be as alarming as a failing one.
Docker Compose V2 NGINX GitHub Actions FastAPI React 18 Redis PostgreSQL AES-256 JWT Socket.IO

How I Work

Principles I've developed from actually building and breaking these systems — not from theory.

01
Infrastructure as Code first

Infrastructure that can't be reproduced isn't infrastructure — it's a configuration that happened to work once. Everything I provision starts with code: Terraform modules, docker-compose files, Dockerfiles with explicit layers.

→ ML Deployment Platform, AWS DevOps Platform
02
Automate the path to production

Manual deployment steps accumulate hidden dependencies and silent assumptions. Each manual step is a future incident waiting to happen. Automating the full path — including health check gates — makes deployment safe to repeat.

→ GitHub Actions pipeline, 13-step orchestration
03
Test failure, not only success

A green pipeline proves the happy path works. It says nothing about what happens when Postgres stops, a config value is wrong, or a dependency fails on a cold build. VoteSecure exists specifically to answer those questions.

→ INC-001 through INC-006
04
Document the incident

Fixing the problem is necessary. Understanding why it happened is what makes the system better. A root-cause analysis written after every incident — even a deliberate simulation — trains the instinct to think at the right layer.

→ VoteSecure incident reports
05
Observe before you trust

A system is only as reliable as your ability to see what it's doing. CloudWatch dashboards, alarms, custom metrics, log streams, and k6 load tests aren't afterthoughts — they're how you verify the infrastructure you built actually works under real conditions.

→ AWS DevOps Platform observability stack
06
Acknowledge trade-offs explicitly

SSH-based CI/CD is simpler than SSM. A single EC2 instance is cheaper than Auto Scaling. Single-request DB connections recover automatically but don't pool efficiently. Knowing the trade-off and naming it is more useful than pretending it doesn't exist.

→ AWS DevOps Platform trade-offs

Engineering Stack

Tools I've used in real projects — not listed because they look good on a resume.

Cloud
AWS EC2 ECS Fargate VPC ALB RDS S3 IAM CloudFront CloudWatch Secrets Manager
Infrastructure
Terraform Modular IaC Remote State Workspaces tfvars
Containers
Docker Docker Compose V2 Multi-stage Builds GHCR ECR Kubernetes fundamentals
Delivery
GitHub Actions Jenkins Groovy Pipelines Health Check Gates Smoke Testing
Security
SAST SCA IaC Security CVE Analysis OWASP Top 10 SonarQube Snyk OWASP Dependency-Check Trivy Checkov
Observability
CloudWatch Prometheus Grafana k6 Custom Metrics Log Streams
Automation
Python Bash boto3 Paramiko NGINX Gunicorn Linux (Ubuntu)

More Experiments

Smaller projects and exercises that contributed to the DevOps / Cloud story.

CI/CD · Jenkins
Jenkins Workflow Demo

Declarative Jenkins pipeline: Python virtualenv setup, unit tests, conditional branch-aware deployment, and automated PR merge via GitHub API using Groovy scripting.

Jenkins Groovy GitHub API Python
View on GitHub →
Cloud · AWS · Python
Cloud Resource Audit Platform

AWS governance tool using boto3 to scan EC2, EBS, S3, RDS, EIP, Snapshots, ALB, and NAT Gateways across regions. 20+ deterministic rules, ranked cost-savings recommendations, CSV/JSON/HTML export.

boto3 Cost Explorer React Flask
View on GitHub →
Linux · NGINX · Deployment
Zero-Downtime Deployment via Symlinks

Blue-green style deployment using filesystem symlinks and NGINX configuration reloads — no container orchestrator required. Demonstrates the mechanism behind zero-downtime at the OS level.

NGINX Linux Bash
View on GitHub →
Kubernetes · Static Deployment
Static App Deployment to Kubernetes

Deploy a static page to a local Kubernetes cluster using Deployment and Service manifests. Demonstrates pod scheduling, replica management, and service exposure fundamentals.

Kubernetes kubectl NGINX
View on GitHub →

Where I've Worked

Jul 2026 — Present
SecIQ Technologies LLP Remote · Bengaluru
DevSecOps Internship
DevSecOps Intern
  • Performed end-to-end SAST triage using SonarQube across Python, Java, and JavaScript projects — validating True/False Positives, mapping to OWASP Top 10 categories, and writing developer-facing remediation recommendations.
  • Triaged SCA and dependency vulnerabilities using OWASP Dependency-Check and Snyk — analyzing CVEs by CVSS score, affected package versions, and validating findings against NVD, Debian Security Tracker, and Secure Software databases.
  • Integrated SonarQube and OWASP Dependency-Check into a Jenkins Declarative Pipeline to automate SAST/SCA scanning, report generation, and SonarQube Quality Gate validation for a Java/Maven application.
  • Performed Trivy-based container image vulnerability triage during client security assessments — distinguishing exploitable CVEs from noise across OS packages and application dependencies.
SonarQube Snyk OWASP Dep-Check Trivy Jenkins CVE Analysis OWASP Top 10 True/False Positive Triage
Jan 2026 — Apr 2026
Codec Technologies Pvt. Ltd. Remote
AICTE & ICAC Approved
Cloud Computing Intern
  • Deployed and configured cloud infrastructure on AWS (EC2, S3, VPC) during a 3-month structured internship program.
  • Implemented Infrastructure as Code with Terraform and containerization with Docker to automate deployment workflows.
  • Contributed to CI/CD pipeline integration and secure infrastructure practices in a remote team environment.
AWS EC2 S3 VPC Terraform Docker

Education & Certifications

Master of Science (M.Sc.)
Data Science
Periyar University · Salem, Tamil Nadu
Aug 2024 – Apr 2026 7.5 / 10
Bachelor of Science (B.Sc.)
Statistics
Presidency College (Autonomous), University of Madras · Chennai
Jun 2021 – Apr 2024 8.47 / 10
Continuous Integration and Continuous Delivery (CI/CD)
IBM · Coursera · Completed March 2026
✓ Verify

Let's Talk

Open to DevOps, Cloud, and DevSecOps roles.
Also happy to talk infrastructure, incident analysis, or anything in this stack.