Introduction
I’ve been wanting to try the AWS Cloud Resume Challenge for a while now and finally, here’s my shot at it! This isn’t just another weekend project; it’s something I built with care (and a few cups of coffee), trying to think like an engineer.
My main goal from the start was to create a sustainable deployment setup that sticks to the AWS Free Forever Tier, because let’s be honest, free stuff is awesome, especially when it’s from AWS! I wanted it to be cost-effective, reliable, and something that could run forever (well, at least until AWS changes its pricing).
But the challenge isn’t just about keeping costs low. So I thought, why not build an extended version too? One that adds more AWS services on top of the basic setup. That way, I could learn more and make it flexible for future upgrades.
Also, fun fact: I didn’t have a portfolio website. So I figured, why not let this sustainable version be my portfolio too? Two birds, one shot.
Architecture
The above setup was designed to closely simulate a production environment. The frontend is hosted on an S3 bucket and delivered through CloudFront for low-latency access. CloudFront is secured using AWS WAF, and HTTPS is enabled through AWS Certificate Manager (ACM). On the backend, API Gateway acts as the entry point for requests, which are processed by Lambda functions and stored in DynamoDB. CloudWatch monitors resource usage and sends alerts via SNS when thresholds are exceeded, ensuring proactive management. IAM handles permission boundaries between services. Alright it is a production-grade setup, but let’s be real, this setup eats up money like anything.
Now this version is for students like me who want a nice cloud setup without needing to sell a kidney. Here, I’ve trimmed things down using only free-forever AWS services. The frontend is deployed on Netlify with DNS support, while the backend uses Lambda and DynamoDB as before. CloudWatch and SNS are still used for alerting, and IAM manages service permissions. By using Terraform, the infrastructure can be easily switched from the extended setup to this minimal version with a single command.
IaC: Terraform
The entire infrastructure is managed using Terraform with a clean separation between environments and reusable modules. Each deployment model (basic or extended) is defined in its own folder under environments/
, where it serves as a root module. These root modules instantiate shared components from the modules/
directory, passing in environment-specific variables. For instance, the basic/
setup focuses on deploying minimal resources like a Lambda function and DynamoDB, while the extended/
setup adds components like API Gateway, S3, CloudFront, and WAF. Both environments maintain independent state files (terraform.tfstate) and lock files to ensure consistent and isolated deployments. This modular structure makes it easy to switch between configurations (just destroy the previous infra, change directory and apply) while Terraform ensures state consistency and reliable provisioning across setups.
terraform/
├── environments/
│ ├── basic/ # Minimal setup environment
│ └── extended/ # Full setup environment
├── modules/
│ ├── base/ # Shared infra (Lambda, IAM, CloudWatch, etc.)
│ └── extended/ # Add-ons (S3, API Gateway, CloudFront, WAF)
I chose this setup because it offers clear separation between environments, making the infrastructure easier to manage, reason about, and iterate on. By maintaining independent folders and state files for each environment (basic/
and extended/
), I can safely develop and test new features without risking unintended changes to the existing deployment. This structure reduces complexity, lowers the chance of state corruption, and aligns well with real-world practices where environments often differ in features. It also simplifies debugging and CI/CD workflows, as each environment can be deployed independently without relying on conditional logic or shared state toggles. Overall, this approach prioritizes safety, clarity, and maintainability over complexity.
CI/CD Workflow
Backend setup
The backend deployment workflow is the same for both the basic and extended deployment models, as shown in the diagram. When code changes are pushed to the GitHub repository, GitHub Actions triggers a CI/CD pipeline that uses the AWS CLI to deploy or update Lambda functions. These functions handle the backend logic, and the deployment process ensures that any backend updates are automatically applied to the correct AWS environment. This consistent setup simplifies maintenance and ensures both models stay in sync.
Frontend setup
For the extended deployment model, the GitHub Actions pipeline is responsible for uploading the static frontend files to an S3 bucket. Once uploaded, the files are served automatically via Amazon S3 and integrated into CloudFront for global delivery. However in the basic deployment model, frontend code commits on a designated branch trigger Netlify's own build pipeline, which handles the build and deployment process. The content is then served over Netlify’s edge network, making the process seamless without additional infrastructure configuration.
Conclusion
This challenge was more than just wiring up cloud services, it was about building something meaningful from the ground up, learning how real-world deployments work, and pushing my limits one Terraform plan at a time. From modular infrastructure to automated CI/CD and budget-aware architecture, I’ve tried to balance practicality with good cloud design.
"Start where you are. Use what you have. Do what you can." – Arthur Ashe
And that’s exactly what I did, no expensive tools, no fancy pipelines, just curiosity, consistency, and cloud.
Thanks for reading, and if you’re thinking about starting your own cloud journey, now is always a good time. 🚀
Project Links
🌐 Live Site: https://puneeth.is-a.dev/
📦 GitHub Repository: https://github.com/puneeth072003/aws-cloud-resume/
If you found this blog helpful or learned something new, feel free to leave a like ❤️ and star the repo ⭐, it really helps and keeps me motivated to share more cool stuff!
Top comments (0)