Comparing Azure Container Apps, Encore, ECS Express Mode, Fly.io, Render, Railway and Knative for teams moving off or comparing against Google Cloud Run.
Cloud Run runs a container behind HTTPS, scales it to zero and charges for the time requests are served. It is a good default on Google Cloud, and teams look elsewhere when the company is on AWS or Azure, or when the app needs more than a container.
Beyond the container, a Cloud SQL database, Pub/Sub topics, Cloud Scheduler jobs, secrets and service accounts all sit next to it and are configured separately. This guide compares alternatives on both counts.
What you need to decide:
Azure Container Apps runs containers with HTTP or event-driven scaling, including scale to zero, on a managed environment built on Kubernetes, KEDA and Dapr.
Databases and Service Bus are separate Azure resources you wire up with Bicep, Terraform or the portal.
Encore is an open source infrastructure SDK for TypeScript, Python, Go and Rust. The databases, Pub/Sub topics, buckets and cron jobs a service declares in code are created in your own AWS or GCP account on deploy. On GCP it can deploy to Cloud Run, and the same code can deploy to AWS by adding an environment there.
A service declares what it uses next to the code that uses it:
import { api } from "encore.dev/api";
import { Topic } from "encore.dev/pubsub";
import { Bucket } from "encore.dev/storage/objects";
interface OrderPlaced {
orderId: string;
}
// Pub/Sub on GCP, SNS and SQS on AWS.
export const orders = new Topic<OrderPlaced>("orders", { deliveryGuarantee: "at-least-once" });
// Cloud Storage on GCP, S3 on AWS.
const receipts = new Bucket("receipts", { versioned: false });
export const place = api(
{ expose: true, method: "POST", path: "/orders" },
async ({ orderId }: OrderPlaced): Promise<OrderPlaced> => {
await receipts.upload(`${orderId}.txt`, Buffer.from(`order ${orderId}`));
await orders.publish({ orderId });
return { orderId };
},
);
encore run starts the service with a local bucket and Pub/Sub, and it also starts Postgres locally when a service declares a database. On deploy, Encore provisions the compute, topics and buckets on GCP or AWS, and provisions an IAM role for the service.
For coding agents, the infrastructure a change needs is part of the same diff as the code.
Encore apps are written with its SDKs, and an existing container is ported service by service rather than deployed as is. The migration guide covers moving from existing infrastructure.
ECS Express Mode is AWS's simplified path for a container on Fargate with a load balancer, HTTPS and scaling, and it is where AWS points users of App Runner and Copilot for new apps.
Express Mode keeps a minimum of one task running by default, and RDS, SQS and EventBridge schedules are set up separately with their IAM permissions.
Fly.io runs containers as Firecracker machines in many regions, with machines that can stop when idle and start on request.
Apps run on Fly's infrastructure rather than your own cloud account.
Render deploys web services, workers and cron jobs from a repository, with managed Postgres and Redis-compatible key value stores.
Free instances spin down when idle, and paid instances stay running.
Railway deploys services and databases from a repository or template onto a project canvas, with usage-based pricing.
Everything runs on Railway's infrastructure, which suits prototypes more than workloads that must stay in a company cloud account.
Knative Serving is the open source API Cloud Run implements, so the same container and a similar service definition run on any Kubernetes cluster with it installed.
You operate the Kubernetes cluster and Knative itself, which fits teams already running Kubernetes.
Compare against Cloud Run pricing with your own traffic, since request-based and instance-based billing differ most for steady workloads.
You can deploy your first Encore app to see the workflow before moving any services.
It depends on why you are moving. Azure Container Apps is the closest equivalent on Azure and ECS Express Mode is the closest on AWS. Encore defines the backend and its databases, queues and cron jobs in code and deploys them to your own AWS or GCP account. Fly.io, Render and Railway are managed platforms outside the big clouds.
AWS points new container apps to ECS Express Mode, which runs a container on Fargate with a load balancer and scaling. App Runner covered the same ground earlier. Encore can also deploy the same code to AWS, provisioning ECS and the databases and queues it uses in your account.
Yes. Cloud Run implements the Knative Serving API, so the same container and a similar service definition run on any Kubernetes cluster with Knative installed, at the cost of operating the cluster.
Common reasons are wanting to be on AWS or Azure, needing more than a container with a database, queues and scheduled jobs wired up, cold starts on scale to zero, and pricing for always-on workloads.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.