Smooth Deploys Only ✨ — From GitHub Commit to Live S3 Website
A simple CI/CD flow with AWS CodePipeline + S3 — plus the real fixes that turned 404 errors into a live site. 🔧✅
What I Built 🧠
I stood up a simple static website and wired it into a lightweight CI/CD flow so updates are automatic:
GitHub (code) 🧾 → CodePipeline (orchestration) 🔁 → S3 (live site) 🌐
The goal was simple: when I change the site files in GitHub, AWS picks it up and deploys the update to my S3-hosted website — no manual uploads needed. ✅
The Build in One Paragraph 🏗️
I created an S3 bucket configured for static website hosting, then created an AWS CodePipeline that uses my GitHub repo as the source and my S3 bucket as the deploy target (no build stage needed). After that, I validated everything by making a small text change in index.html and bumping the footer from Version 1.0 to 2.0—the pipeline triggered automatically and the live website updated. 🎯
Verification (Proving CI/CD Is Actually Working) ✅
To confirm this was real automation and not a one-time deploy, I updated the page copy:
- Added: “Testing for changes… Looking for changes.” 🔍
- Updated: Version 1.0 → Version 2.0 ⬆️
Within minutes, CodePipeline ran a fresh execution and the updated text showed on the live site. ⚡🌍
Troubleshooting Highlights 🧯🔥
This looked simple on paper, but the troubleshooting is where the real learning happened. 💯
1) Missing Website Endpoint: Static Hosting Was Disabled 🧩
At one point I couldn’t find the bucket website endpoint in S3.
Get Carlos L. Glover II’s stories in your inbox
Join Medium for free to get updates from this writer.
Root cause: Static website hosting was still Disabled 🚫
Fix: Enabled Host a static website, set the index document to index.html, and the endpoint appeared. ✅
2) 404 Not Found: NoSuchKey for index.html (Filename Got Me) 😅
After enabling hosting, I hit:
404 Not Found → NoSuchKey → Key: index.html
What really happened: I uploaded/created the homepage file but didn’t name it exactly index.html. 📝
Fix: Renamed/created the file as index.html (case-sensitive), redeployed, and it worked immediately. ✅⚙️
Lesson: In cloud deployments, one small detail (like a filename) can block the whole release. 🧠🔒
3) “Why Do I Have Two S3 Buckets?” 🪣🪣
After the pipeline was created, I noticed an extra bucket named like codepipeline-us-east-1-....
That’s CodePipeline’s artifact bucket — it stores the packaged files CodePipeline moves through the pipeline. 📦
Important: Don’t delete the artifact bucket while the pipeline exists, or deployments can break. ⚠️
What I’d Improve Next (Real DevOps Growth) 📈
Even stopping here, this setup naturally leads into real-world best practices like:
- Staging vs production deployments 🧪➡️🏭
- Manual approval before production releases ✋✅
- CloudFront in front of S3 for HTTPS + caching 🌐🔐
- Least-privilege IAM permissions and avoiding long-lived access keys 🔒
Closing 🎬
If you’re learning Cloud / DevOps, don’t skip the troubleshooting — that’s where the “real engineer” reps happen. 💪🏾🔥



