After the Free Tier Ends: Mapping the Month-by-Month Cost Curve of AWS, GCP, Oracle and Azure VPS Handovers

Free tiers are not free; they are a 12-month loan with a balloon payment attached. The interesting number is not what you pay in month one, it is what your invoice reads in month thirteen when the promotional credits expire and the full on-demand rate plus egress charges land on the same card. This article models that curve for the four hyperscalers, shows which limits are hidden behind the IOPS and egress meters, and gives the exact migration steps off a free tier onto a flat-price VPS before the first post-trial bill arrives.

What Actually Stays Free After Month Twelve

Almost nothing stays free, and the exceptions are small enough to be irrelevant for production workloads. AWS keeps 750 hours of a t2.micro or t3.micro only for new accounts during the first 12 months; after that the same instance bills at roughly 0.0104 USD/hour in us-east-1 for t3.micro. Google Cloud’s Always Free e2-micro in us-central1, us-west1 and us-east1 is the genuine perpetual exception, but it comes with 30 GB standard persistent disk and 1 GB of North America egress per month, which is close to nothing for a web server.

Oracle Cloud’s Always Free tier is the most generous on paper: up to 4 OCPU and 24 GB of Ampere A1 memory, or two AMD micro instances, plus 200 GB of block storage. Azure’s 750 hours of B1s disappear after 12 months entirely, and the free-tier disk allowance is 64 GB of P6 managed disk with 240 IOPS. For a realistic menu of flat-rate alternatives with no credit expiry, the VPS plans and provider breakdown on virtualserversvps.com lists NVMe tiers with included transfer, which is the comparison that matters against these hourly meters.

The Month-by-Month Cost Curve, Modelled

The table below models a 2 vCPU, 4 GB, 80 GB instance running in us-east-1 or the equivalent region, serving roughly 500 GB of egress per month. Figures use published on-demand list prices rounded to the cent and exclude any committed-use discount, because a free-tier user has no commitment and no enterprise agreement.

Month AWS t3.medium GCP e2-medium Oracle A1 (2 OCPU) Azure B2s
1-3 $0.00 (credit) $0.00 (credit) $0.00 (always free, 1/2 shape) $0.00 (credit)
6 $12.40 $0.00 (still covered) $0.00 $18.10
11 $12.40 $0.00 (still covered) $0.00 $18.10
12 $12.40 $0.00 (credit ends day 90 for $300) $0.00 $18.10
13 $30.37 + $45 egress = $75.37 $25.19 + $60 egress = $85.19 $0.00 for A1 shape, $24.60 if resized $30.37 + $52 egress = $82.37
24 (cumulative) $1,272 $1,442 $0 to $295 $1,451

The jump at month 13 is not linear: instance price roughly doubles or triples at the same time the free egress allowance vanishes. AWS’s 100 GB per month free egress becomes 0.09 USD/GB, so 500 GB costs 45 USD. GCP’s 200 GB free tier becomes 0.12 USD/GB after the first 200 GB, giving 36 USD for the remaining 300 GB. The cumulative 24-month figures are the number to budget against, not the monthly headline.

Hidden Egress, IOPS and Snapshot Meters

Egress is the largest hidden line item. AWS charges 0.09 USD/GB to the internet and 0.01 USD/GB each way across availability zones. GCP charges 0.12 USD/GB beyond 200 GB in North America and 0.19 USD/GB from Europe to Asia. Oracle’s Always Free includes 10 TB of outbound per month, which is why the A1 shape stays at zero above.

Storage performance is metered separately from capacity. gp3 on AWS starts at 3,000 IOPS and 125 MB/s baseline, and every IOPS above that costs money; gp2 scales at 3 IOPS per GB, so an 80 GB disk caps at 240 IOPS and shows 40-80 ms latency at queue depth 32. Azure P6 gives 240 IOPS and 50 MB/s, with bursting limited by credit depletion.

  • Snapshot storage: 0.05 USD/GB-month on AWS, 0.026 USD/GB-month on GCP standard.
  • Public IPv4: 0.005 USD/hour on AWS since February 2024, about 3.60 USD/month per address.
  • NAT gateway: 0.045 USD/hour plus 0.045 USD/GB processed, which quietly adds 32 USD/month.
  • Load balancer: 0.0225 USD/hour minimum, 16.20 USD/month even with zero traffic.

Measuring What Your Instance Actually Delivers

Before deciding whether the paid tier is worth it, measure the free instance. Run a short fio job and a latency test to compare against a flat-rate NVMe box. The command below writes a 1 GB file with 4k random reads at queue depth 32 and reports IOPS and latency percentiles.

fio --name=randread --ioengine=libaio --direct=1 --bs=4k \
  --size=1G --numjobs=1 --iodepth=32 --rw=randread \
  --runtime=60 --time_based --group_reporting

A t3.micro with gp3 baseline reports roughly 3,000 IOPS and a 99th percentile of 1.2-2.5 ms. A dedicated NVMe VPS on the same test reports 120,000-180,000 IOPS with a 99th percentile under 250 microseconds. That gap is the real cost of the free tier: storage throttled enough to stall any write burst.

Reading Your Own Bill Before It Surprises You

Pull the cost explorer data for the trailing month and check the egress category separately from compute. On AWS, aws ce get-cost-and-usage --time-period Start=2026-09-01,End=2026-10-01 --granularity=MONTHLY --metrics BlendedCost --group-by Type=DIMENSION,Key=USAGE_TYPE prints every usage type, and the ones beginning DataTransfer-Out-Bytes are the ones that will not shrink when the credit expires. Check NatGateway-Bytes too, because NAT processing is charged per gigabyte and many free-tier tutorials route all private subnet traffic through it.

On GCP, export billing to BigQuery and group by service.description and sku.description. Oracle shows outbound transfer per compartment daily. The point is a 30-day projection: multiply the current month’s non-compute categories by 12 and add the post-trial instance rate.

The Migration Window: When to Move

The correct time to leave is 30 to 45 days before the trial ends, not the week it ends. That window allows a DNS TTL rollback and a full restore test. Start by lowering the TTL on the A record to 300 seconds and waiting at least two old TTL periods; a 3,600-second TTL that you forget to lower is the single most common cause of a failed cutover. Then snapshot the data and copy it to the new host with rsync over SSH, using -aHAX --numeric-ids to preserve ACLs, hard links and extended attributes.

rsync -aHAX --numeric-ids --info=progress2 \
  -e "ssh -p 2222" /var/lib/mysql/ [email protected]:/var/lib/mysql/

Verify checksums on both sides with find /var/lib/mysql -type f -exec sha256sum {} + | sort -k2 and diff the output. Switch DNS only after a successful restore, an application smoke test and a TLS certificate re-issue on the new host.

Filesystem and Kernel Differences That Break Migrations

Hyperscaler images differ from VPS defaults. Ubuntu 24.04 on AWS and GCP ships cloud-init pointed at 169.254.169.254, and an image copy will hang 120 seconds at boot waiting for a metadata endpoint that does not exist. Clear it with cloud-init clean --logs --seed before first boot.

Check the scheduler after migration. Hyperscaler block devices default to mq-deadline, while KVM guests with NVMe passthrough usually do best with none. Verify with cat /sys/block/vda/queue/scheduler and compare nr_requests: hyperscaler volumes ship at 128, a local NVMe device at 1,024.

Choosing the Exit Target

The exit target should be chosen on three numbers: price per GB of included egress, measured 4k random IOPS and the CPU steal percentage under load. A VPS that costs 12 USD/month with 4 TB of included transfer and 150k IOPS beats a 30 USD/month cloud instance with 45 USD of egress charges, and the gap widens every month the workload runs. Measure before you commit, and keep the old account open for two weeks after cutover so you can roll back without re-provisioning.

Treat the free tier as staging with a hard expiry and a paid environment behind it. Use the trial for benchmarking, not for building on SQS, Lambda or managed queues, because each adds a migration step with no VPS equivalent. Before the clock runs out, shortlist two flat-rate hosts from the VPS provider comparison at virtualserversvps.com.

Leave a Reply