Most organizations use the cloud by turning up a bunch of virtual machines (VMs), and that’s the most wasteful way to consume cloud services. The cloud wasn’t built to operate that way. When the cloud was conceived, the only way to get into it was to be cloud-native. You had a cloud-specific language that would summon resources into existence, and you didn’t have to think about them. Instead of saying, “connect to database X at IP address,” you would say, “give me database,” and it would figure out everything else.
Because so many organizations complained that their custom binaries wouldn’t operate in the cloud environment, public cloud providers shoehorned the ability to run VMs into the cloud after they built it. And they priced them accordingly. They don’t want to run that way, even though that’s how the vast majority of workloads run in the cloud.
It’s okay to run that way for a year, but if you find yourself running that way for more than a year, you are not ready to go to the cloud. When you adopt cloud resources, you need to be prepared to redesign the application to be cloud native. An application that requires 16 or more VM instances and costs tens of thousands of dollars a month could be re-implemented as a set of Lambda functions, consume more cloud-native services, or live in Docker containers. This allows you to achieve the same objectives on a greater scale for far less cost.