← Back to projects

From Code to Cloud: Building pavankrishna.dev on AWS Amplify

This isn't just a portfolio. It's a fully deployed cloud project built on AWS, served via CloudFront, secured with ACM, and continuously deployed from GitHub. Here's exactly how I built it, what went wrong, and what I learned.

AWS Amplify CloudFront ACM (SSL) IAM GitHub CI/CD Namecheap DNS
Architecture Visualization
👨‍💻
Local Code HTML / CSS / JS
🐙
GitHub Repository Source of truth
AWS Amplify CI/CD and hosting
🌐
CloudFront CDN Global delivery
🔒
ACM SSL Managed HTTPS
🌍
Namecheap DNS pavankrishna.dev

Every git push triggers an automatic build and deploy. No manual steps are needed.

The Strategic Why

Why AWS instead of Netlify or Vercel?

Netlify and Vercel are excellent platforms. They are faster to set up and completely free for personal projects. So why go through the effort of deploying on AWS?

The honest answer: I'm transitioning into cloud engineering. Deploying on AWS, even for a static site, forces me to understand IAM, SSL certificates, CDN configuration, and CI/CD pipelines in a way that clicking "deploy" on Netlify never would. Every friction point is a learning opportunity.

When a recruiter or hiring manager visits pavankrishna.dev, they're not just reading about my AWS skills. They're loading a site that runs on AWS infrastructure I configured myself. That's a different kind of credibility.
Execution Timeline

Step by step breakdown

Here's exactly what I did, in order, to get from a local HTML file to a live HTTPS website.

01

Built the portfolio as static HTML/CSS/JS

The entire site is plain HTML, CSS and JavaScript, with no frameworks, no build tools and no dependencies. This keeps it fast, simple to deploy, and easy to maintain. Files include index.html, impressum.html, privacy.html, common.css, index.css, legal.css, common.js and index.js.

02

Created an IAM user with least privilege

Instead of using the root AWS account, I created a dedicated IAM user called amplify-deploy with only the permissions needed: AdministratorAccess-Amplify and AmazonRoute53FullAccess. This follows the principle of least privilege, a core AWS security best practice.

03

Pushed code to a GitHub repository

Initialised a git repository, committed all files and pushed to GitHub. This is the source of truth. Amplify watches this repository and deploys automatically on every push.

04

Connected GitHub to AWS Amplify

In the Amplify console, I connected the GitHub repository, selected the main branch, and let Amplify auto-detect the build settings. Since this is plain HTML with no build command needed, the output directory was simply set to /.

05

Deployed with the first build completed in under 3 minutes

Amplify built and deployed the site automatically, assigning a temporary URL at main.xxxxx.amplifyapp.com. The site was already live and served over HTTPS via CloudFront at this point.

06

Configured custom domain via Manual DNS

Added the custom domain pavankrishna.dev in Amplify using Manual configuration (not Route 53 automatic setup, due to Free Tier limitations). Amplify provided two DNS records to add in Namecheap: one CNAME for SSL verification and one ALIAS record pointing the apex domain to CloudFront.

07

Added DNS records in Namecheap

Deleted the existing parking page records in Namecheap Advanced DNS, then added the two records from Amplify. DNS propagation completed within a few minutes and the domain was live at pavankrishna.dev with a valid SSL certificate.

Obstacles & Solutions

Challenges and how I solved them

Nothing goes perfectly on the first try. Here are the real problems I hit and how I fixed them.

Problem

IAM user not authorised for Route 53

When trying to add the custom domain, Amplify threw an error: "User amplify-deploy is not authorized to perform route53:ListHostedZones". The automatic hosted zone creation failed because my IAM user didn't have Route 53 permissions.

Solution

Went to IAM → Users → amplify-deploy → Add permissions → Attached AmazonRoute53FullAccess policy. Then retried the domain activation in Amplify. It worked immediately.

Problem

Free Tier does not support automatic hosted zone creation

Amplify's recommended "Create hosted zone on Route 53" option was blocked with the error: "Free Tier accounts are not supported for this service". This prevented the one-click domain setup.

Solution

Switched to Manual configuration instead. This meant manually copying the DNS records Amplify provided and adding them in Namecheap's Advanced DNS panel. More steps, but it works perfectly and costs nothing extra.

Problem

Existing DNS records in Namecheap conflicted

Namecheap had two default records on the domain: a CNAME pointing to their parking page and a URL redirect record. These would have conflicted with the new Amplify records.

Solution

Deleted both existing records first, then added the two Amplify records cleanly. Order matters here. Always remove conflicting records before adding new ones.

Financial Breakdown

What does this actually cost?

One of the most practical questions in cloud engineering: what's the bill? Here's the honest breakdown for running this portfolio on AWS.

Service What it does Monthly cost
AWS Amplify Hosting Build minutes + hosting (free tier: 1000 build mins/month, 15 GB served) ~€0
CloudFront CDN Content delivery, which Amplify uses automatically ~€0
ACM SSL Certificate HTTPS, free when used with CloudFront €0
IAM User and permissions management €0
Domain (Namecheap) pavankrishna.dev, 3 year registration ~€4/month
Total Full HTTPS portfolio on AWS global CDN ~€4/month

The AWS costs are effectively zero within free tier limits. For a personal portfolio with low traffic, this will stay free for a long time. The only real cost is the domain registration, which would be the same on any platform.

Key Technical Takeaways

What I learned

🔐

IAM least privilege is non-negotiable

Never use the root account for deployments. Creating a dedicated IAM user with only the permissions needed is the right habit to build from day one.

🔁

CI/CD changes how you think about code

When every git push deploys automatically, you start committing more carefully and thinking about changes in smaller, safer increments.

🌐

DNS errors are almost always fixable

The Route 53 permission error looked scary at first. But reading the error message carefully pointed directly to the fix: attach the right IAM policy and retry.

Amplify abstracts a lot of complexity

Under the hood, Amplify is running S3, CloudFront and ACM. Understanding what those services do makes you a better user of the abstraction layer on top.

💰

Cloud doesn't have to be expensive

A globally distributed, HTTPS-secured, auto-deploying website costs effectively nothing on AWS free tier. Understanding the billing model is as important as understanding the architecture.

📖

Document everything as you go

Writing this page forced me to fully understand every step I took. If you can't explain it clearly, you don't fully understand it yet.