But as soon as you start dealing with data sovereignty for your SaaS app, and need co-lo's in multiple geographies, each with their own contract/billing cycles, HA and backup, the global reach and consistency of the cloud providers starts seeming quite compelling again.
"Sure, we can get some on-prem machines. They'll pay for themselves in 6 months. I just need permissions from Finance to spend some CAPEX, and get IT and Facilities to cooperate"
"Ugh, actually please keep using AWS. But try and spend less.. if you can and this does not compromise deadlines"
After happily replacing the battery in a ten year old phone, six months later it was obsolete due to the 3G network switch off; the device was no longer capable of one of it's primary functions; making and receiving phone calls.
I use an approach with Github Actions where if I need small amounts of persistent data between runs, I use a filesystem based off a fresh branch in the same repository.
That branch is rebased down to $tip so it shares no commits, and the 'database' doesn't affect development in trunk.
Obviously this doesn't work for significant data analysis, but if it's just a question of 'what was the state at the last run' it's cheap and easy.
But as soon as you start dealing with data sovereignty for your SaaS app, and need co-lo's in multiple geographies, each with their own contract/billing cycles, HA and backup, the global reach and consistency of the cloud providers starts seeming quite compelling again.