This repository contains the code and Infrastructure as Code (IaC) scripts for my cloud-hosted resume. The application is hosted on AWS, leveraging services such as S3, CloudFront, and Lambda. I undertook this project as part of a challenge to test my AWS cloud resource skills as a newly certified AWS Solutions Architect Associate and to gain practical experience in creating infrastructure.
The Cloud Resume Challenge is a popular challenge for aspiring cloud architects and engineers, aimed at showcasing and enhancing typical cloud architecture skills while also improving resume visibility. This challenge provides a platform for individuals to practice, demonstrate, and improve their cloud skills through the following means:
The challenge is designed as a hands-on project to build and demonstrate skills essential for a career as an AWS Cloud Engineer. Participants are required to construct a personal resume or portfolio website and include a visitor counter on the site. The project must be entirely deployed using various AWS services, providing a practical learning experience in handling cloud resources
It aids participants in developing crucial cloud skills, including setting up serverless applications, CI/CD pipelines, networking, and ensuring security. This aspect of the challenge is vital as it provides a real-world scenario for applying theoretical knowledge obtained from cloud certifications
By participating in the challenge, individuals have the opportunity to enhance their resumes. The challenge allows them to present their resumes using cloud technologies, which not only showcases their technical skills but also makes their resumes more publicly and easily accessible.
The first part of the challenge is to complete the AWS Cloud Practitioner certification exam. I decided to take this one step further and I successfully passed the AWS Cloud Architect - Associate certification exam on 09/28/2023.
This section details the creation of the visual design of the resume using HTML, CSS, and JavaScript. While the design doesn't need to be intricate, it should exhibit some styling beyond a raw HTML page.
For the HTML portion of the website, I created front-end/index.html
and based it on the sections of my normal resume with CSS styling to provide a somewhat modern design with some visual transitions. Prior to this, I had little to no experience writing HTML or CSS code, so I started with a template and made necessary adjustments to cover the basics. Then, I made larger design changes to align with my overall design vision.
The website contains separated sections that would typically be seen on a resume such as personal information, skills, work experience, education, certification, and personal projects. I also included links to my relevant socials as well as a link to download a copy of my official resume in pdf format.
JavaScript was used to tackle one of the challenge tasks which was to create a visitor counter for the website. This was added to the index file and works with an AWS API and DynamoDB table on the backend to preserve the visitor count.
More on this in the Backend and Integration section.
The HTML code, along with all supporting files, are hosted on an AWS S3 bucket with static hosting enabled and public read-only permissions. Since S3 static website hosting doesn't offer HTTPS functionality, I utilized CloudFront to provide HTTPS functionality.
More on this in the following section.
In order to provide HTTPS functionality, I created a CloudFront distribution. By using CloudFront, I was able to set the S3 bucket as the origin and assign an SSL certificate obtained using ACM.
In order to access the website, I registered a domain using Route 53 which points the DNS domain name at the CloudFront distribution.
The API serves as an intermediary between the websites frontend (the JS running in the browser) and the backend infrastructure, which for this project is Lambda and DynamoDB. Its primary purpose is to enable the frontend to retrieve and update the visitor count without directly accessing the database, thus ensuring a higher level of security and scalability (if needed).
I set up a table in DynamoDB called VisitorCount with a single item called myWebsite which tracks the number of site visits.
Using backend/IncrementVisitorCount.py
, I created a Lambda function that fetches the current visitor count from DynamoDB, increments it, and then returns the updated count to the API Gateway.
The purpose of the API Gateway is to provide an endpoint for the JavaScript to call to get or update the visitor count. This call triggers the Lambda function.
To automate any code or configuration changes to the frontend, GitHub Actions were used along with a dedicated pipeline workflow. All steps and stages can be seen in the .github/workflows/front-end-cicd.yml
Whenever a change is pushed to any frontend files in this GitHub repo, the workflow will run and automatically update the files in the S3 Bucket.
IN PROGRESS
The final step of this project is to manage the AWS resources using an IaC solution such as SAM or Terraform. I've initiated a Terraform project and have imported most of the AWS infrastructure. A few aspects need fixing and a full deployment test is pending before integrating it here.