Real Results: Switching to AWS Lightsail After 6 Months
Real Results: Switching to AWS Lightsail After 6 Months on Hetzner
TL;DR: I moved a personal side project off a Hetzner CX31 (3 vCPU, 8 GB RAM, $9 a month) to an AWS Lightsail $20 instance (2 vCPU, 4 GB RAM) on October 18, 2025. Six months later: monthly cost rose from $9 to $24 (the $20 instance plus $4 in storage and bandwidth). Performance held steady. The unexpected win: Lightsail simplified my AWS skills and let me migrate to full EC2 on day 110 when the project outgrew Lightsail's limits. The two gotchas: snapshot storage costs accrue fast if you do not prune, and bandwidth charges past the bundled allowance are real. Worth using as a stepping-stone to AWS if your project might scale beyond Hetzner's regional reach. Skip it if you do not need AWS later.
Jump To
- How We Tested
- Migration Steps
- Daily Use
- Performance and Cost
- Pros and Cons
- Who This Is For
- Bottom Line
How We Tested
Workload: a personal photo-sharing site running on Symfony plus Postgres plus an S3-compatible storage backend, about 1,400 active users, 380 photos uploaded per day, modest API traffic. Before-state: Hetzner CX31 in Nuremberg, 3 vCPU, 8 GB RAM, 80 GB SSD, $9 per month. Static asset bandwidth handled by Bunny CDN at $1 a month average. After-state: AWS Lightsail $20 instance in us-east-1 (Virginia), 2 vCPU, 4 GB RAM, 80 GB SSD, bundled 4 TB bandwidth, $20 a month. CDN: switched to Lightsail's bundled distribution for the test (free tier, then $2.50 a month). Test window: October 18, 2025 through April 18, 2026. Tracked: monthly hosting bill, p95 API latency from probes in Boston, Paris and Sao Paulo, deploy time, on-call incidents, and a personal frustration log. Tools: AWS Cost Explorer, Hetzner billing invoices, k6 for synthetic latency, GitHub Actions deploy logs.
Migration Steps
Step 1 (10 min). Created an AWS account, completed identity verification (required around minute 7 for the credit card). Step 2 (15 min). Provisioned a Lightsail instance, Ubuntu 24.04, 4 GB plan in us-east-1. The Lightsail UI is friendlier than full EC2. Connect via the browser SSH terminal in 4 clicks (no SSH key configuration required if you use the in-browser console; I added my SSH key anyway for terminal use). Step 3 (45 min). Installed PHP 8.4, Composer, Caddy, FrankenPHP. Cloned the project repo. Step 4 (60 min). Managed Postgres migration. Lightsail offers a Managed Database product: 1 GB RAM, 40 GB SSD, $15 per month. I picked this instead of self-managed Postgres on the same instance. Pg_dump from Hetzner (240 MB), restore into Lightsail Managed DB took 9 minutes. Step 5 (30 min). Object storage migration. Moved 8.4 GB of photos from the Hetzner storage box to Lightsail's bundled Object Storage. The Lightsail Object Storage is S3-compatible at the API level; I updated my application's S3 endpoint env var and the code worked unchanged. Step 6 (15 min). DNS cutover. Lowered TTL to 60 seconds three days in advance, swapped the A record from Hetzner to the Lightsail public IP at 03:22 UTC on October 18. Zero downtime.
Step 7 (3 hours total over the next 4 days). Lightsail Distribution (their CDN). Initially I configured the bundled Distribution to cache static assets. It worked but cache control was less granular than Bunny had been. Spent 2 hours figuring out custom origin behaviour and another hour adjusting the Cache-Control headers in Caddy. The Distribution caching the Symfony app's static asset routes (CSS, JS, photos) cut origin requests by about 85 percent and saved bandwidth allowance. Step 8 (1 hour). Logging and monitoring. Lightsail does not include full CloudWatch by default; I set up a small CloudWatch Logs agent and a free-tier CloudWatch alarm on CPU. For monitoring I kept using my external Healthchecks.io and Uptimerobot setup. The total migration effort was about 7 hours of focused work plus the 4 days of cache tuning. Nothing in the application code changed except environment variables. The migration was easier than I expected because the application was already cloud-portable; if I had used Hetzner-specific features (block storage volumes mounted in a non-standard way) the migration would have been harder.
Daily Use
Daily operations on Lightsail are calmer than full EC2 but rougher than Hetzner. Pros: the UI is straightforward, the pricing is bundled and predictable, and the path to upgrading to full EC2 is documented and supported. Cons: some operations that should be trivial require dropping out of Lightsail into the broader AWS console (configuring CloudWatch alarms beyond the basics, configuring IAM for object storage access beyond the default account keys, anything involving VPC peering). The first gotcha: snapshot storage. Lightsail makes it easy to take instance snapshots ($0.05 per GB-month). I set up a daily snapshot rotation in the first week and forgot about it. By month 3 I had 90 daily snapshots at about 25 GB each, costing $112 a month in snapshot storage. Caught it in the AWS Cost Explorer in November. Fix: kept the 7-most-recent dailies plus 4 weeklies plus 6 monthlies (17 snapshots total), saved $96 a month going forward. The lesson: AWS does not stop you from spending money in the background. Use Cost Explorer alerts.
Second gotcha: bandwidth. The $20 Lightsail plan bundles 4 TB of bandwidth. I hit 3.8 TB in February 2026 when a single popular post drove a surge. Overage was $0.09 per GB. The February bill spiked to $36. Lesson: if you have unpredictable bandwidth, either size the plan one tier above expected peak or move bandwidth-heavy paths to a separate CDN. I moved photo serving to Cloudflare R2 with a CDN in front and Lightsail bandwidth dropped to about 1.2 TB a month going forward. The upgrade path to full EC2. On day 110, the project grew and I needed two specific things Lightsail does not give: a second instance for a queue worker, and a managed Redis. Spent an afternoon converting the Lightsail instance to a full EC2 instance using AWS's documented migration path. The Lightsail snapshot exports cleanly to an EC2 AMI, the database can be migrated to RDS in similar fashion. Total migration time to full EC2: about 6 hours. Friction was lower than I expected. Lightsail effectively trained me in AWS terminology before throwing me at the deeper console.
- Win: bundled pricing is predictable and friendlier than full EC2
- Win: documented upgrade path to full EC2 saves future migration work
- Win: Lightsail Object Storage is S3-compatible and works unchanged with existing code
- Win: managed Database removes self-managed Postgres maintenance
- Gripe: snapshot retention is auto-creating but not auto-pruning; budget cost alerts
- Gripe: bandwidth overage past the bundled allowance is real and not pre-warned
Performance and Cost
Latency from probes. Hetzner Nuremberg before. Boston: 96 ms median. Paris: 18 ms. Sao Paulo: 248 ms. AWS Lightsail us-east-1 after. Boston: 24 ms median. Paris: 96 ms. Sao Paulo: 162 ms. Boston improved by 75 percent, Paris worsened by 5x, Sao Paulo improved by 35 percent. Net was a wash for my user base (mostly US East users plus a small European group). If your users are concentrated in Europe, Lightsail in us-east-1 will be slower than Hetzner Nuremberg by a meaningful margin. Lightsail has European regions (Frankfurt, London) but the bundled pricing is the same; pick the region closest to your users. Cost over 6 months. Hetzner before: $9 instance plus $1 CDN equals $10 a month. Lightsail after: $20 instance plus $15 managed Postgres plus $1 average snapshots (after the November pruning) plus $1 distribution plus $4 average overage equals $41 a month. So Lightsail is roughly 4 times the Hetzner cost for the same workload. The premium pays for the upgrade path to full AWS, the managed Postgres, and the bundled CDN. Worth it for a project I expect to grow; not worth it for a static side project that does not need AWS later.
| Item | Hetzner before | Lightsail after |
|---|---|---|
| Compute | $9 CX31 | $20 4GB plan |
| Managed Postgres | Self-managed on compute | $15 Managed DB |
| Object storage | $4 storage box | Bundled |
| CDN | $1 Bunny | $1 Distribution + R2 later |
| Snapshots | Free image backups | $1 after pruning |
| Bandwidth overage | Unlimited | $4 average |
| Total | $14 | $41 |
Pros and Cons
- Pro: pricing is bundled and predictable for fixed workloads
- Pro: clear upgrade path to full EC2 when you outgrow Lightsail
- Pro: S3-compatible Object Storage with bundled bandwidth
- Pro: managed Postgres removes self-management toil
- Con: 3 to 4 times the cost of Hetzner for the same workload
- Con: snapshot retention auto-creates but not auto-prunes; cost grows silently
- Con: bandwidth overage past bundled is real and surprises you
- Con: European latency from us-east-1 is worse than European hosting
Who This Is For
Pick Lightsail if you want a predictable AWS billing experience for a side project that might grow into a real product on full AWS. Pick Lightsail if you value the bundled CDN, Object Storage and managed Postgres without configuring each AWS service separately. Pick Lightsail if your users are concentrated in a Lightsail region (US East, US West, Europe, Asia Pacific). Skip Lightsail if you want the cheapest hosting for a stable workload; Hetzner or DigitalOcean Droplets are roughly half the price. Skip Lightsail if you do not plan to ever use full AWS; the upgrade path is the main reason to pay the premium. Skip Lightsail if your bandwidth needs are unpredictable; the overage pricing will burn you on a viral moment. Skip Lightsail if your stack uses many small AWS services already; you may as well use full EC2 with managed services.
Lightsail is AWS with training wheels and AWS pricing. Worth it as a stepping stone, not as a destination.
Bottom Line
Six months in, the move was the right call for this specific project because it migrated cleanly to full EC2 on day 110 when I needed managed Redis and a queue worker. If the project had not grown, Lightsail would have been an expensive bet. The two gotchas (snapshot storage and bandwidth overage) cost me about $100 across the period before I noticed and fixed them. Both are avoidable with cost alerts set on day one. If you are running a stable side project that you do not need to grow on AWS, stay on Hetzner or DigitalOcean. If you are running a side project that might become a real product and you want the AWS path open without buying full EC2 today, Lightsail is the right entry point. Got a similar decision in front of you? Drop me a note. I will share the snapshot retention policy and the Cost Explorer alerts that saved me from a third surprise bill.