Cloud Resume Challenge
Published: 2023-06-06 01:05:46

## Background
A brief summary of my experience with tech: I'm currently working my way through a self-study journey with AWS and its adjacent tech skills such as Linux, Python, Infrastructure as Code(IaC) languages, and more. I've been searching for projects to get hands-on experience with AWS. The Cloud Resume Challenge in my opinion was one that improved my skills greatly. This blog post is meant to document my experiences with the project, skills developed, mistakes made and debugged, and overall reflections on the project. This blog was linked from my GitHub.

The project can be found here, credit goes to Forrest Brazeal:
[Cloud Resume Challenge - AWS](https://cloudresumechallenge.dev/docs/the-challenge/aws/)

## Challenge Steps

## 1. Certification
The project calls for at least the AWS Certified Cloud Practitioner to be achieved before attempting. I already possess this certification as well as the AWS Solutions Architect Associate, so this step was already completed. Currently, my thoughts with AWS Certifications is a bit mixed, as I'm not sure how many certifications I need to get an entry level job. Research into this didn't answer my questions. public opinion on this subject is mixed, with some saying you need all the associates, while others say that practical experience is more important. I currently lean towards practical experience, but this is subject to change in the future if recruiters ask for more certs.

## 2. + 3. HTML/CSS Front End
In the process of learning AWS, I already learned a bit of HTML and CSS to at least be able to write and read the languages. I'm no web designer, but the challenge called for simple CSS and HTML. I didn't use a fancy template or anything, just hand-coded it to look like a typical resume. This step was rather straight-forward, and didn't offer any roadblocks. I would later add an external JavaScript file with a script block within my HTML. 

## 4. Static Website with S3
This step was relatively simple, the creation of an S3 bucket and inserting data files allowed me to host a static website with my HTML, CSS, and JS files. No issues here.

## 5. + 6. HTTPS and DNS
The website needed to use HTTPS for security, which involved the use of CloudFront as a CDN, Route 53, and ACM for the certificate. This step was where I ran into my first mistake which, funny enough, was when I forgot to purchase a domain name. I found myself waiting hours for ACM to deliver an SSL certificate. This was an easy mistake to fix, buying a domain name off of Route 53 fixed this instantly. Setting up CloudFront with HTTPS was straight-forward after this.

## 7. JavaScript
Like HTML and CSS earlier, I learned a bit of JavaScript at least to the point of writing a simple script to add the Viewer count, which is connected to my API Gateway and Lambda Function. This step did take a bit of research to properly implement however. I ran into a mistake here after the project was completed, the viewer count displayed **Total Views: [object Object]**, this was fixed by JSON.parse, which turned some JSON format code into a JavaScript object. The view number displayed properly after using parsedData.views.

## 8. Database
I will come back to this part later with IaC. But first, I created a DynamoDB table named cloud-resume-challenge-counter with a views count item within. This database makes up one of three technologies that make up the back end of the resume website, in this case, a database layer.

## 9. + 10. + 11. API, Lambda, Testing
Similar to the Database step, I recreated these with IaC later, I wanted to manually complete this first. For this step, I created a REST API which uses HTTP requests to access and use data, this includes GET, PUT, POST, and DELETE. Then, I created an all-in-one lambda function after doing some research, some used two functions with GET and PUT separate. I opted to create a GET/PUT function which, after some testing, did the exact same action with one method on my API Gateway. Testing was relatively simple, after some research and trial-and-error, I managed to get my function to succeed every test. Finally, I linked the function with a GET method in my API Gateway. After deploying the API, clicking the invoke link not only GETs the base viewer count, it also PUTs a new viewer every click.

I ran into lots of minor issues that took a bit of thinking and research to fix due to it involving code and API gateway, which turned out to be more sensitive to error than I originally thought. Most of the issues came from API Gateway returning error codes upon clicking the invoke link, even though the API test returned a success. Tinkering around with CORS and JSON within my lambda function proved to fix the issues.

## 12. Infrastructure as Code (IaC)
Here is where I learned how to use IaC. The project calls for the back end: DynamoDB, Lambda, and API Gateway to be created with either SAM and CloudFormation or Terraform. I opted to try both and see what I came up with. Overall, I found YAML to be easier to understand than Terraform, however, I know that Terraform is more widely used, and in the future, this is what I will focus on. This step came with lots of research into both YAML and Terraform language in order to format my resources exactly. 

## 13. - 15. Source Control, CI/CD Front End/Back End
This final step proved to be the most interesting to me. This was my first exposure to Continuous Integration and Deployment through GitHub, and I found this learning experience to be enjoyable. By following some guides, I figured out how to use Git and PowerShell to push my code and make automatic updates to my website whenever I edited the code. By using GitHub actions, workflows, and GitHub secrets, I was able to push updates for both the Back End and Front End code.

## Final Thoughts
My journey through this project was both difficult and a great learning experience. As a self-learner, this project provided me with hands-on experience with several AWS services and an opportunity to delve deeper into web development languages such as HTML, CSS, and JavaScript. Alongside, I had the opportunity to explore Infrastructure as Code (IaC) using both YAML and Terraform, and witnessed firsthand the process of Continuous Integration and Deployment via GitHub.

Overall, this challenge helped me reinforce my existing skills and develop new ones, all while constructing a tangible project that I can showcase. Looking forward, I hope to keep learning and improve upon these new skills and possibly get an entry-level AWS job if there are any available. This would allow me to gain real job skills, which in my opinion, are more valuable than anything else I could do for Cloud.

I would advocate anyone seeking to improve their cloud skills to undertake this project. It was difficult as someone who was new to CI/CD and other aspects of the project, but I came out of it with new skills which will prove to be valuable moving forward.