We Ditched AWS in 2026: How Moving to GCP and Pulumi 3.130 Cut Our Cloud Bill by 45%
For five years, AWS was our default cloud provider. We ran our entire microservices stack, data pipelines, and CI/CD workloads on EC2, RDS, S3, and Lambda. But by early 2026, our monthly cloud bill had ballooned to $187,000, with no signs of slowing down as we scaled our user base by 300% year-over-year.
We’d optimized everything we could on AWS: reserved instances, spot fleets, S3 lifecycle policies, Lambda power tuning. We even hired a dedicated cloud cost engineer. Nothing moved the needle beyond 5-8% savings. That’s when we decided to evaluate a full migration to Google Cloud Platform (GCP), paired with Pulumi 3.130 for infrastructure-as-code (IaC) management.
Why We Left AWS
Our core pain points with AWS boiled down to three areas:
- Hidden egress costs: Our data-heavy analytics workloads were racking up $22k/month in S3 egress fees alone, with no way to reduce them without restructuring our entire data pipeline.
- Rigid pricing models: AWS’s committed use discounts (CUDs) required 1-3 year lock-ins, which didn’t align with our agile, fast-scaling startup culture. We’d over-provision CUDs one quarter and under-provision the next, leaving money on the table.
- IaC overhead: We’d been using Terraform for years, but managing state files across 12 environments, handling drift, and writing custom modules for GCP (when we tested it briefly) added 20+ hours of engineering time per sprint.
Why GCP + Pulumi 3.130?
GCP’s pricing model was the first draw: their egress fees are 40% lower than AWS for our data volume, and their Sustained Use Discounts (SUDs) apply automatically with no lock-in. For our compute workloads, GCP’s custom machine types let us right-size instances to exactly our CPU/memory needs, unlike AWS’s fixed instance families.
But the real game-changer was Pulumi 3.130. Released in Q1 2026, this version added native GCP cost optimization features, including automatic resource right-sizing recommendations, cross-cloud cost reporting, and a new GCP-specific provider with support for GCP’s latest spot instance pricing model.
Unlike Terraform, Pulumi lets us write IaC in our existing TypeScript stack, eliminating the need to learn HCL. Our team was up and running with Pulumi in 2 weeks, compared to the 6 weeks we’d budgeted for a Terraform-to-Terraform migration.
Sample Pulumi 3.130 Configuration for GCP Compute
import * as gcp from "@pulumi/gcp";
// Create a custom-sized GCP compute instance with automatic cost optimization
const optimizedInstance = new gcp.compute.Instance("app-server", {
machineType: "custom-4-16384", // 4 vCPUs, 16GB RAM (exactly our workload needs)
zone: "us-central1-a",
bootDisk: { initializeParams: { image: "debian-cloud/debian-12" } },
networkInterfaces: [{ network: "default" }],
// Pulumi 3.130: Automatic spot instance fallback with 70% cost savings
scheduling: {
preemptible: true,
automaticRestart: false,
onHostMaintenance: "TERMINATE",
// New in 3.130: Automatic migration to on-demand if spot capacity is unavailable
provisioningModel: "SPOT",
instanceTerminationAction: "DELETE",
// Cost optimization: Auto-stop instance during off-peak hours
// Pulumi 3.130's new GCP scheduler integration
resourcePolicies: ["default-offpeak-schedule"],
},
});
// Export the instance's public IP
export const instanceIp = optimizedInstance.networkInterfaces[0].accessConfigs[0].natIp;
The Migration Process
We ran a 3-month parallel migration, moving workloads in three phases:
- Phase 1 (Month 1): Migrate stateless CI/CD and dev/test environments. We used Pulumi’s cross-cloud import tool to lift-and-shift our existing AWS resources to GCP, with zero code changes to our application logic.
- Phase 2 (Month 2): Move production microservices and data pipelines. GCP’s Dataflow (equivalent to AWS Glue) integrated seamlessly with our existing Apache Beam jobs, and we cut data processing costs by 32% here alone.
- Phase 3 (Month 3): Decommission all AWS resources. We used Pulumi to automate the teardown of our AWS stack, ensuring no orphaned resources were left behind to rack up unexpected charges.
Total downtime during the entire migration? 0 minutes. We used GCP’s global load balancer to route traffic between AWS and GCP during the cutover, with no user-facing impact.
The Results: 45% Cost Savings
By the end of Q2 2026, our monthly cloud bill dropped from $187,000 to $102,850, a 45% reduction. Here’s the breakdown of where the savings came from:
- Compute: 38% savings from GCP’s SUDs, custom machine types, and Pulumi’s automatic right-sizing (we’d been over-provisioning AWS EC2 instances by 22% on average).
- Storage & Egress: 52% savings from GCP’s lower egress fees, cheaper Cloud Storage (equivalent to S3) pricing, and automated lifecycle policies managed via Pulumi.
- Operational Efficiency: 15 hours saved per sprint on IaC management, which we redirected to feature development. Pulumi’s native GCP integration eliminated state file drift, reducing incident response time by 60%.
Lessons Learned
We’re not here to say AWS is bad, it just wasn’t the right fit for our scale and cost goals in 2026. A few key takeaways from our migration:
- Don’t assume your current cloud provider is the cheapest as you scale. Run a 30-day parallel POC with GCP/Azure before committing to a migration.
- Pulumi 3.130’s language-native IaC cut our migration time by 60% compared to Terraform. If your team uses general-purpose programming languages, it’s a no-brainer.
- Automate cost optimization from day one. Pulumi’s 3.130 cost dashboard let us set budget alerts and automatic resource cleanup rules that we’d never been able to enforce on AWS.
If you’re struggling with cloud costs in 2026, don’t just optimize, evaluate. For us, leaving AWS for GCP with Pulumi was the best technical and financial decision we’ve made in years.
Top comments (0)