The Cloud Resume Challenge
Tags: aws
Published: 2020-07-30 16:09:29

Being a recent graduate and entry-level professional during a pandemic is quite challenging. At the height of the COVID-19, I quickly experienced the unfortunate reality that millions of Americans face. The amount of free time I have is a bit overwhelming. I used to spend my days designing, implementing and supporting chatbot solutions for large, well-known brands, but now I am searching for a new role. The silver lining to the situation is that I could spend more time with family, personal projects, and hockey. I learned about the [Cloud Resume Challenge](https://cloudresumechallenge.dev/instructions/) through my brother and accepted not only in hopes of finding a position in the cloud sector but, in the very least, improve my skills on AWS.  

This [16-step challenge](https://cloudresumechallenge.dev/instructions/) requires the creation of a website to showcase my resume with a site view counter. It dives deeper by requiring the use of AWS Lambda, API Gateway, and DynamoDB to operate the view counter, host the site on an S3 bucket, and have the site delivered over HTTPS using CloudFront. Additionally, this all must be automated using the AWS Serverless Application Model (SAM) and a CI/CD pipeline. 

I completed the challenge by breaking the project into groups with similar tasks.  
1. I started by designing my website in HTML using Bootstrap. Next, I created a CloudFormation template to automatically deploy my CloudFront distribution linking an S3 bucket as an origin so that the site is only accessible through CloudFront. Lastly, I purchased my domain and set the CNAME to point to CloudFront.
2. I created my development environment by installing python, aws cli, aws sam cli, and httpie. I used VSCode with the AWS and python plugins, as my IDE. 
3. Creating the API, lambda function, and DynamoDB table was the most intensive part. A few essential items that I needed to learn:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   - How these services worked in tandem
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   - How to create a table that updated a single record verse a table that &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;would generate a record per visit
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   - Learn python
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   - How to call an API

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  For my lambda function, I used DynamoDB's atomic counter feature to 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  update the table each time my API endpoint gets called. Additionally, I 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; included a function to serialize / deserialize the response to bypass API 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gateway's decimal encoder limitation. My API uses a single GET method 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with CORS enabled. An XMLHttpRequest written in JavaScript is used to 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call the API and displayed using a DOM element.

4.&nbsp;&nbsp;Lastly, I built a CI/CD pipeline for the front and back end of my site. My first &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pipeline uses GitHub actions and workflow to push any changes in the &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;master branch of my repo to S3. My second pipeline has the same &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functionality except it utilizes AWS Code Deploy to build, test, and deploy &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my SAM template. Testing was performed by passing a key/value payload &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to the lambda function.

Tasks in point 1 were simple. However, the rest was unknown to me. I have little to no programming knowledge and only really understand EC2, S3, and VPC. However, I am proud to say that after two months of many late nights and 'aha' moments, I completed the challenge and present to you: https://resume.logan-toler.dev

It felt as if for every problem I needed to solve, there were five things I need to learn and ten more things to learn about to understand the first five things. It was an endless rabbit hole. But, I enjoyed this challenge because it felt like I was building a solution that a client would request or a project to fulfill a business need. It was a great learning experience to help me recognize my skills and talents and learn new ones.