Como redirecionar temporariamente o tráfego de um Elastic Load Balancer?

3

Estou executando um aplicativo no Elastic Beanstalk, e sempre que preciso implantar uma nova versão, preciso:

  • implanta a versão no Elastic Beanstalk, que leva um minuto ou mais
  • corrige o banco de dados com quaisquer patches SQL que acompanham a nova versão, o que leva alguns segundos extras

Durante esse período, gostaria que o ELB parasse de redirecionar o tráfego para as instâncias do EC2 e só trouxesse de volta o tráfego para eles quando for seguro fazê-lo (quando as versões de software e banco de dados corresponderem).

É possível redirecionar temporariamente o tráfego do ELB em algum outro lugar? Ou executando um redirecionamento de HTTP para um bucket do S3, por exemplo, ou lendo este intervalo em vez de uma instância do EC2?

Eu sei que poderia fazer isso com alterações no DNS, mas isso levaria um tempo extra para se propagar, e mesmo com um TTL baixo, ainda não posso garantir que os clientes obedeçam corretamente o TTL e cheguem ao servidor correto assim que Eu faço a atualização.

Então, o ideal é que o DNS sempre aponte para o ELB, e o ELB deve alternar o tráfego em tempo real para outro local apenas no momento da atualização.

    
por Benjamin 18.09.2013 / 13:41

3 respostas

3

AFAIK, não há como fazer isso dessa maneira.

No entanto, encontrei uma solução alternativa que verifica todas as caixas para mim.

Eu atualizei o front controller do meu aplicativo para ler uma variável de ambiente, APP_MAINTENANCE , e retornar uma resposta 503 Service Unavailable se essa variável for TRUE .

O patch do banco de dados é executado por meio de container_commands e é automático durante a implantação.

Agora, o procedimento de implantação é o seguinte, usando a API do Elastic Beanstalk :

  • Use UpdateEnvironment para definir APP_MAINTENANCE para TRUE
  • Aguarde até que o ambiente esteja pronto (usando DescribeEnvironments )
  • Use UpdateEnvironment para implantar a nova versão do aplicativo
  • Aguarde até que o ambiente esteja pronto
  • Use UpdateEnvironment para definir APP_MAINTENANCE para FALSE .

Dessa forma, posso ter certeza de que nada está usando o banco de dados durante a atualização do banco de dados. Durante esse período (em torno de 3 minutos), o aplicativo não está disponível e qualquer solicitação é retornada com uma resposta 503 , o que é aceitável no meu caso de uso.

Qualquer cliente que receba essa resposta é convidado a tentar novamente em alguns minutos, seja uma pessoa real (uma mensagem amigável convidará a fazer isso) ou um consumidor de API (HTTP sugere que isso é uma falha temporária e que o cliente deve tentar mais tarde).

    
por 26.09.2013 / 10:55
3

Você pode usar URLs de ambiente de troca, descritos aqui:

link

Carregue uma nova versão para o segundo beanstalk e troque urls ou implante um site de manutenção para o segundo beanstalk e troque para ele - todo o tráfego é redirecionado para um novo ambiente.

    
por 05.01.2014 / 12:45
0

Você também pode definir o grupo de segurança no balanceador de carga para bloquear o acesso público temporariamente. Não é elegante, mas funciona.

    
por 20.07.2016 / 16:26