<?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: NITHISH</title>
    <description>The latest articles on DEV Community by NITHISH (@nithish_34f36c697ad13f6b3).</description>
    <link>https://dev.to/nithish_34f36c697ad13f6b3</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%2F4125465%2F811ac3e0-cf36-4509-8855-f695c6fdc87e.png</url>
      <title>DEV Community: NITHISH</title>
      <link>https://dev.to/nithish_34f36c697ad13f6b3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nithish_34f36c697ad13f6b3"/>
    <language>en</language>
    <item>
      <title>Day1 Session1: Cloud Worskshop</title>
      <dc:creator>NITHISH</dc:creator>
      <pubDate>Tue, 15 Sep 2026 06:51:58 +0000</pubDate>
      <link>https://dev.to/nithish_34f36c697ad13f6b3/day1-session1-cloud-worskshop-5bbn</link>
      <guid>https://dev.to/nithish_34f36c697ad13f6b3/day1-session1-cloud-worskshop-5bbn</guid>
      <description>&lt;p&gt;From a Simple HTML File to AWS CloudFront: What Deploying My Portfolio Actually Taught Me&lt;/p&gt;

&lt;p&gt;I recently decided to build a personal portfolio.&lt;/p&gt;

&lt;p&gt;Nothing too complicated.&lt;/p&gt;

&lt;p&gt;Just a simple website where I could show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who I am&lt;/li&gt;
&lt;li&gt;What I'm learning&lt;/li&gt;
&lt;li&gt;My projects&lt;/li&gt;
&lt;li&gt;My technical skills&lt;/li&gt;
&lt;li&gt;How to contact me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, I thought the difficult part would be building the website.&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;The real learning started when I tried to put it on the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Started With One HTML File
&lt;/h2&gt;

&lt;p&gt;My first version was just:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;No React.&lt;/p&gt;

&lt;p&gt;No backend.&lt;/p&gt;

&lt;p&gt;No database.&lt;/p&gt;

&lt;p&gt;Just HTML and CSS.&lt;/p&gt;

&lt;p&gt;It worked perfectly on my computer.&lt;/p&gt;

&lt;p&gt;I opened it in the browser and thought:&lt;/p&gt;

&lt;p&gt;"Okay, the website is done."&lt;/p&gt;

&lt;p&gt;Then came the question:&lt;/p&gt;

&lt;p&gt;"How do I actually deploy this?"&lt;/p&gt;

&lt;p&gt;That's when I started exploring AWS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5k16i6r6erbroa8joz88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5k16i6r6erbroa8joz88.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My First Stop: Amazon S3
&lt;/h2&gt;

&lt;p&gt;I created an S3 bucket and uploaded my index.html.&lt;/p&gt;

&lt;p&gt;The idea seemed simple:&lt;/p&gt;

&lt;p&gt;My computer&lt;br&gt;
↓&lt;br&gt;
index.html&lt;br&gt;
↓&lt;br&gt;
S3&lt;br&gt;
↓&lt;br&gt;
Internet&lt;/p&gt;

&lt;p&gt;But when I tried accessing it, AWS gave me:&lt;/p&gt;

&lt;p&gt;AccessDenied&lt;/p&gt;

&lt;p&gt;My first reaction was basically:&lt;/p&gt;

&lt;p&gt;"But the file is literally there."&lt;/p&gt;

&lt;p&gt;And that's when I started understanding something important.&lt;/p&gt;

&lt;p&gt;Having a file in the cloud doesn't automatically mean everyone can access it.&lt;/p&gt;

&lt;p&gt;There are permissions.&lt;/p&gt;

&lt;p&gt;There are policies.&lt;/p&gt;

&lt;p&gt;There are access controls.&lt;/p&gt;

&lt;p&gt;There is configuration.&lt;/p&gt;

&lt;p&gt;The file existing and the file being publicly accessible are two different things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl8mno902n0kx7zm1qioe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl8mno902n0kx7zm1qioe.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Learning to Read the Error Instead of Panicking
&lt;/h2&gt;

&lt;p&gt;I think this was one of the most useful parts of the entire process.&lt;/p&gt;

&lt;p&gt;Instead of immediately changing random settings, I started looking at the actual error.&lt;/p&gt;

&lt;p&gt;AWS was telling me:&lt;/p&gt;

&lt;p&gt;AccessDenied&lt;/p&gt;

&lt;p&gt;So I started asking:&lt;/p&gt;

&lt;p&gt;Who is being denied?&lt;/p&gt;

&lt;p&gt;What resource are they trying to access?&lt;/p&gt;

&lt;p&gt;What permission is missing?&lt;/p&gt;

&lt;p&gt;That changed how I approached the problem.&lt;/p&gt;

&lt;p&gt;I wasn't just trying random solutions anymore.&lt;/p&gt;

&lt;p&gt;I was trying to understand the system.&lt;/p&gt;
&lt;h2&gt;
  
  
  Then I Decided to Use React
&lt;/h2&gt;

&lt;p&gt;After getting the basic website working, I wanted to turn it into a proper React project.&lt;/p&gt;

&lt;p&gt;So I created a React + Vite application.&lt;/p&gt;

&lt;p&gt;The structure became:&lt;/p&gt;

&lt;p&gt;portfolio/&lt;br&gt;
│&lt;br&gt;
├── index.html&lt;br&gt;
├── package.json&lt;br&gt;
│&lt;br&gt;
└── src/&lt;br&gt;
├── main.jsx&lt;br&gt;
└── style.css&lt;/p&gt;

&lt;p&gt;Instead of writing everything directly into HTML, I started thinking in terms of components, data, and rendering.&lt;/p&gt;

&lt;p&gt;For example, instead of manually writing every skill, I could represent them as data:&lt;/p&gt;

&lt;p&gt;const skills = [&lt;br&gt;
"Python",&lt;br&gt;
"TensorFlow",&lt;br&gt;
"Docker",&lt;br&gt;
"Machine Learning"&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;and render them through React.&lt;/p&gt;

&lt;p&gt;It wasn't a huge application, but it helped me understand why frameworks like React are useful.&lt;/p&gt;
&lt;h2&gt;
  
  
  The dist Folder Was Another Lesson
&lt;/h2&gt;

&lt;p&gt;Then I learned something I hadn't really thought about before.&lt;/p&gt;

&lt;p&gt;My React source code isn't what I necessarily need to deploy.&lt;/p&gt;

&lt;p&gt;I ran:&lt;/p&gt;

&lt;p&gt;npm run build&lt;/p&gt;

&lt;p&gt;and Vite created:&lt;/p&gt;

&lt;p&gt;dist/&lt;br&gt;
├── index.html&lt;br&gt;
└── assets/&lt;/p&gt;

&lt;p&gt;That made something click for me.&lt;/p&gt;

&lt;p&gt;React is helping me develop the application.&lt;/p&gt;

&lt;p&gt;The browser ultimately needs the resulting HTML, CSS, JavaScript, and other assets.&lt;/p&gt;

&lt;p&gt;So my deployment flow became:&lt;/p&gt;

&lt;p&gt;React Source Code&lt;br&gt;
↓&lt;br&gt;
npm run build&lt;br&gt;
↓&lt;br&gt;
dist/&lt;br&gt;
↓&lt;br&gt;
S3&lt;/p&gt;

&lt;p&gt;That distinction between development files and production build files was something I hadn't really understood before.&lt;/p&gt;
&lt;h2&gt;
  
  
  Then Came CloudFront
&lt;/h2&gt;

&lt;p&gt;I didn't want to stop at S3.&lt;/p&gt;

&lt;p&gt;I wanted to learn how CloudFront fits into the architecture.&lt;/p&gt;

&lt;p&gt;So I added CloudFront.&lt;/p&gt;

&lt;p&gt;Now I had:&lt;/p&gt;

&lt;p&gt;Browser&lt;br&gt;
↓&lt;br&gt;
CloudFront&lt;br&gt;
↓&lt;br&gt;
S3&lt;/p&gt;

&lt;p&gt;This looked pretty straightforward.&lt;/p&gt;

&lt;p&gt;Until I opened my CloudFront URL.&lt;/p&gt;
&lt;h2&gt;
  
  
  404.
&lt;/h2&gt;

&lt;p&gt;Instead of my portfolio:&lt;/p&gt;

&lt;p&gt;404 Not Found&lt;/p&gt;

&lt;p&gt;And then I saw:&lt;/p&gt;

&lt;p&gt;Code: NoSuchKey&lt;/p&gt;

&lt;p&gt;But the interesting part was this:&lt;/p&gt;

&lt;p&gt;Key: index.html/index.html&lt;/p&gt;

&lt;p&gt;I stared at that for a while.&lt;/p&gt;

&lt;p&gt;My S3 bucket had:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;not:&lt;/p&gt;

&lt;p&gt;index.html/index.html&lt;/p&gt;

&lt;p&gt;So why was CloudFront asking S3 for that?&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem Wasn't My React Code
&lt;/h2&gt;

&lt;p&gt;This was probably my favorite debugging lesson.&lt;/p&gt;

&lt;p&gt;I initially thought:&lt;/p&gt;

&lt;p&gt;"Maybe my React build is broken."&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;My index.html existed.&lt;/p&gt;

&lt;p&gt;My build existed.&lt;/p&gt;

&lt;p&gt;My S3 bucket had the files.&lt;/p&gt;

&lt;p&gt;The problem was somewhere else.&lt;/p&gt;

&lt;p&gt;I checked the CloudFront origin configuration.&lt;/p&gt;

&lt;p&gt;And there it was.&lt;/p&gt;

&lt;p&gt;I had configured the origin path as:&lt;/p&gt;

&lt;p&gt;/index.html&lt;/p&gt;

&lt;p&gt;while also using:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;as the default root object.&lt;/p&gt;

&lt;p&gt;So I had effectively told CloudFront:&lt;/p&gt;

&lt;p&gt;"Start at index.html."&lt;/p&gt;

&lt;p&gt;and then:&lt;/p&gt;

&lt;p&gt;"Also use index.html as the root."&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;index.html/index.html&lt;/p&gt;

&lt;p&gt;AWS wasn't being random.&lt;/p&gt;

&lt;p&gt;I had configured it that way.&lt;/p&gt;

&lt;p&gt;That was a good lesson.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fixing It
&lt;/h2&gt;

&lt;p&gt;I removed the origin path.&lt;/p&gt;

&lt;p&gt;So instead of:&lt;/p&gt;

&lt;p&gt;Origin path:&lt;br&gt;
/index.html&lt;/p&gt;

&lt;p&gt;I left it empty.&lt;/p&gt;

&lt;p&gt;And kept:&lt;/p&gt;

&lt;p&gt;Default root object:&lt;br&gt;
index.html&lt;/p&gt;

&lt;p&gt;The request flow then became:&lt;/p&gt;

&lt;p&gt;/&lt;br&gt;
↓&lt;br&gt;
CloudFront&lt;br&gt;
↓&lt;br&gt;
index.html&lt;br&gt;
↓&lt;br&gt;
S3&lt;/p&gt;

&lt;p&gt;instead of:&lt;/p&gt;

&lt;p&gt;/&lt;br&gt;
↓&lt;br&gt;
CloudFront&lt;br&gt;
↓&lt;br&gt;
index.html&lt;br&gt;
↓&lt;br&gt;
index.html&lt;br&gt;
↓&lt;br&gt;
index.html/index.html&lt;/p&gt;
&lt;h2&gt;
  
  
  And Then... It Still Didn't Immediately Work
&lt;/h2&gt;

&lt;p&gt;This was another AWS lesson.&lt;/p&gt;

&lt;p&gt;I had fixed the configuration.&lt;/p&gt;

&lt;p&gt;But CloudFront uses caching.&lt;/p&gt;

&lt;p&gt;So the old response could still be cached.&lt;/p&gt;

&lt;p&gt;I created a CloudFront invalidation:&lt;/p&gt;

&lt;p&gt;/*&lt;/p&gt;

&lt;p&gt;After that, I tested again.&lt;/p&gt;

&lt;p&gt;And finally...&lt;/p&gt;

&lt;p&gt;The portfolio loaded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqblh2kw0ac9o7ie193e5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqblh2kw0ac9o7ie193e5.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Learned From a "Simple Portfolio"
&lt;/h2&gt;

&lt;p&gt;Looking back, the portfolio itself wasn't a technically huge project.&lt;/p&gt;

&lt;p&gt;But the deployment taught me several things I wouldn't have learned by just following a tutorial.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Code isn't the entire application
&lt;/h3&gt;

&lt;p&gt;There are many layers:&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
↓&lt;br&gt;
Build&lt;br&gt;
↓&lt;br&gt;
Files&lt;br&gt;
↓&lt;br&gt;
Storage&lt;br&gt;
↓&lt;br&gt;
Permissions&lt;br&gt;
↓&lt;br&gt;
CDN&lt;br&gt;
↓&lt;br&gt;
Caching&lt;br&gt;
↓&lt;br&gt;
Browser&lt;/p&gt;

&lt;p&gt;A problem at any layer can make the entire website appear broken.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Errors are useful information
&lt;/h3&gt;

&lt;p&gt;Before this, an error like:&lt;/p&gt;

&lt;p&gt;NoSuchKey&lt;/p&gt;

&lt;p&gt;would mostly mean:&lt;/p&gt;

&lt;p&gt;"Something is wrong."&lt;/p&gt;

&lt;p&gt;Now I try to ask:&lt;/p&gt;

&lt;p&gt;"What key is AWS actually looking for?"&lt;/p&gt;

&lt;p&gt;In my case, the answer was:&lt;/p&gt;

&lt;p&gt;index.html/index.html&lt;/p&gt;

&lt;p&gt;And that immediately gave me a direction.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Infrastructure has bugs too
&lt;/h3&gt;

&lt;p&gt;As developers, we often think about bugs in code.&lt;/p&gt;

&lt;p&gt;But configuration can have bugs too.&lt;/p&gt;

&lt;p&gt;A wrong path.&lt;/p&gt;

&lt;p&gt;A wrong bucket name.&lt;/p&gt;

&lt;p&gt;A missing permission.&lt;/p&gt;

&lt;p&gt;A caching problem.&lt;/p&gt;

&lt;p&gt;These can break an application just as easily as a programming bug.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Deployment Architecture
&lt;/h2&gt;

&lt;p&gt;What started as a simple HTML file eventually became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             User
               │
               ▼
         CloudFront
               │
               ▼
         S3 Bucket
          /       \
         /         \
   index.html     assets/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And my development workflow is:&lt;/p&gt;

&lt;p&gt;Write React&lt;br&gt;
↓&lt;br&gt;
Test locally&lt;br&gt;
↓&lt;br&gt;
npm run build&lt;br&gt;
↓&lt;br&gt;
dist/&lt;br&gt;
↓&lt;br&gt;
Upload to S3&lt;br&gt;
↓&lt;br&gt;
CloudFront&lt;br&gt;
↓&lt;br&gt;
Internet&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Lesson
&lt;/h2&gt;

&lt;p&gt;I'm still learning.&lt;/p&gt;

&lt;p&gt;I don't want to pretend that I suddenly understand AWS because I managed to deploy one website.&lt;/p&gt;

&lt;p&gt;I still have a lot to learn about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud architecture&lt;/li&gt;
&lt;li&gt;IAM&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Infrastructure as Code&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I think I'm starting to understand something more important.&lt;/p&gt;

&lt;p&gt;When you're learning development, getting stuck is part of the process.&lt;/p&gt;

&lt;p&gt;The goal isn't to never get errors.&lt;/p&gt;

&lt;p&gt;The goal is to become better at answering:&lt;/p&gt;

&lt;p&gt;"Why did this happen?"&lt;/p&gt;

&lt;p&gt;That's what I'm trying to get better at.&lt;/p&gt;

&lt;p&gt;And this portfolio deployment was a surprisingly good first step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;Frontend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon S3&lt;/li&gt;
&lt;li&gt;Amazon CloudFront&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;Git/GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The portfolio is deployed, but I'm not treating it as finished.&lt;/p&gt;

&lt;p&gt;I want to keep improving it as I learn more.&lt;/p&gt;

&lt;p&gt;Next, I'd like to explore:&lt;/p&gt;

&lt;p&gt;Custom Domain&lt;br&gt;
↓&lt;br&gt;
HTTPS&lt;br&gt;
↓&lt;br&gt;
CI/CD&lt;br&gt;
↓&lt;br&gt;
GitHub → Automatic Deployment&lt;/p&gt;

&lt;p&gt;Because the next goal isn't just:&lt;/p&gt;

&lt;p&gt;"I deployed a website."&lt;/p&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;p&gt;"I understand how the website gets from my code to a real user."&lt;/p&gt;

&lt;p&gt;And that's a much more interesting thing to learn.&lt;/p&gt;

&lt;h1&gt;
  
  
  react #aws #cloudfront #s3 #webdevelopment #javascript #vite #beginners #devjourney #learninginpublic
&lt;/h1&gt;

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