<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sumit Pendharkar</title>
    <description>The latest articles on DEV Community by Sumit Pendharkar (@thesumit).</description>
    <link>https://dev.to/thesumit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4205496%2F123adfdb-2906-4e88-aa5c-6f1d34e9899b.png</url>
      <title>DEV Community: Sumit Pendharkar</title>
      <link>https://dev.to/thesumit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thesumit"/>
    <language>en</language>
    <item>
      <title>From a Local Docker App to AWS EKS: My DevOps Project</title>
      <dc:creator>Sumit Pendharkar</dc:creator>
      <pubDate>Sat, 24 Oct 2026 21:28:27 +0000</pubDate>
      <link>https://dev.to/thesumit/from-a-local-docker-app-to-aws-eks-my-devops-project-5ak7</link>
      <guid>https://dev.to/thesumit/from-a-local-docker-app-to-aws-eks-my-devops-project-5ak7</guid>
      <description>&lt;p&gt;I recently worked on a DevOps project with a simple starting point: an application that worked perfectly fine on my local machine.&lt;/p&gt;

&lt;p&gt;The application, LibraryCorner, consists of a frontend, a FastAPI backend, and a PostgreSQL database. It was already containerized with Docker, so technically, everything worked.&lt;/p&gt;

&lt;p&gt;But “it works on my machine” is very different from running a service in a production-like environment.&lt;/p&gt;

&lt;p&gt;So I gave myself a challenge:&lt;/p&gt;

&lt;p&gt;How can I transform a local application into a service that is deployable, highly available, observable, and recoverable?&lt;/p&gt;

&lt;p&gt;These four properties became the foundation of the project.&lt;/p&gt;

&lt;p&gt;The Architecture&lt;br&gt;
I deployed the application on AWS using EKS for container orchestration and RDS PostgreSQL for the database.&lt;/p&gt;

&lt;p&gt;The request flow looks roughly like this:&lt;/p&gt;

&lt;p&gt;User → Route 53 → Application Load Balancer → EKS → RDS PostgreSQL&lt;/p&gt;

&lt;p&gt;The EKS nodes and the database run inside private subnets, while the Application Load Balancer acts as the public entry point.&lt;/p&gt;

&lt;p&gt;Around this core architecture, I used:&lt;/p&gt;

&lt;p&gt;Terraform for Infrastructure as Code&lt;br&gt;
GitLab CI/CD for automation&lt;br&gt;
ECR for Docker images&lt;br&gt;
AWS Secrets Manager for secrets&lt;br&gt;
Prometheus &amp;amp; Grafana for monitoring&lt;br&gt;
CloudWatch for AWS monitoring&lt;br&gt;
S3 for Terraform state&lt;br&gt;
I also separated the development and production environments, each with its own infrastructure.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deployable
My first goal was to avoid manual infrastructure changes as much as possible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AWS infrastructure is managed with Terraform, while the application deployment is handled through GitLab CI/CD.&lt;/p&gt;

&lt;p&gt;The pipeline builds the Docker images, pushes them to ECR, and deploys the application to Kubernetes.&lt;/p&gt;

&lt;p&gt;For AWS authentication, I used OIDC instead of storing long-lived AWS access keys in GitLab.&lt;/p&gt;

&lt;p&gt;I actually wrote a separate article about this because I found the authentication flow particularly interesting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Highly Available
Deploying something to Kubernetes doesn't automatically make it highly available.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I configured the EKS infrastructure across multiple Availability Zones and deployed multiple application replicas.&lt;/p&gt;

&lt;p&gt;An Application Load Balancer distributes incoming traffic, while Kubernetes can replace unhealthy pods.&lt;/p&gt;

&lt;p&gt;I also configured a Horizontal Pod Autoscaler (HPA) to scale the application between 2 and 6 pods depending on resource usage.&lt;/p&gt;

&lt;p&gt;For the production database, RDS uses a Multi-AZ configuration.&lt;/p&gt;

&lt;p&gt;The idea is simple: the application shouldn't depend on a single instance, pod, or Availability Zone.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Observable
A service can be running and still be unhealthy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's why monitoring was another important part of the project.&lt;/p&gt;

&lt;p&gt;I used Prometheus to collect Kubernetes and application metrics and Grafana to visualize them.&lt;/p&gt;

&lt;p&gt;This gave me visibility into things like resource usage, pod health, and application behavior.&lt;/p&gt;

&lt;p&gt;I also configured alerts so that important problems don't require someone to constantly watch a dashboard.&lt;/p&gt;

&lt;p&gt;This part of the project changed the way I think about infrastructure: deploying an application is only the beginning. You also need to understand what happens after deployment.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recoverable
High availability doesn't replace backups.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wanted to know what would happen if the database actually had to be restored.&lt;/p&gt;

&lt;p&gt;So instead of simply enabling RDS snapshots and assuming recovery would work, I performed a real restoration test.&lt;/p&gt;

&lt;p&gt;The measured recovery time was approximately 14 minutes.&lt;/p&gt;

&lt;p&gt;For me, this was one of the most useful exercises in the project because it turned disaster recovery from a configuration checkbox into something measurable.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;br&gt;
The biggest lesson wasn't about a specific AWS service.&lt;/p&gt;

&lt;p&gt;It was understanding how all these pieces work together.&lt;/p&gt;

&lt;p&gt;Terraform creates the infrastructure. GitLab automates delivery. Kubernetes manages the workloads. AWS provides the underlying services. Prometheus and Grafana tell me what's happening. Backups give me a recovery path when things go wrong.&lt;/p&gt;

&lt;p&gt;And each layer introduces its own decisions and trade-offs.&lt;/p&gt;

&lt;p&gt;This project also reminded me of something from my QA background:&lt;/p&gt;

&lt;p&gt;A system isn't reliable because we expect it to work. It's reliable because we can verify what happens when it doesn't.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>aws</category>
      <category>terraform</category>
    </item>
  </channel>
</rss>
