DEV Community


A College Graduate's Guide to Cloud Computing

I am a highly motivated person and a quick learner. I love writing automation and take pride in my work.
・Updated on ・7 min read

My picture
Hey everyone, my name is Steven McGown. I recently graduated from the College of Engineering and Computing at the University of South Carolina in May of 2021. I am currently seeking a job in the DevOps field. While I was in school, I was encouraged by a good friend to study Amazon Web Services to accelerate my career after graduating. I wanted to create this post to encourage college students who are struggling to persevere and to show that anyone with tech knowledge and tenacity can graduate with promising job prospects.

When it rains, it pours!
The last few semesters leading up to graduation and the months thereafter were the most challenging times of my life. My dad had open heart surgery at the peak of COVID-19 and suffered a major stroke the week before my last set of final exams. There were many times I wanted to give up and even a point where I was told I should drop out to focus on taking care of my dad. In fact, the only reason I was able to continue my college courses was because of the pandemic. Since COVID-19 caused everything to be migrated online, I was be able to take care of my dad while doing school assignments.

I recognize that it is certainly a privilege to be writing a blog post about the struggle of getting through college. Nevertheless, I want my college experience and education outside of school to serve as an example that you should never give up on your goals no matter what life throws at you. With this mindset, I was able to graduate and move forward towards starting my career.


The road ahead...
Shortly after I graduated, I was introduced to AWS and encouraged by a good friend to take the Cloud Resume challenge created by Forrest Brazeal. Since I was obligated to stay at home with my dad, I saw this as an opportunity to hunker down and study hard to complete the challenge.

The first step of the Cloud Resume Challenge was to obtain the AWS Certified Cloud Practitioner certification. I used ACloudGuru's cloud practitioner course along with the AWS white papers and practice exam questions to study for the exam.

I was surprised to find how much I could still learn from the resume challenge even after graduating college. Even after obtaining the Cloud Practitioner certification, I ran into problems that I had not been taught how to solve. This is when I realized that college by itself does not prepare you for the workforce nor does it equip you with every tool that you need to solve problems like the ones presented in the cloud resume challenge. You really must continue to learn on your own if you wish to grow and expand your skill set.

Cloud Resume Objectives:

  1. Obtain the AWS Cloud Practitioner certification: Obtaining this certification equips you with the skills in order to complete this challenge.
  2. Write the resume in HTML: Not in a Word document, not in a PDF. This resume will be displayed on a website.
  3. Style the resume with CSS: Does not have to be fancy, but should show something other than just raw HTML.
  4. Deploy as a static website, have a custom domain name and secure with HTTPS: The website will be hosted from an S3 bucket with a domain name from Route53 and secured with HTTPS from CloudFront
  5. Visitor counter with Javascript: The Javascript function helps display how many visitors have come to the website.
  6. Retrieve and update the count from a database: Use DynamoDB for this, there is no reason to use relational databases for something this simple.
  7. Use an API to as a medium between the web app and the database: I used AWS SAM to create the API. It is much more intuitive than manually creating an API. AWS SAM automatically generates an API Gateway template and Lambda functions with CloudFormation.
  8. Use python for back-end: Boto3's library for AWS was the way to go with this. Luckily I had already been using python in my other classes in school, so using it was easiest for me. Python is also good for writing test functions.
  9. CI/CD needed to set up through Github for any future changes. Use github actions to automate deployment of changes. Use frequently, don't push large changes

Problems I ran into along the way

Problem 1: HTML and CSS
I never took formal web development courses in college, only in high-school which I did not remember much of. I did have to use HTML and CSS for my senior design project, however. Thankfully most of the problems I ran into were very well documented and did not prevent me from making progress on the challenge.

Problem 2: Resolving permission errors in Lambda
I used python to retrieve data from the DynamoDB table because I was more comfortable using it than JavaScript. When I first wrote the fetch command, I was so excited because I finally figured out how to retrieve data from DynamoDB tables.

Using AWS SAM, I generated a "HelloWorld" template that I could edit which would communicate between the web app and the database. By doing this I would simply have to swap out the code provided by the template with code I wrote myself. When I built this, I was unable to retrieve the data by fetching the link given by SAM. I remembered from my AWS training that I needed to look at CloudWatch to see what was happening with the API calls.

Lambda needed the following permissions in order to perform the GET and PUT operations I needed:
Allow: logs:CreateLogGroup
Allow: logs:CreateLogStream
Allow: logs:PutLogEvents

Problem 3: Javascript
Before doing this challenge, I had very rarely touched JavaScript and avoided it whenever it was possible. I'm glad that this was a requirement because it took me out of my comfort zone. However, the framework that I was using did not make it easy for me to use JavaScript.

You can not use script elements inside HTML pages of components in Angular, so to load JavaScript files in a component you have to do it manually in the typescript file. This took a while for me to figure out, but thankfully I was able to get past it and move forward.

Problem 4: CORS error
This problem was especially frustrating because I had believed that I was closer to finishing the view counter than I actually was.

CORS error

To fix this error, I had to add "Access-Control-Allow-Origin": "*" to the headers section of my response object

CORS fix

Problem 5: Python Unit Testing
I've done unit tests before in college, so this was not something that I struggled with too much. Since my Lambda functions were generated using a "Hello World" template, I was confused about what functions I should be testing. When I do this again in the future, I plan to have design templates with memorable names so this kind of confusion is not an issue.

Eventually, I figured out that I could run tests using the provided event.json file using:
sam local invoke -e ./events/event.json HelloWorldFunction

I remembered that I used .yaml files in GitHub Actions during the CI/CD portion of the challenge, so I quickly realized that I could call my own test functions using my newly created Lambda test function.

sam local invoke -e ./events/event.json LambdaTestFunction

This test function that I wrote simply checked the values before and after incrementing the visitor count. In doing this portion of the challenge, I also learned the difference between unit testing and integration testing. I can see how these tests would be important for much larger projects.

Problem 6: CI/CD via GitHub
This was the first time I had ever used GitHub actions to pipeline anything. I found an AWS service while trying to solve this step called "Code Pipeline" which achieves the objective of updating the S3 bucket. However, the challenge specifies that you should use GitHub actions to do this. AWS free tier only includes one free pipeline per month anyway.

I created a shell script to build my website, recursively remove the objects from my S3 bucket, sync my built files to the S3 bucket, and then invalidate the CloudFront cache on my CloudFront distribution so my website would be updated correctly.

This was a similar process for the back-end python tests. I also found a neat tool called nosetests which automatically finds test cases in your code and runs them.

My thoughts on the Cloud Resume Challenge
I think that every person who wants to get into cloud development should take this challenge. If you're an entry-level developer like me, doing so will take you out of your comfort zones and will help you expand your skill set.

I want to thank Forrest Brazeal for creating this challenge because I know that the skills I have learned will help me in the future.

Final Thoughts

I want to reiterate that nobody teaches you how to solve the problems above in college. In fact, Google and Stack Overflow were my best friends while completing this challenge.

If you can't figure out a problem, then you should keep searching and explore different ways of solving it. If there's anything I have learned through my journey through college and learning AWS services it is that you cannot let setbacks squash your ambitions. There will always be trials and the world is not going to wait on you to regain your motivation; it will simply pass you by.

Carpe Diem.

Please check out my resume at
If you are interested in working with me, check out my linkedin profile at:

"The computer will tell you 99 times that you're an idiot. You have to be willing to go back the hundredth time in order to figure things out."
-Duncan Buell

Discussion (2)

loujaybee profile image
Lou (πŸš€ Open Up The Cloud ☁️) • Edited

Nice! Congrats Steven!

Welcome to the school of "Google and Stack Overflow" πŸ˜‚

Recursively remove the objects from my s3 bucket

For what it's worth if you were using S3 sync, you have the --delete flag (

stevenmcgown profile image
StevenMcGown Author

Thank you for taking time to provide feedback Lou :)

I am currently using rm:
aws s3 rm s3:// --recursive

However, I am using sync to upload the files from my distribution folder created after the build.
aws s3 sync ./dist/CloudResumeChallenge2/ s3:// --acl public-read