Projete suas aplicações para lidar com a terminação de instâncias sem problemas - Amazon EC2 Auto Scaling

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Projete suas aplicações para lidar com a terminação de instâncias sem problemas

Este tópico descreve os recursos que você pode usar para impedir que seu grupo do Amazon EC2 Auto Scaling encerre instâncias do Amazon EC2 que ainda não estão prontas para serem encerradas. Por padrão, o Auto Scaling não tem visibilidade dos aplicativos em execução nas suas instâncias. Ele pode encerrar instâncias antes que seu aplicativo possa ser encerrado ou concluído normalmente as tarefas atribuídas. Esses recursos dão ao seu aplicativo tempo para concluir o trabalho em andamento, transferir o estado ou realizar a limpeza antes do encerramento da instância. Você pode usá-los individualmente ou em combinação, dependendo dos requisitos do seu aplicativo.

Esses recursos são particularmente úteis para cargas de trabalho com estado, em que cada instância em sua frota contém dados, trabalhos ou estados diferentes de outras instâncias. O encerramento de instâncias com estado sem um desligamento normal pode resultar na reinicialização de trabalhos de longa duração desde o início, na redução da redundância ou perda de dados e na interrupção de transações ou cálculos em andamento. Para encerrar normalmente uma instância com estado, sua carga de trabalho deve ser drenada (concluindo todas as tarefas atualmente atribuídas) ou transferida (movendo tarefas, dados ou configuração para outra instância ativa).

Ganchos do ciclo de vida de encerramento

Um gancho do ciclo de vida de encerramento prolonga a vida útil da sua instância do Amazon EC2 que já está selecionada para encerramento. Ele fornece tempo extra para concluir o trabalho em andamento atualmente atribuído à instância ou para salvar o progresso e transferir o trabalho para outra instância.

Para muitas cargas de trabalho, um gancho do ciclo de vida de encerramento pode ser suficiente para encerrar normalmente um aplicativo em uma instância selecionada para encerramento. Essa é a melhor abordagem e não pode ser usada para evitar a rescisão se uma ação do ciclo de vida da rescisão for abandonada. Se sua carga de trabalho tiver uma baixa tolerância a falhas na ação do ciclo de vida de encerramento, configure as políticas de ciclo de vida da instância em combinação com seus ganchos do ciclo de vida de encerramento para reter instâncias.

Para usar um gancho de ciclo de vida de encerramento, você precisa saber quando uma instância é selecionada para encerramento. Você tem duas maneiras de saber isso:

Opção Description Melhor usado para Link para a documentação
No interior da instância O serviço de metadados de instância (IMDS) é um endpoint seguro que você pode pesquisar o status de uma instância diretamente da instância. Se os metadados voltarem com,Terminated sua instância está programada para ser encerrada. Aplicações em que é necessário realizar uma ação na instância antes que ela seja encerrada. Recupere o estado do ciclo de vida de destino
Fora da instância Quando uma instância é encerrada, uma notificação de evento é gerada. Você pode criar regras usando Amazon EventBridge, Amazon SQS, Amazon SNS AWS Lambda ou capturar esses eventos e invocar uma resposta, como com uma função Lambda. Aplicações que precisam agir fora da instância. Configurar um alvo de notificação

Para usar um gancho do ciclo de vida, você também precisa saber quando sua instância está pronta para ser totalmente encerrada. O Amazon EC2 Auto Scaling não encerrará a instância até que ela receba CompleteLifecycleActionuma chamada de API ou que o tempo limite termine, o que ocorrer primeiro.

Por padrão, uma instância pode continuar em execução por uma hora (tempo limite de pulsação) devido a um gancho do ciclo de vida de encerramento. Você pode configurar o tempo limite padrão se uma hora não for suficiente para concluir a ação do ciclo de vida. Quando uma ação do ciclo de vida está em andamento, você pode estender o tempo limite com RecordLifecycleActionHeartbeatchamadas de API.

Para obter mais informações, consulte Ganchos do ciclo de vida do Amazon EC2 Auto Scaling.

Proteção de redução horizontal de escala de instâncias

Você pode usar a proteção de escalabilidade de instâncias para controlar quais instâncias são selecionadas para encerramento durante eventos de expansão, especialmente para evitar que uma instância que esteja processando ativamente um trabalho de longa duração seja encerrada. Por exemplo, ao executar cargas de trabalho em contêineres, é comum querer proteger todas as instâncias e remover a proteção somente para instâncias sem tarefas atuais ou agendadas. As instâncias podem continuar pesquisando novos trabalhos e reativar a proteção quando houver novos trabalhos atribuídos.

Você pode ativar a proteção escalável no nível do grupo e da instância do Auto Scaling. Quando você ativa a proteção escalável no nível do grupo Auto Scaling, somente novas instâncias são protegidas quando são criadas. Para instâncias existentes, você pode ativar a proteção individualmente.

Os aplicativos podem definir a proteção a partir das próprias instâncias ou de um plano de controle centralizado que gerencia se cada instância pode ser encerrada. Recomendamos a abordagem centralizada para grandes frotas ou quando a proteção precisa ser alternada com frequência, pois ela permite que você faça chamadas em lote SetInstanceProtectione evite problemas de limitação de API.

Para obter mais informações, consulte Use a proteção de redução da escala horizontalmente da instância para controlar a terminação da instância.

Política de encerramento personalizada

Assim como a proteção escalável de instâncias, uma política de rescisão personalizada ajuda a evitar que seu grupo do Amazon EC2 Auto Scaling encerre instâncias específicas do EC2. Instâncias não íntegras ainda podem ser encerradas, independentemente da sua política de encerramento personalizada.

Seu grupo de Auto Scaling usa uma política de encerramento padrão para determinar quais instâncias do Amazon EC2 ele encerra primeiro. Se você quiser ter mais controle sobre quais instâncias serão encerradas primeiro, você pode implementar uma política de encerramento personalizada usando uma função Lambda. O Auto Scaling chama essa função sempre que precisar selecionar uma instância para encerramento e encerrará somente as instâncias retornadas pela função. Se a função errar, atingir o tempo limite ou retornar uma lista vazia, o Auto Scaling não encerrará nenhuma instância, a menos que a instância não esteja íntegra.

Uma política de encerramento personalizada é útil quando seu aplicativo pode identificar quais instâncias estão ociosas ou seguras de encerrar. Isso normalmente requer um plano de controle que rastreie a carga de trabalho em todo o grupo.

Para obter mais informações, consulte Criar uma política de término personalizada com o Lambda.

Política de ciclo de vida da instância

As políticas de ciclo de vida da instância oferecem proteção contra rescisões do Amazon EC2 Auto Scaling quando uma ação do ciclo de vida de rescisão é abandonada. Diferentemente dos ganchos de ciclo de vida isolados, as políticas de ciclo de vida das instâncias são projetadas para garantir que as instâncias sejam transferidas para um estado retido quando procedimentos de desligamento regulares não forem concluídos com êxito.

Quando o Auto Scaling seleciona uma instância para encerramento, seus ganchos de ciclo de vida de terminação configurados são invocados e seu aplicativo inicia procedimentos de desligamento adequados. Se as ações do ciclo de vida de encerramento forem concluídas com êxitoCONTINUE, a instância será encerrada normalmente. No entanto, se uma ação de encerramento do ciclo de vida for abandonada por qualquer motivo, a política de ciclo de vida da instância moverá a instância para um estado retido em vez de encerrá-la. As instâncias retidas não contam para a capacidade desejada pelo seu grupo de Auto Scaling, então as instâncias substitutas são iniciadas automaticamente. Você incorrerá em cobranças padrão do Amazon EC2 tanto pela instância retida quanto por sua substituição até encerrar manualmente a instância retida usando a API. TerminateInstanceInAutoScalingGroup

Para usar esse recurso, você deve configurar uma política de ciclo de vida da instância com o gatilho de TerminateHookAbandon retenção definido comoretain, bem como pelo menos um gancho de ciclo de vida de encerramento. Como as instâncias retidas incorrem em custos contínuos do Amazon EC2 e exigem ação manual, o monitoramento é fundamental. Você deve ativar CloudWatch métricas como GroupTerminatingRetainedInstances e criar CloudWatch alarmes para alertá-lo quando as instâncias entrarem em estados retidos.

Para obter mais informações, consulte Controle a retenção de instâncias com políticas de ciclo de vida de instâncias.

Suspender completamente as rescisões

Se você precisar de controle total sobre todas as terminações de instâncias do EC2 dentro do seu grupo do Amazon EC2 Auto Scaling, suspenda o processo. Terminate Só recomendamos usar essa opção se as opções acima não oferecerem o controle necessário para seu serviço. Ao ligar SuspendProcessespara suspender o Terminate processo, você evita que o Auto Scaling tente encerramentos por qualquer motivo, exceto aqueles iniciados por uma solicitação do usuário à API. TerminateInstanceInAutoScalingGroup

Para obter mais informações, consulte Suspender e retomar os processos do Amazon EC2 Auto Scaling.

Limitações

Importante

Ao projetar seu aplicativo no Amazon EC2 Auto Scaling para lidar com terminações de instâncias sem problemas, tenha em mente as seguintes limitações.

Instâncias insalubres ignoram algumas proteções

Se uma instância não estiver íntegra, o Amazon EC2 Auto Scaling começará a encerrá-la mesmo que você tenha políticas de encerramento personalizadas ou proteção de escalabilidade em vigor. A única maneira de evitar a substituição de instâncias não íntegras pelo Auto Scaling é suspender HealthCheck o processoReplaceUnhealthy,, ou. Terminate Você pode usar ganchos de ciclo de vida e uma política de ciclo de vida da instância para permitir que o aplicativo seja desligado normalmente ou copie quaisquer dados que você precise recuperar antes que a instância não íntegra seja encerrada.

Recurso Controla instâncias íntegras Controla instâncias não íntegras
Políticas de rescisão personalizadas Sim Não
Proteção contra redução Sim Não
Suspender HealthCheck ReplaceUnhealthy ou processar Terminate Yes (Sim) Yes (Sim)
Hooks do ciclo de vida Yes (Sim) Yes (Sim)
Política de ciclo de vida da instância Yes (Sim) Yes (Sim)

Os ganchos de ciclo de vida por si só não garantem um desligamento normal

Por padrão, os ganchos do ciclo de vida da terminação operam com base no melhor esforço. Se uma ação do ciclo de vida de encerramento for abandonada, o Amazon EC2 Auto Scaling prosseguirá com o encerramento imediato da instância. Você pode combinar ganchos do ciclo de vida de encerramento com uma política de ciclo de vida de instâncias para reter instâncias quando as ações do ciclo de vida de encerramento forem abandonadas. Com essa combinação:

  • Seus ganchos do ciclo de vida de encerramento tentam desligar seu aplicativo normalmente após o Auto Scaling acionar o encerramento da instância e a drenagem de qualquer load balancer configurado do Elastic Load Balancing ser concluída.

  • Se uma ação do ciclo de vida de encerramento for abandonada por qualquer motivo, a instância passa para um estado retido em vez de ser encerrada.

  • A instância retida permanece em seu estado atual do Amazon EC2, permitindo que você conclua manualmente seus procedimentos de desligamento ou investigue a falha.

  • Você pode encerrar manualmente as instâncias retidas chamando a TerminateInstanceInAutoScalingGroupAPI depois de concluir as ações necessárias.

Para obter mais informações, consulte Controle a retenção de instâncias com políticas de ciclo de vida de instâncias.

Algumas opções de mercado podem ser interrompidas com aviso limitado.

Se você usa opções de mercado de instâncias, como instâncias spot e reservas de capacidade interruptível em seu grupo de Auto Scaling, o Amazon EC2 pode interromper e recuperar suas instâncias a qualquer momento. Essas interrupções ignoram todos os mecanismos de proteção do Amazon EC2 Auto Scaling, incluindo:

  • Ganchos do ciclo de vida de encerramento

  • Proteção de redução horizontal de escala de instâncias

  • Políticas de rescisão personalizadas

  • Políticas de ciclo de vida da instância

  • Processos suspensos

Quando uma Instância Spot recebe um aviso de interrupção, você tem aproximadamente dois minutos para realizar tarefas de desligamento sem problemas. Embora você possa usar ganchos do ciclo de vida de encerramento para responder às interrupções da Instância Spot, a instância será encerrada à força no final da janela de dois minutos, mesmo que o gancho do ciclo de vida ainda esteja em andamento. As políticas de ciclo de vida da instância também não podem evitar interrupções na Instância Spot.

Para obter mais informações sobre como lidar com interrupções de instâncias spot, consulte Interrupções de instâncias spot e melhores práticas para Amazon EC2 Spot no Guia do usuário do Amazon EC2.

As terminações diretas do Amazon EC2 ignoram todas as proteções

Se você encerrar uma instância em seu grupo de Auto Scaling diretamente com a API do Amazon TerminateInstancesEC2, o encerramento ignorará todos os mecanismos de proteção do Amazon EC2 Auto Scaling.

Para encerrar instâncias em seu grupo de Auto Scaling respeitando suas proteções configuradas, use a API em vez disso. TerminateInstanceInAutoScalingGroup

Cenários de exemplo

Ao usar o Amazon EC2 Auto Scaling, você pode escolher quanto gerenciamento de frota o Auto Scaling gerencia em seu nome versus quanto controle direto você mantém sobre as decisões de encerramento de instâncias do EC2. Quanto mais sensível for sua carga de trabalho às terminações de instâncias, mais controle você poderá querer manter. Os exemplos a seguir descrevem cargas de trabalho com diferentes níveis de tolerância e as configurações recomendadas:

Exemplo 1: nós de banco de dados distribuídos (baixa tolerância)

Você executa um banco de dados distribuído em que cada instância do EC2 contém uma partição dos seus dados com um fator de replicação de 3. A perda de várias instâncias que contêm réplicas da mesma partição pode causar perda de dados ou tornar essa partição indisponível.

Desafio: o Auto Scaling pode encerrar instâncias mais rápido do que os dados podem ser replicados novamente em outros nós, e as terminações podem reduzir sua capacidade abaixo do necessário para manter seu fator de replicação.

Considere as seguintes configurações:

Exemplo 2: Processamento de trabalhos de longa duração (tolerância média)

Você tem uma fila do Amazon SQS que coleta mensagens recebidas para trabalhos de longa execução. Quando uma nova mensagem chega, uma instância do EC2 recupera a mensagem e inicia um trabalho que leva 3 horas para ser processado. Conforme a fila cresce, o Auto Scaling adiciona instâncias com base em suas políticas de escalabilidade. À medida que a fila diminui, o Auto Scaling encerra as instâncias.

Desafio: o Auto Scaling pode encerrar uma instância após 3 horas de processamento de uma tarefa, em vez de uma instância ociosa. O trabalho pode ser reiniciado em outra instância, mas você perde um progresso significativo.

Considere as seguintes configurações:

Exemplo 3: Frota de trabalhadores para ambientes de teste (alta tolerância)

Você executa uma frota de instâncias do EC2 que executam testes automatizados, trabalhos de CI/CD pipeline ou cargas de trabalho de desenvolvimento. Essas instâncias de trabalho extraem tarefas de uma fila e os resultados dos testes podem ser regenerados se um trabalho falhar.

Desafio: os trabalhos de teste podem ser interrompidos durante eventos de expansão, mas como os testes podem ser repetidos sem impacto, você deseja otimizar o custo e a simplicidade, em vez da disponibilidade sem interrupção.

Considere as seguintes configurações: