The Real Migration Triggers
Companies don't migrate because Lambda is slow. They migrate because their AWS bill is out of control, they're hitting limits that block new features, or compliance requirements that AWS can't meet.
The actual reasons from migrations I've done:
- Cost spiral: One company hit like $80K/month or something - they had way too many functions, maybe 400+, and most barely did anything. Lambda's per-request pricing destroyed them compared to flat-rate alternatives.
- Concurrency walls: Lambda's 1,000 concurrent execution limit by default. Getting it raised takes weeks and still caps out compared to unlimited GCP Functions.
- Cold start hell: 5-second cold starts on Java functions killed their user experience. No amount of provisioned concurrency helped.
- API Gateway costs: $3.50 per million requests adds up fast when you're doing high-volume APIs versus Cloudflare's $0.50 per million.
What Actually Matters When Picking Alternatives
After watching companies completely fuck up these migrations, here's what actually matters (ignore the consultant frameworks):
Can You Afford This Migration?
Every company thinks migration takes 3 months. Every company is wrong. Budget 6-18 months if you want to keep your job. Enterprise migration studies show 80% exceed initial timelines. Factor in:
- Code rewrites (always more than expected) - platform migration patterns help estimate scope
- New monitoring setup (your Lambda dashboards won't work) - CloudWatch alternatives need months to configure
- Team learning curve (3+ months for platforms like Azure Functions)
- Production incidents (they will happen) - incident response planning is critical
Will This Break Everything?
Spoiler: something will break. The platforms that cause the least carnage:
Google Cloud Functions: HTTP functions port easily, everything else requires painful rewrites. Cold starts still suck but less than Lambda.
Azure Functions: The binding model looks amazing in demos, then breaks randomly at 2am. Binding model will confuse your entire team for months.
Cloudflare Workers: Fast as hell until you need to do anything complex. The 128MB memory limit will fuck you, guaranteed.
Google Cloud Run: Containers solve most portability issues, but you'll spend weeks figuring out their networking model.
Does Your Team Have the Bandwidth?
Real talk: most migrations fail because teams are already overloaded. You need:
- 2+ engineers dedicated full-time (not "when they have cycles")
- Senior engineer who can debug production at 3am
- Manager willing to say no to feature requests for 6+ months
- Budget for external consultants when everything breaks
The Platforms That Actually Work (And Their Gotchas)
After migrating companies to all these platforms, here's the unvarnished truth:
Google Cloud Functions - "Lambda But Different"
Good for: Companies that want minimal rewrites and can tolerate Google's quirks.
What breaks: Event triggers work differently. Your CloudWatch dashboards become useless. Cold starts still happen.
Real migration time: 4-8 months for 50+ functions
Hidden costs: Networking between functions gets expensive fast
Azure Functions - "Powerful But Painful"
Good for: Teams with .NET experience and complex workflow needs.
What breaks: The binding configuration will confuse everyone for months. Version 2.x of the runtime randomly crashes.
Real migration time: 6-12 months because of the learning curve
Hidden costs: Storage account costs that Microsoft doesn't mention upfront
Cloudflare Workers - "Fast Until It's Not"
Good for: Simple HTTP APIs and edge computing.
What breaks: Memory limits (128MB), no persistent connections, limited npm package support. Their cache aggressively caches things you don't want cached.
Real migration time: 3-6 months but only works for simple functions
Hidden costs: KV storage and Durable Objects pricing adds up
Google Cloud Run - "Containers That Scale to Zero"
Good for: Teams comfortable with Docker who want maximum flexibility.
What breaks: Container startup time affects performance. Their load balancer doesn't distribute traffic the way you expect.
Real migration time: 8-12 months because containerizing functions takes work
Hidden costs: Container registry storage and networking between services
Migration Reality Check
Most companies attempt the "hybrid approach" - keeping some functions on Lambda while moving others. This usually fails because:
- Managing two platforms doubles operational overhead
- Cross-platform service communication gets complex fast
- Your monitoring story becomes a nightmare
- Teams get confused about where to deploy new features
The companies that succeed pick ONE primary alternative and migrate 80% of their functions there. The remaining 20% either stay on Lambda or get rewritten as microservices.
What Actually Determines Migration Success
Skip the strategic frameworks. Here's what matters:
Start with a pilot project: Pick 3-5 functions that aren't business-critical. If this takes more than 2 months, your main migration is fucked. Pilot project patterns help identify showstoppers early.
Plan for the migration tax: Everything takes 2-3x longer than expected. Your team will spend weeks debugging platform quirks that the documentation doesn't mention. Technical debt studies show migrations accumulate 40% additional complexity.
Accept that some functions won't migrate: Lambda-specific integrations with SQS, DynamoDB triggers, and Step Functions are hard to replicate elsewhere. Plan to keep 10-30% of functions on Lambda permanently.
Budget for learning curve pain: New platforms mean new ways to fuck up production. Azure Functions binding errors at 2am. Cloudflare Workers memory exceptions during traffic spikes. Google Cloud Run container crashes because of connection limits.
I've watched this migration take down prod at three companies. The ones that didn't fuck it up had realistic timelines, dedicated engineers (not "when they have time"), and managers who actually paused feature work for 6+ months.