Hosting options: Deployment efficiency matters
Hosting options as AWS App Runner moved into maintenance mode. Deployment efficiency matters
https://inagentic.ai/news/mcp-servers-oxcomply-inagentic/
Most teams pick a deployment platform once and live with it for years. The gap between the fastest and slowest path from Dockerfile to live URL is hours, not minutes, monthly cost can vary three to five times for the same workload, and how fast a code change reaches production once a service exists matters just as much, yet gets talked about far less.
This matters more now: AWS App Runner has moved into maintenance mode (no new customers after April 2026), and Heroku shifted to sustaining engineering in early 2026. Thousands of teams are re-evaluating where to run their workloads.
What "deployment efficiency" actually means
- Setup time. Account creation to a live, HTTPS-reachable URL.
- Update time. Code change pushed to that change serving live traffic on an already-running service. The number most comparisons skip, and the one you live with daily.
- Cost per month. A small, always-on container at modest traffic, not a sleeping free-tier demo.
Setup time is paid once. Update time is paid every deploy, for the life of the service. Ten extra minutes of setup for thirty seconds saved on every redeploy pays for itself within weeks of normal shipping cadence.
Setup time vs. update time: the comparison
Setup assumes a working Dockerfile and repo, account creation to live URL. Update assumes that service already exists, measured from push to live traffic.
| Platform | Setup time | Update time | Why |
|---|---|---|---|
| Railway | Under 5 minutes | 15 to 60 seconds | Railpack builds and ships fast, and railway up from the terminal skips the dashboard entirely. Instant rollback to the previous deployment if something breaks. |
| Render | 5 to 15 minutes | 1 to 3 minutes | Auto-deploys on every push to the connected branch. Zero-downtime rolling deploys, but the build step is generally slower than Railway's. |
| Google Cloud Run | 10 to 20 minutes | 30 seconds to 2 minutes | Each deploy creates a new immutable revision and shifts traffic once it's healthy. Traffic splitting and instant rollback to any prior revision are built in. |
| Fly.io | 15 to 30 minutes | 30 seconds to 2 minutes | fly deploy does a rolling update machine by machine. Fast per machine, but the total time scales with how many machines and regions you're running. |
| AWS ECS Express Mode | 30 to 60 minutes | 3 to 6 minutes | A new image push triggers a fresh ECS deployment, gated by ALB health checks before old tasks are drained. Reliable, but the health-check cycle adds real minutes you don't get back. |
| AWS ECS Fargate (standard) | Half a day to several days | 5 to 10 minutes | Same health-check-gated rollout as Express Mode, often slower still if you've configured blue-green deployments through CodeDeploy for extra safety, which add their own validation window. |
Setup and update rankings don't fully agree. Cloud Run and Fly.io take longer to set up but are near the front on update speed once running. ECS pays a structural tax on both, the cost of its health-check-gated safety net. If you ship daily, weight update time more heavily than setup time.
Cost per month: the comparison
List prices mislead. The comparison below is a small, always-on web service: roughly 0.5 vCPU, 512MB to 1GB RAM, modest traffic.
| Platform | Approx. monthly cost | Pricing model |
|---|---|---|
| Fly.io | £2 to £6 | Pure usage based, billed per VM-second plus separate metered egress, storage and IPv4 charges. Cheapest at idle, but the bill is genuinely harder to predict because every component is billed separately. |
| Railway | £4 to £12 | Usage based, billed by the second, with a monthly minimum spend. Cheapest option for a single low-traffic service with a database attached. |
| Render | £0 (free, sleeps after 15 min idle) or £6 to £20 (Starter, always on) | Flat fee per service. Highly predictable, but each additional service, worker or database is billed separately and the total adds up quickly on multi-service apps. |
| Google Cloud Run | £0 to £10 | Request-based billing with a generous free tier and true scale to zero. Can be the cheapest option by far for genuinely intermittent traffic, but cold starts are a real trade-off for latency-sensitive workloads. |
| AWS ECS Express Mode | £8 to £20 | Fargate compute pricing plus a shared application load balancer across up to 25 services, which keeps the ALB overhead from dominating the bill for small workloads. No scale to zero. |
| AWS ECS Fargate (standard) | £15 to £40+ | Same compute pricing as Express Mode, but you're paying for your own dedicated ALB, NAT gateway and supporting infrastructure rather than sharing it. The control comes at a fixed overhead cost regardless of how small the workload is. |
Rule of thumb: flat-rate platforms (Render, standard Fargate) carry fixed overhead a single small service pays in full. Usage-based platforms (Fly.io, Railway, Cloud Run) scale that overhead down with you, which is why they tend to win on cost at small scale.
Reading the trade-off correctly
Fast and cheap now is a cost paid later. Platforms that get you live in five minutes make infrastructure decisions on your behalf, region, scaling, secrets, which is the right trade until you need something the platform doesn't expose. Standard ECS Fargate exists for teams that genuinely need custom task definitions, blue-green deployments, and fine-grained IAM, and are willing to pay in setup time for that control. The mistake is reaching for it before you need it.
What the PaaS comparison leaves out: the hyperscaler bundle
This compares container hosting in isolation. That's wrong once your stack includes a database, storage, a queue, a CDN, and identity, because at that point AWS, Azure and Google Cloud compete on the whole system, not the container.
- One bill, one discount lever. AWS Organizations, Azure Management Groups and GCP Billing Accounts roll multiple projects into one bill, hitting volume tiers faster than any single workload would alone.
- Commitment discounts apply account-wide. AWS EDP, Azure MACC, and GCP CUD are a percentage off total qualifying spend, not one service, something a stack split across separate PaaS vendors has no equivalent to.
- No cross-vendor egress. Traffic between separately-hosted services typically crosses the public internet and gets billed. Intra-account traffic on all three hyperscalers is typically free.
- Single identity model. IAM, Entra ID, or Cloud IAM covers container, database, storage and CI/CD with one permission model and one audit log, instead of one per vendor.
- Simpler compliance scope. Fewer vendors means fewer data processing agreements and sub-processors to disclose for SOC 2, ISO 27001, or HIPAA audits.
- Native AI integration. Azure for OpenAI-on-Microsoft-365, GCP for BigQuery and Vertex AI, AWS Bedrock inside the same VPC. None of the PaaS platforms above offer an equivalent in-network AI story.
- One support relationship. One SLA, one escalation path, instead of a different status page for every vendor in an outage.
This doesn't change the cost or setup-time numbers above for a single small container. It changes shape as the system around that container grows: PaaS wins when the container is most of what you run, the hyperscaler wins once it's one piece of a stack that already includes a database, storage, and identity, because the saving shows up at the account level. Multi-cloud setups are usually about filling a specific service gap, not saving money.
A practical framework
- Prototype or side project: Railway or Render's free tier. Optimise for setup time, cost is near zero either way.
- Small production service, shipping daily: Railway. The sub-minute update time saves real hours over a year of normal shipping.
- Intermittent or spiky traffic: Google Cloud Run. True scale to zero plus fast, instant-rollback revision deploys.
- Latency-sensitive, global users: Fly.io, the only platform here built around regional placement by design.
- Already deep in AWS: ECS Express Mode if you can live with a slower, health-check-gated update cycle. Standard Fargate only once you need its control.
- Running a full stack, not just a container: stay on one hyperscaler. The consolidated bill and zero-egress internal traffic usually beat per-service savings from a best-of-breed PaaS mix.
A note from building InAgentic
We run InAgentic's pipeline on AWS App Runner today, which is why this isn't theoretical for us. Update time matters more than setup time since the pipeline ships several times a week. We're weighing ECS Express Mode's slower rollout against Cloud Run's faster revisions for the parts that ship most often, while keeping always-on services where the setup cost is already paid. The bundling argument favours AWS specifically: our MCP servers, storage, and queueing already share the same account, so a PaaS migration would mean egress that's currently free and losing the single IAM boundary we have. Staying inside one cloud's boundary for services that talk to each other constantly is usually worth more than the per-service saving from spreading them across vendors.
The bottom line
There's no universally correct platform, only the right one for your stage and traffic pattern. The spread is wide enough, in time and in pounds, that it's worth re-running this comparison whenever your traffic changes, your AWS dependency changes, or the platform you're standing on changes its roadmap out from under you.
When building with AI at pace, number of deployment per day will be much higher than in traditional development cycles.
Most writing about new technology treats it as a break from history. Today's piece does the opposite.
https://inagentic.ai/news/meet-the-new-stack-same-as-the-old-stack/