Mmo's are kind of just the perfect storm of hard software problems. Generally the ones you have to deal with in an mmo fall into the following areas.
- Concurrency. Understanding how basic threading and mutexes work gets you maybe 5% of the way to where you need to be in order to do concurrency well. Go read up on fork/join and the lmax disruptor for starters. Read up on lock free algorithms. That's the kind of stuff you need to know something about to do this well.
- Persistence. Games are typically 50/50 read write when it comes to the database. Most software is read heavy, most databases are optimized for read heavy apps. You need to know stuff like implementing write behind caches and various other caching mechanism's to handle this problem and do it with consistent low latency.
- Networking. This is the thing most people associate with game servers, and it's also by far the simplest problem to solve, as it's mostly already solved. Not really worth going into.
- Scalability. Games are stateful. Global state synchronization doesn't scale. Problem! It's kind of why you don't use transactions for everything in your database and only use them when needed, because the cost for synchronizing state at scale is huge. There are known solutions to this, it's a solved problem but more difficult to find information on. Also ties directly into concurrency.
As far as cloud services it just depends on the type of game, and the type of cloud. Realtime multiplayer games eat up a ton of bandwidth,more then you would think. Most cloud services are priced for web stuff and that pricing just doesn't work for realtime multiplayer stuff. You need to get down around $0.02 per GB before it starts to make sense.
Most cloud providers also overprovision. If you run your own vm's then virtualization can work great, but you won't get consistent performance out of most cloud virtualization.
Overall the cloud is overrated, especially if you have your own dev ops team. When you do the math on buying the hardware yourself and either colocating or even just outsourcing the management of your hardware, the cloud starts to look really expensive. Contrary to what Amazon and others want you to think, they have huge margins on this stuff. They count on the fact that cloud hosting is just taken for granted and people not actually doing the math.
The sweet spot I found that we used on almost a dozen games, was to use a company like softlayer that could provision real hardware to our specs and manage the network/hardware level admin. And our small dev ops team managed provisioning and stuff like that. It was cost effective and we kept good performance.
FYI the current trend is for more companies to use hybrids and more real hardware. People are tired of cloud providers overprovisioning, and starting to actually do the math and see how consistently they are just flat getting ripped off. There is a reason why cloud providers don't tell you how many vm's they run per core.