Azure App Service doesn’t get much love.

It’s not shiny. It’s not trendy. It doesn’t give you the satisfaction of saying “we’re fully containerized.”

And yet, it’s where some of our most reliable production workloads live.

After running App Services, Functions, and Container Apps side by side, I’ve reached a conclusion that feels almost unpopular in 2025:

Boring infrastructure is often the best infrastructure.

The Problem With Exciting Compute

When teams evaluate Azure compute options, the conversation usually starts with features:

  • “Functions scale automatically”
  • “Containers give us portability”
  • “AKS is what serious teams use”

Those statements aren’t wrong, but they’re incomplete.

What they don’t account for is operational gravity:

  • Who owns the runtime?
  • Who debugs the platform when it misbehaves?
  • Who carries the pager when “simple” turns into “opaque”?

Exciting platforms tend to hide complexity until you’re already committed. You don’t see the operational burden until you’re running workloads in production, dealing with incidents at 2am, and explaining to your team why the “simple” platform feels anything but simple.

Azure App Service is different. It shows you exactly what it is.

What App Service Gets Right

App Service is unapologetically straightforward:

  • You deploy code
  • It runs behind a load balancer
  • Scaling is explicit
  • Logs are boring but readable
  • Failures are usually understandable

That last point matters more than people admit.

When something breaks in App Service, the blast radius is usually small and the failure modes are familiar:

  • bad config
  • bad deploy
  • bad dependency

There’s very little magic, and that’s a feature. The platform engineering team doesn’t need to become experts in Kubernetes networking or serverless cold start optimization. They just need to understand web apps, which most teams already do.

App Service handles the basics well:

  • SSL certificates through managed certificates
  • Auto-scaling based on metrics you actually care about
  • Deployment slots for zero-downtime releases
  • Built-in monitoring and diagnostics

Nothing fancy. Nothing that requires a PhD to troubleshoot.

“But Containers Are the Future”

Maybe. For some workloads.

We ran Azure Container Apps alongside App Service for months. What we found in practice was this:

Containers made sense when:

  • we needed background jobs with predictable execution
  • runtime customization mattered
  • we wanted isolation between workloads

But for long-running APIs and boring web services, containers introduced:

  • more networking decisions
  • more identity surface area
  • more “where does this live?” questions

App Service already solved those problems, just without hype.

The trade-off isn’t always worth it. Container Apps are great for event-driven workloads and microservices. But for a straightforward REST API that serves traffic 24/7? App Service does the job with less overhead.

The Hidden Cost of “Modernizing” Too Early

One of the most expensive mistakes teams make in Azure is premature modernization.

Not because containers or Functions are bad, but because:

  • they require stronger platform maturity
  • they assume better observability
  • they shift responsibility from Azure to you

If you don’t already have:

  • clear ownership
  • standardized pipelines
  • predictable environments

Then “modern” compute tends to amplify chaos, not reduce it.

App Service absorbs a lot of that chaos quietly.

App Service as a Platform Primitive

Once we stopped treating App Service as “legacy Azure” and started treating it as a platform primitive, things clicked.

It became:

  • the default for APIs
  • the stable baseline for new services
  • the place where predictability mattered more than flexibility

More importantly, it gave engineers confidence.

They didn’t need to relearn deployment models. They didn’t need to understand container networking. They could focus on application behavior instead of platform mechanics.

That’s a win.

The Real Question Isn’t “Is It Modern?”

The real question is:

Does this reduce cognitive load for the team running it?

For us, App Service often did.

Not always. Not everywhere.

But far more often than we expected.

When App Service Is the Right Choice

In hindsight, App Service shines when:

  • the workload is request/response (APIs, web apps, backends)
  • scaling needs are predictable
  • reliability matters more than flexibility
  • the team wants fewer platform decisions
  • you need to ship quickly without platform overhead

We’ve run production workloads on App Service for years. Some of them handle thousands of requests per second. They just work.

Compare that to the teams we’ve seen struggle with Kubernetes for months, only to realize they’re running a handful of stateless APIs that could have lived on App Service from day one. The complexity wasn’t buying them anything except operational burden.

It’s not exciting. It’s not impressive.

It just works and keeps working.

Real-World Example

One of our busiest services is a REST API that handles authentication and authorization. It runs on an App Service plan with auto-scaling enabled.

The entire platform engineering overhead:

  • Update the Docker container when we ship new features
  • Monitor the built-in metrics
  • Occasionally adjust scaling rules

That’s it. No Kubernetes upgrades. No service mesh debugging. No custom ingress controllers.

The service has a 99.95% uptime over the past year. Not because we’re brilliant. Because App Service is boring in all the right ways.

Final Thought

Infrastructure doesn’t need to be interesting to be effective.

The more boring it is, the more space your team has to solve real problems.

App Service isn’t the future of everything. But it’s a damn good present.

And sometimes, that’s exactly what you want.


Running Azure workloads and deciding between compute options? The answer isn’t always the newest, shiniest platform. Sometimes it’s the one that lets you sleep at night.