My Cloud Resume Challenge
Published: 2024-07-15 14:13:46

Here's my shot at the Cloud Resume Challenge https://cloudresumechallenge.dev/docs/the-challenge/aws/

I managed to complete the challenge after 2 weeks, well, if I'm completely honest I did not take the AWS Cloud Practitioner certification but plan to get that in the future. I'm a QA Manager by trade, but have got quite a bit of Cloud Experience mainly with Azure. It would have been much easier to just do the challenge with Azure but the whole purpose of the challenge is to learn, so I opted for AWS.

One of the questions I continually see asked on forums related to this challenge is the cloud cost, at the time of writing here's what I've spent in total:

Domain Purchase - $17.34
AWS Route 53 - $0.51
AWS Storage - $0.003
AWS API Gateway - $0.001

Total - $17.86

I would expect depending on traffic the costs here will increase, but I’ve in main taken advantage of the AWS free tier as much as possible. My frugality has its drawbacks, the visitor count API doesn't refresh the visitor data as quickly as I would have hoped also, cost is a factor here but it's an acceptable trade off.

Below is the blurb listing the tools, technologies etc. 

## Github
https://github.com/antowaddle/cloud-resume-sam-template

## Live Site
https://anthony-coughlin-resume.com/

---

## Introduction
The Cloud Resume Challenge encourages participants to build a serverless web application on AWS, focusing on practical AWS skills and modern web development techniques. This challenge is an opportunity to showcase expertise in AWS services and enhance one's portfolio with a real-world project.

---

## Technologies Required
<details>

| Technology         | Description                                                      |
|--------------------|------------------------------------------------------------------|
| AWS S3             | Static website hosting                                           |
| AWS API Gateway    | Create RESTful APIs                                              |
| AWS Lambda         | Serverless compute                                               |
| AWS DynamoDB       | NoSQL database                                                   |
| AWS CloudFormation | Infrastructure as code                                           |
| AWS IAM            | Identity and Access Management                                   |
| AWS CodePipeline   | Continuous integration and continuous delivery pipeline          |
| AWS SAM            | Serverless Application Model                                     |
| HTML/CSS           | Frontend development                                             |
| JavaScript         | Frontend and backend development                                 |
| Python             | APIs and Tests                                                   |
| YAML               | Infrastructure as code (CloudFormation and SAM templates)        |
| Terraform          | Infrastructure as code                                           |

</details>


## Architecture Diagram

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



## Points of the Challenge
<details>

1. **Create a static resume website**: Host your resume as a static website on AWS S3. ✅
I used Amazon S3 Static Website, relatively easy to get setup and deploy with AWS SAM. 
   
2. **Use AWS Lambda**: Implement Lambda functions to handle backend tasks, such as contact form submissions. ✅
The lambda function code for the Get and Put requests were written in Python. 

3. **Utilize AWS API Gateway**: Create APIs to interact with Lambda functions. ✅
As per the above, the APIs accept requests from the web app and communicates with the DB.

4. **Integrate DynamoDB**: Store and retrieve data using DynamoDB, such as visitor statistics. ✅
I switched to using Terraform to deploy my Dynamo DB table. 

5. **Implement AWS CloudFormation**: Define your AWS infrastructure as code for reproducibility. ✅
Managed by AWS SAM, stack(s) created and resources defined within. 

6. **Set up IAM roles**: Manage permissions and security using IAM roles and policies. ✅
A specific user that will remain nameless was setup to configure all the resources.

7. **Implement CI/CD pipeline**: Use GitHub Actions for automated deployment and updates. ✅
I created a pipeline using GitHub actions with stages to test, deploy infra, deploy site and then retest (using playwright)

8. **Design frontend**: Develop a responsive frontend using HTML, CSS, and JavaScript. ✅
I'm no Front End Guru, so kept it relatively simple. 

11. **Version control**: Use Git for version control and collaborate via GitHub or another repository. ✅
Does anyone use anything other than GitHub these days?

12. **Optimize for cost**: Implement cost-effective solutions, utilizing AWS free tier resources where possible. ✅

13. **Testing**: Conduct testing to ensure functionality and performance.
Unit and UI tests added using Playwright. ✅

15. **Deploy publicly accessible site**: Ensure your resume website is publicly accessible and optimized for performance. ✅

## Challenges
Here’s a few things I struggled with:

1. AWS Sam - I encountered several gotchas while using AWS Sam. I ended up switching to using Terraform to deploy the DB. In hindsight I would should have used terraform from the start. 

2. Certificates - I unfortunately created a cert in the wrong region and it had to be deleted. It was very challenging to recreate the cert and associate it with the domain. Be careful with how you create certs and don’t delete them!

3. DynamoDB- it’s plug and play, right? Yes, technically true and great when things go right. Unfortunately for me the table was not getting updated through my put command, I had to do quite a bit of reading in order to get things in order

</details>
## Conclusion

So overall that is it, in terms of time it took me probably around 2 weeks and several hours of tearing my hair out to complete. The journey was bumpy, not to manage that we’ve got a new born and 2 year old at home which didn’t make things easy. 

This is an excellent challenge, throw yourself in, make mistakes, feel good, feel stupid and most important learn.  
---