Taliferro Group

Cloud services are ingredients

Architecture is the recipe

A project can use VPCs, load balancers, Cloud SQL, and IAM roles exactly as documented and still end up fragile, overpriced, or insecure. Knowing what each GCP service does is not the same as knowing how they should fit together. Taliferro designs the architecture underneath the services — not just the services themselves.

Published: 4 Feb 2023 · Updated: 1 Aug 2026

By Tyrone Showers

Co-Founder Taliferro

Article

The pieces GCP gives you

Google Cloud Platform is a large catalog of services — storage, networking, databases, load balancing, identity controls. Every one of them works as documented. That's exactly why teams get into trouble: a system built from correctly-configured pieces can still be the wrong system, because nobody decided how those pieces should relate to each other.

This isn't a tour of the GCP console. It's the handful of decisions that actually determine whether the architecture holds up: how regions and zones affect availability, how networking and storage choices affect cost and security, and where teams typically skip a decision they didn't realize they were making.

  
              
          # Create a VPC network with custom subnet
          
          gcloud compute networks create my-vpc --subnet-mode=custom
          
          
          # Create a subnet within the VPC
          
          gcloud compute networks subnets create my-subnet --network=my-vpc --range=10.0.0.0/24
          
          
Creating a Virtual Private Network (VPC) in GCP

The decisions that actually matter

Regions and zones

A region is a geographic area (say, us-central1). Each region contains multiple zones — physically separate data centers with their own power and cooling. The decision that matters: if your whole deployment sits in one zone, a single data center outage takes you down. Spreading across zones (or regions, for anything that needs to survive a regional outage) is what actually buys you availability — not the fact that you're "on GCP."

  
              
          
          # Create an HTTP load balancer
          
          gcloud compute forwarding-rules create my-lb-rule --global --ports=80 --target-http-proxy=my-lb-proxy
          
          
          
          # Create a backend service
          
          gcloud compute backend-services create my-backend-service --global
          
          
          
          # Add instances to the backend service
          
          gcloud compute backend-services add-backend my-backend-service --global-instance-group=my-instance-group
          
          
          
Setting Up Load Balancing in GCP

Networking

A VPC is your private network inside GCP — you decide the IP ranges, which subnets exist, and which resources can talk to which. A load balancer sits in front of that and spreads incoming traffic across your instances, so one overloaded server doesn't take down the whole app. Neither of these is optional for anything beyond a toy project; they're the difference between "it works on one box" and "it works under real traffic."

Storage

Four options cover almost everything, and picking the wrong one is a common source of both cost and performance problems:

  • Block storage — like a hard drive attached to one machine. Fast, low-latency, but tied to that machine.
  • Object storage — for files you access by name, not by filesystem path: images, backups, exports. Cheap, durable, scales without limit.
  • File storage — a shared filesystem multiple machines can mount at once. Use it when several instances genuinely need to read and write the same files.
  • Relational databases — structured data with a defined schema, where you need real queries and data integrity, not just storage.
  
              
          
          # Create a new Cloud Storage bucket
          
          gsutil mb gs://my-bucket-name
          
          
          
          # Copy files to the bucket
          
          gsutil cp file.txt gs://my-bucket-name
          
          
          
          # List objects in the bucket
          
          gsutil ls gs://my-bucket-name
          
          
          
          # Make a bucket publicly accessible
          
          gsutil iam ch allUsers:objectViewer gs://my-bucket-name
          
          
          
Creating and Managing Storage Buckets (Object Storage) in GCP

Where teams actually get this wrong

Security is a network design decision, not a checkbox

IAM roles and firewall rules only work if the network underneath them is designed to isolate things in the first place. A database that doesn't need to be reachable from the public internet should be on a subnet that makes that unreachable — not just "protected" by a rule someone could accidentally loosen later. Design the isolation into the layout; don't rely on permissions to compensate for a flat network.

Availability comes from where you put things, not from GCP itself

GCP can support high availability. It doesn't do it for you. If every instance of your app lives in one zone, you have single-zone availability, full stop — no different from running on a single server. Multi-zone (or multi-region, for workloads that need it) is a decision you make when you design the deployment, not a feature that turns on by default.

  
              
          
          # Create a MySQL instance
          
          gcloud sql instances create my-sql-instance --database-version=MYSQL_5_7 --region=us-central1
          
          
          
          # Connect to the MySQL instance
          
          gcloud sql connect my-sql-instance
          
          
          
          # Create a database within the instance
          
          CREATE DATABASE my_database;
          
          
          
Using Relational Databases (Cloud SQL) in GCP

Managed services trade control for less operational work

Cloud SQL, managed Kubernetes, and similar services mean Google handles patching, backups, and failover instead of your team. That's a real win for most applications — but know what you're giving up: less control over exact configuration, and a dependency on Google's maintenance schedule instead of your own. It's usually the right trade. It's still a trade.

Cost problems are almost always idle resources, not expensive ones

We caught this exact issue running TODD's own infrastructure: a batch of instances spun up for a testing sprint kept running for weeks after the sprint ended, quietly billing the whole time because nobody had a step in the process for tearing them down. Monitoring is what caught it, not budget review — the invoice looked normal until someone actually looked at what was running. The fix wasn't a cheaper instance type. It was a scheduled check for exactly this kind of leftover.

Questions worth answering directly

What's the single biggest architecture mistake teams make on GCP?

Deploying everything into one zone and calling it done. It works fine until that zone has a problem, and then it's not a GCP outage — it's your outage, because nothing about your deployment was actually designed to survive it.

Do I need a VPC for a small project?

Yes. It costs nothing extra and it's the thing that lets you isolate a database from the public internet later without re-architecting. Skipping it to save five minutes now is the kind of shortcut that gets expensive.

How do I know which storage type to use?

Ask what's actually reading the data. One machine needing fast access: block storage. Files by name, not path, at any scale: object storage. Multiple machines sharing files: file storage. Structured data you'll query: a relational database. Most storage mistakes come from picking based on price instead of access pattern.

What's the fastest way to cut GCP costs?

Find what's running that nobody's using — not renegotiate pricing. gcloud compute instances list --filter="status=RUNNING" takes ten seconds to run and routinely turns up exactly this.

  
              
          
              # List and filter running instances
              
              gcloud compute instances list --filter="status=RUNNING"
              
              
          
              # Create a shutdown script to deactivate idle instances
              
              #!/bin/bash
              gcloud compute instances stop INSTANCE_NAME --zone=ZONE
              
              
          
              # Schedule a shutdown script using Cron
              
              gcloud compute instances add-metadata INSTANCE_NAME --metadata startup-script=gs://BUCKET/startup-script.sh
              
          
          
Cost Optimization with Resource Management

The takeaway

Every service GCP offers can be configured exactly right and still add up to the wrong system, because the architecture is the relationships between the pieces, not the pieces themselves. Regions and zones decide what survives an outage. Networking decisions decide what's actually secure. Storage choice decides whether you're fast or just expensive. None of that comes from reading the documentation for each service in isolation — it comes from deciding, on purpose, how they fit together.

Tyrone Showers
Need a cloud architecture reality check?

Use the article to frame the issue, then review how we untangle cloud systems, connect it to the Momentum System, or book a cloud review.

Want this fixed on your site?

Tell us your URL and what feels slow. We’ll point to the first thing to fix.

Explore Taliferro's free tools: Ask TODD · Find · Email Signature Builder · SayIt · Lead Vault · Meet Maya — or become an affiliate.