Azure's modern compute choice — the successor to 'web role vs worker role vs VM'.
App Service is managed PaaS for web apps and APIs — deploy code, Microsoft runs the OS. Container Apps is serverless, Kubernetes-based PaaS for containerised microservices and event-driven jobs, with scale-to-zero. Virtual Machines is IaaS — full OS control, and the work that comes with it. The deciding factor is control against management: App Service for a code-first web app, Container Apps for containerised or event-driven microservices needing scale-to-zero, and VMs only when you genuinely need OS-level control or software no PaaS supports.
| Criterion | App Service | Container Apps | Virtual Machines |
|---|---|---|---|
| Hosting model | Managed PaaS | Serverless PaaS, built on Kubernetes | IaaS — you provision and manage VMs |
| Deploy unit | Code (.NET, Java, Node, Python, PHP) or a container | A container image | A VM / OS image |
| Scale to zero | No — plan instances always run | Yes — most apps scale to zero | No |
| Autoscaling | Built-in autoscale rules | KEDA — HTTP traffic, events, CPU/memory | Virtual Machine Scale Sets |
| Pricing model | Per App Service plan instance | Serverless consumption — vCPU / GiB-seconds | Hourly per VM size + OS |
| Control & OS access | Platform manages the OS — no general access | Abstracted Kubernetes — no OS or K8s API | Full — patch and install anything |
| Best workloads | Web apps, REST APIs, mobile back ends | Microservices, event-driven and background jobs | Anything — lift-and-shift, HPC, SAP / Oracle |
| Ops burden | Low | Low | High |