DEV Community

Cover image for The Cloud Resume Challenge: My GCP Implementation
Temitayo Apata
Temitayo Apata

Posted on

The Cloud Resume Challenge: My GCP Implementation

Over the past few weeks, I’ve been working on the Cloud Resume Challenge - a hands-on project that combines cloud infrastructure, CI/CD, APIs, and a bit of frontend work. My goal was to build a fully cloud-native resume site hosted on Google Cloud Platform (GCP), with all infrastructure managed as code and automated deployments.

You can check it out here: www.temitayoapata.online

What I Built

Static Resume Hosting: I hosted my resume’s HTML and CSS in a public Google Cloud Storage (GCS) bucket. Instead of setting up a Google Cloud Load Balancer (which would have added complexity and ongoing costs). I connected the bucket to Cloudflare. Cloudflare handled DNS, CDN, and SSL for free.

This approach gave me global caching, fast delivery, and HTTPS security without extra infrastructure. By relying on Cloudflare’s free tier instead of Google Cloud’s paid load balancing, I kept my setup lightweight and avoided unnecessary costs while still delivering a professional, production-ready site.

Visitor Counter API: A small Flask API runs on Cloud Run and connects to Firestore. Each time the page loads, the API increments a counter and returns the updated value.

visitor count

Infrastructure as Code: I provisioned everything—Cloud Run services, IAM permissions, API enablement, etc.—with Terraform, making the setup repeatable and version-controlled.

CI/CD Automation: I used GitHub Actions and Cloud Build for automated deployments, so pushing code triggers infrastructure updates and redeployments without manual intervention.

Here are some of my biggest takeaways and challenges:

Infrastructure as Code is powerful, but tricky at first

Terraform made infrastructure reproducible, but also unforgiving. Typos in resource names or IAM bindings caused long trial-and-error cycles. I had to get used to reading Terraform error messages and learning when to apply, plan, or roll back.

CI/CD pipelines taught me discipline

Setting up a GitHub Actions pipeline to deploy changes automatically was a big learning curve. It wasn’t just about “getting it to work.” I had to think about security, secret management, and proper testing before pushing code to production.

One specific challenge was configuring Workload Identity Federation so GitHub Actions could authenticate with Google Cloud without storing long-lived keys. I kept running into errors with the attribute conditions, and only after carefully reviewing Google’s documentation did I finally get it working. That small win felt like a huge step forward.
Deployment Pipeline

Testing and code quality matter

Working on this project made me realize why testing is non-negotiable. Writing automated tests for my Cloud Run API showed me how easily small mistakes can slip into code. It also pushed me to write cleaner, more reliable Python while making sure my visitor counter works as expected every time.

Automated testing also gave me peace of mind. Every time I pushed code, I knew that if something broke, the pipeline would catch it before it reached production.

Code snippet

CORS and API Requests

Deploying the visitor counter API on Cloud Run with Firestore integration was not as smooth as I imagined. Since the frontend runs on a different origin (Cloudflare) than the backend (Cloud Run), I hit CORS issues when calling the API. Flask-CORS helped fix this, but it taught me the importance of properly configuring origins, headers, and methods.

What I learned is that logs are your best friend. Checking Cloud Run logs, Firestore error messages, and GitHub Actions output became part of my daily workflow. Over time, I got faster at spotting where the problem was.

CORS Error

The biggest lesson: end-to-end thinking

This project wasn’t just about writing Python code or deploying a VM, it was about thinking end-to-end.

How does the frontend connect to the backend?

How does the backend talk securely to the database?

How do I make sure deployments are repeatable and safe?

How do I avoid managing secrets manually?

Answering these questions helped me understand how DevOps and cloud engineering tie everything together.

The Cloud Resume Challenge wasn’t easy, but that’s the point. It forced me to learn practical skills in cloud infrastructure, CI/CD pipelines, security, and automation. Most importantly, it gave me the confidence that I can tackle complex cloud projects and break them down into manageable steps.

If you’re looking to grow in cloud or DevOps, I highly recommend trying this challenge. It won’t just test your technical skills, it’ll change the way you think about building and deploying software.

Github repo

Top comments (0)