Um único ELB direciona o tráfego para exatamente um conjunto de instâncias e distribui o tráfego de entrada para todas as instâncias "por trás" dele. Ele não roteia seletivamente o tráfego com base em qualquer análise da camada 7 do tráfego, como o cabeçalho Host:
.
Você precisa de um ELB para cada conjunto de instâncias. Como você descreve, esse é um ELB para cada webapp.
Se o seu objetivo principal para executar o ELB for descarregar o SSL usando um certificado curinga (eu tenho um sistema projetado como este, com dezenas de aplicativos vivendo em many-diferentes-domínios.my-wildcard-cert-domain.com), então as instâncias "por trás" do ELB poderiam estar executando um proxy reverso como o HAProxy (ou várias outras alternativas, como o Varnish) que podem tomar decisões de roteamento da camada 7 e encaminhar o tráfego para o subconjunto apropriado de máquinas por trás deles, que também permite balanceamento de carga mais sofisticado e tem a vantagem de fornecer estatísticas e contadores de tráfego, agregados e separados.
/-- HAProxy \ /----- instances hosting app #1
ELB ---| >> ----- instances hosting app #2
\-- HAProxy / \----- instances hosting app #n
As instâncias intermediárias ^^^^ podem avaliar os Host:
cabeçalhos (entre outras coisas) e até mesmo capturar o valor do cookie de sessão em seus registros para análise.
Essa configuração também permite que eu execute vários aplicativos em subconjuntos de instâncias sobrepostas, quando apropriado, e faça muitas outras coisas que o ELB por si só não suporta diretamente. Ele também retorna uma página "503" personalizada no caso em que um aplicativo fica sobrecarregado ou se torna indisponível, o que o ELB não faz sozinho. Eu mostrei 2 servidores proxy aqui, sem nenhum motivo específico além da sua menção ao número 2 da questão. Minha configuração, na verdade, tem 3, um para cada zona de disponibilidade na região em que isso é implantado.