Há toda uma série de artigos sobre esse tópico no link
Eu não usei a AWS, mas tenho experiência com a execução de instâncias virtuais em um datacenter, usando instâncias virtuais rackspace e appengine.
Como você escala (up x out) é grandemente determinado pelo que você está tentando fazer. Alguns aplicativos serão intensivos em E / S, alguns serão intensivos em CPU. Seu gargalo pode ser i / o de entrada, poder de processamento ou i / o de back-end ou uma combinação dos três em quantidades variáveis dependendo de onde você está no ciclo de vida do seu aplicativo. Tudo exigirá uma estratégia ligeiramente diferente.
Usando algo como a AWS, em geral, você deseja expandir e é preciso começar com o objetivo em mente e manter seus aplicativos fracamente acoplados. Isso permitirá que você ative outra instância para escalar a demanda. É bom manter sua instância db na mesma instância de seu aplicativo principal quando você está começando, mas isso geralmente é a primeira coisa a ser desmembrada em seu próprio servidor.
Então, você pode começar com tudo funcionando em uma instância. Em seguida, você começa a obter algum tráfego e observe que o banco de dados está consumindo sua CPU. Então você move o banco de dados para outra instância e tudo está ótimo. Até você começar a obter mais tráfego ... e perceber que seu front-end não consegue acompanhar o tráfego. Então você ativa mais algumas instâncias, equilibra a carga delas e fica feliz por um tempo, e pode escalar até talvez uma dúzia de servidores web ... Mas então você consegue mais tráfego, e enquanto o front end está se mantendo agora sua máquina de banco de dados está começando a se espelhar. Então, você replica seu banco de dados para um mestre e alguns escravos, e tudo está bem ... e assim por diante.