Agentic hosting is here. Connect to our MCP now ->

Blog

When your AWS stack starts costing more engineering time than features

Your team didn't sign up to run AWS. Here's why the maintenance load always wins, and what it looks like to hand the operational layer off entirely.

·by Steve McDougall

There is a specific quarter in the life of a Laravel team when something shifts, and almost nobody names it out loud. You are running a production application on a stack your own team assembled. ECS or EC2 for compute, RDS for the database, S3 and CloudFront in front of your assets, a GitHub Actions pipeline you have been extending for a year. In the beginning, that stack felt like leverage. You shipped fast. Then you look up one Monday, review the last three sprints, and realize almost nothing landed that a customer would notice. The team was busy the entire time. Busy keeping the stack alive.

If you are running a production Laravel application on infrastructure your team put together, whether that is AWS, Google Cloud, Azure, or a Kubernetes cluster someone stood up two years ago, this is written for you. If you are learning cloud tooling for the first time or standing up a side project, it is not. The teams I am talking to here have a product in production, customers who pay, a roadmap with real pressure on it, and a growing suspicion that the infrastructure is quietly consuming the thing they are actually trying to build. That suspicion is usually correct.

The way out is not better infrastructure management. It is a different premise about who should own infrastructure in the first place. Sevalla starts from a simple premise: the operational layer underneath your application was never your team's job. A platform should absorb it, so your engineers can focus on shipping features instead of operating infrastructure. Hold that idea while I walk through how the stack turns on you, because the pain only makes sense once you can see the alternative it is being measured against.

The ratio nobody puts on a dashboard

Every team I meet tracks two numbers carefully and never puts them in the same sentence. The first is cloud spend. Finance watches it, someone gets a Slack alert when it jumps, and once a quarter a senior engineer spends an afternoon hunting for savings. The second is velocity, measured in whatever your team uses. Both numbers get attention. Neither one tells you what is actually happening.

The number that matters is the ratio between them: engineering hours spent keeping the stack running versus engineering hours spent building the product. Nobody puts that on a dashboard, because it is uncomfortable to measure and worse to look at. In the early days, the ratio is heavily in your favor. You spend a week on setup, then months shipping. As the application grows, the ratio drifts, slowly enough that no single week feels alarming. And then one quarter you cross a line where more of your team's attention goes to the stack than to the product, and you did not notice, because no invoice ever reported it. A platform like Sevalla exists to drive that maintenance number close to zero, so the ratio stops being something you fight and becomes something you forget about.

Every service you run is a standing claim on your team

Here is the part that gets misunderstood. When your team chose ECS, RDS, ElastiCache, SQS, CloudFront, and a pipeline to tie them together, it felt like a series of setup tasks. Provision the thing, configure it, move on. But infrastructure you own is never a task you complete. It is a subscription paid in engineering attention, and the bill arrives every month whether you touch the service or not.

AWS does not become expensive because EC2 costs more. It becomes expensive because every new capability becomes another system your engineers have to own. More IAM. More networking. More monitoring. More deployment pipelines. More operational knowledge living in one or two people's heads. Eventually your cloud architecture becomes a product of its own, one you never meant to build and nobody is assigned to maintain. The database needs version upgrades you keep deferring. The security groups need review every time you add a service. The AMI needs patching when a vulnerability lands. The scaling configuration that was correct at last year's traffic is wrong at this year's. None of it is dramatic on any given day. That is exactly why it is dangerous.

Kubernetes teams have the same problem wearing a different costume. Instead of security groups and task definitions, it is Helm charts, node pool upgrades, and reconciliation loops. Instead of one person who understands the ECS setup, it is one person who understands the cluster. The specific services change. The structure does not. Every managed piece you run is a standing claim on the people you hired to build features.

The crossover is built into the model

I want to be precise about why the ratio flips, because the usual explanation is wrong. Teams tell themselves the maintenance load grew because they made mistakes. They got sloppy, the pipeline got messy, someone should have documented the networking. If only they had been more disciplined, the stack would still be humming quietly in the background.

That is a comforting story and it is not true. The crossover is structural. Maintenance load rises as a function of scale, service count, and team turnover, and on a growing product all three of those only move in one direction. Meanwhile your feature capacity is roughly fixed. You have the engineers you have. So the share of that fixed capacity consumed by the stack climbs on its own, with no error required to explain it. This is the reason "we just need to tighten things up" never actually resolves anything. There was no slack to tighten. You cannot discipline your way out of a curve that is built into the model.

This shows up on the roadmap before it shows up anywhere else

Ask where the cost lands and most people point at operations. On-call, incidents, the occasional bad Friday. Those are real, but they are not where the damage concentrates. The damage lands on your roadmap, and it lands there quietly.

Watch what happens to a team past the crossover point. Releases slip, not because any single feature was hard, but because the engineers who would have built it spent the sprint on a database upgrade and a networking issue that only reproduced under load. The architectural work that would make next year easier keeps getting bumped, because it is important and never urgent, and infrastructure is always urgent. The backlog develops a graveyard section, the items that survive sprint after sprint because the hours they need are permanently spoken for.

And then comes the clearest signal of all, the one that should stop a founder cold. You start hiring to cover the stack rather than to build the product. The next role you open is a DevOps or platform hire, justified entirely by keeping the infrastructure running. That is the ratio made visible in your org chart. You are spending headcount, the most expensive resource you have, to service a layer that was supposed to be a means to an end. The competitive advantage of your company was never going to come from operating ECS more gracefully than the next team. It was going to come from the product. The stack is now taxing the exact capacity that builds it.

Getting better at it is not the fix

Here is where most teams take a wrong turn, and it is worth slowing down for. When the maintenance load becomes undeniable, the instinct is to reduce it. Optimize the Terraform. Consolidate the pipeline. Right-size the database. Introduce a platform tool that makes the cluster easier to manage. Every one of these is a reasonable engineering response, and every one of them leaves you exactly where you started, still owning the layer.

Reduction does not change the ratio. It resets it, briefly. You trim the maintenance load, feel the relief, and then the same structural forces push it back up, because scale and turnover and service count keep climbing. Six months later you are optimizing the optimization. You have not escaped the curve. You have paid to move a little way back down it, temporarily. The only move that actually changes the equation is removing the ownership. Not carrying the operational layer more efficiently, but handing it off entirely, so it stops being your team's responsibility at all.

The question is not how to run your infrastructure with less effort. The question is why your product team is running infrastructure in the first place.

Production teams eventually reach the same conclusion. As Jorik Kraaikamp Mulder, Lead Backend Developer at Stepler, explained after moving away from a self-managed cloud environment:

"The infrastructure worked, but maintaining it took too much time, expertise, and focus away from building new features."

That realization changes the conversation. Instead of asking how to optimize infrastructure management, engineering teams start asking how to spend less time managing infrastructure altogether.

What it looks like to not own the layer at all

Look at what a single deployment asks of you on a self-managed stack. You build a Docker image. You push it to a registry. You update the manifests. You configure ingress. You wire up secrets. You set the networking. You trigger the rollout and wait. When it fails a health check, you open three dashboards to work out why. Then you do all of it again on the next release.

Now look at the same deployment on Sevalla. You push to Git. The build runs and the application deploys on its own. The managed PostgreSQL database is already connected. TLS is already configured. The logs are there the moment you need them, the metrics are built in, and if something looks wrong, you roll back with one click. That is the entire workflow. The daily operational work that filled the first version simply is not there in the second.

Here is the whole surface your team is responsible for, a Laravel 13 application on PHP 8.5:

app:
  name: my-laravel-app
  runtime: php
  version: "8.5"
 
build:
  buildpacks: true
  run:
    - composer install --no-dev --optimize-autoloader
    - php artisan config:cache
    - php artisan route:cache
    - php artisan view:cache
 
workers:
  - name: queue
    command: php artisan queue:work --sleep=3 --tries=3
 
crons:
  - name: scheduler
    schedule: "* * * * *"
    command: php artisan schedule:run
 
environment:
  - APP_ENV=production
  - LOG_CHANNEL=stderr

Queues are defined as workers. The scheduler runs as a cron. Environment variables live in the dashboard. There is no security group to audit, no IAM policy to review, no task definition to version, no node pool to upgrade, no pipeline accumulating conditionals in a file nobody owns. The principle is simple: your team deploys from Git. Sevalla handles runtime orchestration, networking, scaling, failover, observability, and deployment workflows behind the platform boundary. This is not a smaller version of the stack. It is the removal of the stack as something your team maintains. The maintenance number in your ratio does not shrink by a notch. It drops out. And when something does go wrong, the problem is almost always in your application code, which means the person best equipped to fix it is a Laravel developer, not an infrastructure specialist you had to hire to cover the layer.

You are already paying this tax

Here is what I want you to sit with. The infrastructure tax is not a risk you might take on someday. If you are running your own stack in production, you are paying it right now. It is in the release that slipped last sprint. It is in the roadmap item that has survived four planning sessions untouched. It is in the fact that your next open role is a platform engineer and not a product one. The only thing you have not done is measure it.

So measure it. For the next two weeks, split your team's engineering hours into two columns: time spent building the product, and time spent keeping the stack alive — the upgrades, the audits, the pipeline fixes, the incidents, the tuning, and all the context switching around them. Put the totals side by side. No cloud invoice will ever show you that number, and it is the only one that tells you what your infrastructure actually costs.

If the maintenance column is winning, or even close to it, you do not have a stack to optimize. You have a layer to hand off. Teams that make this move stop measuring the cloud bill and start measuring how much faster they ship, because that is the outcome switching actually changes. Sevalla is where that layer goes, so your engineers stop operating infrastructure and get back to building the product they were hired to build. Run the two-column exercise this week. If the stack is winning, you already have your answer.

Deep dive into the cloud!

Deploy your application, database, or static site in minutes.