My Adventure with AWS: Tackling the Resume Challenge
Tags: aws, cloud, terraform, github
Published: 2023-11-15 19:55:04


In 2022 I completed the AWS Certified Cloud Practitioner exam as a requirement by my employer as part of an initiative to move all data to the cloud.  I had limited experience in working in the cloud, I touched Digital Oceans for a project, but never had used AWS.  I came across this [challenge](https://cloudresumechallenge.dev/docs/the-challenge/) in the [AWS Certification Sub-Reddit](https://www.reddit.com/r/AWSCertifications/) as I was preparing to take the [Solutions Architect](https://aws.amazon.com/certification/certified-solutions-architect-associate/) exam and wanted to get some practical experience in order to engrain the learnings from the exam material.  

Below are the requirements for this project/challenge which I worked in blocks.

**Block 1**
Create a Static Website, host on a S3 bucket, enable HTTPS, point custom DNS to Cloudfront

**Block 2**
Create a user counter to track page hits using API Gateway, DynamoDB, Lambda and Javascript

**Block3**
Utilize an Infrastructure as Code - IaC, Source Control and CI/CD - Continuous Integration/Deployment to automate the promotion of changes to the website.

And lastly - **Block 4**, write a blog post about my experiences on this project.

So lets get started..

## Block 1

I've had some past experience with creating personal websites so I didn't want to spend too much time on this as this was all about learning AWS and I wanted to get started quickly.  So I found a decent resume template from [www.startbootstrap.com](https://startbootstrap.com/theme/resume) and started incorporating my resume.  Once complete, I started working on the AWS portion.  I created a [S3](https://aws.amazon.com/s3/faqs/) bucket - uploaded my website files, modified it to be a static website then created a [Cloudfront](https://aws.amazon.com/cloudfront/) Distribution which pointed to the S3 bucket that contained my website.

Next, I registered my custom domain which I decided to use PorkBun as it seemed the cheapest.  I struggled a bit trying to figure out how to get my domain name to point to my Cloudfront Distribution - but finally figured out that I needed to incorporate [Route53](https://aws.amazon.com/route53/) and setup the A and CNAME records.  This took some trial and error, but finally figured out the proper configurations.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t759sxhj25rdcvra42a7.png)

## Block 2

With my website up and running, it was time to add the user counter.  For this, I decided to use a Python [Lambda](https://aws.amazon.com/lambda/) function  and [DynamoDB](https://aws.amazon.com/dynamodb/) to store the data.  I've used Python for some other projects so I felt comfortable using it for this project as well.  I installed the AWS CLI locally and configured the [IAM](https://aws.amazon.com/iam/) roles needed so that I could develop the basic functionality of storing and retrieving from DynamoDB via the Boto3 Python package locally in VSCode.  Once working locally, made the necessary changes and packaged a layer which contains the required Python packages.

The next step, creating an [API Gateway](https://docs.aws.amazon.com/apigateway/) I was most unfamiliar with.  I've used APIs to pull data from websites, but never actually built.  The process was pretty straightforward however, understanding what gets passed to/from the API to Lambda tripped me up a bit.  I finally figured this part out in accessing the Lambda Event headers and ensuring the function was returning JSON in the proper format.  I wanted to add more functionality to only count unique visitors, so I had to capture and check each users IP address.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fru40uipyp8uld4vi7th.png)

## Block 3

I already had GitHub set up from previous projects and I commonly use VSCode as my primary IDE. Creating a repository and managing push/pull operations for the frontend code was straightforward due to my familiarity with these tools. While I had never utilized GitHub Actions for CI/CD or worked with IaC (Infrastructure as Code) tools before, I opted for Terraform due to its cloud-agnostic nature. Engaging with Terraform tutorials proved immensely helpful in comprehending the requirements for this project. I conducted a couple of sample builds to familiarize myself with its functionalities.

The subsequent step involved integrating Terraform into GitHub Actions. Surprisingly, this process was also straightforward, and I managed to set it up promptly, getting it to work without significant issues.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8gzze6pejyg7ihdannzh.png)

## Block 4

Working on this challenge was a great experience, providing hands-on exposure to AWS and proving invaluable in my preparation for and successful passing of the SAA-03 Solutions Architect exam. Like most personal projects I've pursued in my spare time, there were moments when I encountered obstacles and had to research the issues I faced, but ultimately, I managed to resolve them. I'm certain there are areas where optimization is possible, but my primary focus was to ensure functionality before moving forward—to achieve an MVP (minimum viable product). Presently, the monthly costs for this project stand at around $1; I've set up a billing alarm to ensure expenses remain controlled.

I plan to further refine this project and have a couple of other ideas in mind where I could leverage AWS and continue learning. Overall, I found immense enjoyment in working on this project and highly recommend it to anyone initiating their AWS certification journey.

## Completed Project
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ex3hz23zqi07gstrqtae.png)