<?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: Uwais</title>
    <description>The latest articles on DEV Community by Uwais (@waisyrr).</description>
    <link>https://dev.to/waisyrr</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3987505%2F1ce362d8-60bc-4489-920a-4feb9526d6f2.png</url>
      <title>DEV Community: Uwais</title>
      <link>https://dev.to/waisyrr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/waisyrr"/>
    <language>en</language>
    <item>
      <title>How I Built a Serverless Resume on AWS (Cloud Resume Challenge Project)</title>
      <dc:creator>Uwais</dc:creator>
      <pubDate>Tue, 16 Jun 2026 13:40:04 +0000</pubDate>
      <link>https://dev.to/waisyrr/how-i-built-a-serverless-resume-on-aws-cloud-resume-challenge-project-g01</link>
      <guid>https://dev.to/waisyrr/how-i-built-a-serverless-resume-on-aws-cloud-resume-challenge-project-g01</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# How I Built a Serverless Resume on AWS (The Cloud Resume Challenge)&lt;/span&gt;

The Cloud Resume Challenge is a practical way to move beyond tutorials and build a real, production-style cloud project. It forces you to design, deploy, and connect multiple AWS services into a working system.

This post breaks down the architecture, implementation, and key issues I ran into while building a fully serverless resume website on AWS.
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## 🏗️ Architecture&lt;/span&gt;

The system is fully serverless and designed for low cost and scalability:

S3 (Frontend) → CloudFront → API Gateway → Lambda → DynamoDB

&lt;span class="gu"&gt;### Components&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Frontend (S3)**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Static resume site built with HTML/CSS
&lt;span class="p"&gt;   -&lt;/span&gt; Hosted in an Amazon S3 bucket
&lt;span class="p"&gt;
2.&lt;/span&gt; &lt;span class="gs"&gt;**CDN (CloudFront)**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Distributes content globally
&lt;span class="p"&gt;   -&lt;/span&gt; Provides HTTPS and caching for performance
&lt;span class="p"&gt;
3.&lt;/span&gt; &lt;span class="gs"&gt;**Database (DynamoDB)**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Stores a single visitor counter item
&lt;span class="p"&gt;   -&lt;/span&gt; Enables persistent, atomic updates
&lt;span class="p"&gt;
4.&lt;/span&gt; &lt;span class="gs"&gt;**Backend (Lambda)**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Python function using &lt;span class="sb"&gt;`boto3`&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Reads, increments, and returns visitor count
&lt;span class="p"&gt;
5.&lt;/span&gt; &lt;span class="gs"&gt;**API Layer (API Gateway)**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Exposes &lt;span class="sb"&gt;`/getcount`&lt;/span&gt; endpoint
&lt;span class="p"&gt;   -&lt;/span&gt; Connects frontend requests to Lambda
&lt;span class="p"&gt;
6.&lt;/span&gt; &lt;span class="gs"&gt;**CI/CD (GitHub Actions)**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Automatically deploys frontend updates to S3
&lt;span class="p"&gt;   -&lt;/span&gt; Invalidates CloudFront cache after deployment
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## 🧠 What I Learned / Challenges&lt;/span&gt;

&lt;span class="gu"&gt;### 1. CORS Configuration Issues&lt;/span&gt;
The browser initially blocked API requests due to CORS restrictions.

&lt;span class="gs"&gt;**Fix:**&lt;/span&gt;
Configured API Gateway to allow:
&lt;span class="p"&gt;-&lt;/span&gt; Origins
&lt;span class="p"&gt;-&lt;/span&gt; Methods (&lt;span class="sb"&gt;`GET`&lt;/span&gt;, &lt;span class="sb"&gt;`OPTIONS`&lt;/span&gt;)
&lt;span class="p"&gt;-&lt;/span&gt; Headers

This allowed the frontend to securely call the backend API.
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;### 2. Git History Conflicts&lt;/span&gt;
Changes made locally and via GitHub web editor caused non-fast-forward errors.

&lt;span class="gs"&gt;**Fix:**&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;git pull origin main &lt;span class="nt"&gt;--rebase&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This aligned commit history and resolved the conflict cleanly.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. CloudFront Caching Delays
&lt;/h3&gt;

&lt;p&gt;Frontend updates were not visible immediately due to cached CloudFront content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;br&gt;
Added a GitHub Actions step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudfront create-invalidation &lt;span class="nt"&gt;--distribution-id&lt;/span&gt; &amp;lt;ID&amp;gt; &lt;span class="nt"&gt;--paths&lt;/span&gt; &lt;span class="s2"&gt;"/*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IAM least-privilege design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda only accesses required DynamoDB resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Serverless architecture design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No servers to manage, only managed services&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Frontend-backend integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static site enhanced using API calls&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation-first mindset&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployments handled entirely through CI/CD pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Project Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Live Website: &lt;a href="https://d1l6jcvu4zf64q.cloudfront.net/" rel="noopener noreferrer"&gt;https://d1l6jcvu4zf64q.cloudfront.net/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚙️ API Endpoint: &lt;a href="https://25ktpno81j.execute-api.eu-north-1.amazonaws.com/getcount" rel="noopener noreferrer"&gt;https://25ktpno81j.execute-api.eu-north-1.amazonaws.com/getcount&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub Repository: &lt;a href="https://github.com/waisyrr/cloud-resum" rel="noopener noreferrer"&gt;https://github.com/waisyrr/cloud-resum&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📌 Closing
&lt;/h2&gt;

&lt;p&gt;This project demonstrates how multiple AWS services can be combined into a simple but production-style serverless application. It was less about building a resume site and more about learning how real cloud systems are structured.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>cloud</category>
      <category>aws</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
