Como proteger as tarefas do Amazon ECS de serem encerradas por eventos de redução horizontal da escala - Amazon Elastic Container Service

Como proteger as tarefas do Amazon ECS de serem encerradas por eventos de redução horizontal da escala

Você pode usar a proteção de tarefa na redução de escala do Amazon ECS para impedir que as tarefas sejam encerras por eventos de redução de escala horizontal do ajuste de escala automático ou implantações do serviço.

Certas aplicações exigem um mecanismo para impedir que tarefas de missão crítica sejam encerradas por meio de eventos de redução da escala horizontalmente durante períodos de baixa utilização ou durante implantações de serviços. Por exemplo:

  • Você tem uma aplicação assíncrona de processamento de filas, como um trabalho de transcodificação de vídeo, em que algumas tarefas precisam ser executadas por horas, mesmo quando a utilização cumulativa do serviço é baixa.

  • Você tem uma aplicação de jogos que executa servidores de jogos como tarefas do Amazon ECS que precisam continuar em execução mesmo que todos os usuários tenham se desconectado para reduzir a latência de inicialização de uma reinicialização do servidor.

  • Quando implantar uma nova versão de código, você precisa que as tarefas continuem em execução, pois seria caro reprocessar.

Para proteger as tarefas pertencentes ao seu serviço de encerramentos em um evento de redução da escala na horizontal, defina o atributo protectionEnabled como true. Por padrão, as tarefas são protegidas por duas horas. É possível personalizar o período de proteção usando o atributo expiresInMinutes. É possível proteger suas tarefas por no mínimo um minuto e até no máximo 2.880 minutos (48 horas).

Depois que uma tarefa terminar o trabalho necessário, será possível definir o atributo protectionEnabled como false, permitindo que a tarefa seja encerrada por eventos subsequentes de redução da escala na horizontal.

Mecanismos de proteção de tarefa na redução da escala horizontalmente

É possível definir e obter proteção de tarefa na redução da escala na horizontal usando o endpoint do agente de contêiner do Amazon ECS ou a API do Amazon ECS.

  • Endpoint do agente de contêiner do Amazon ECS

    Recomendamos o uso do endpoint do agente de contêiner do Amazon ECS para tarefas que possam autodeterminar a necessidade de proteção. Use essa abordagem para workloads baseadas em filas ou em processamento de tarefas.

    Quando um contêiner começa a processar o trabalho, por exemplo, consumindo uma mensagem do SQS, você pode definir o atributo ProtectionEnabled por meio do caminho $ECS_AGENT_URI/task-protection/v1/state do endpoint de proteção de tarefa na redução da escala horizontalmente de dentro do contêiner. O Amazon ECS não encerrará essa tarefa durante eventos de redução da escala horizontalmente. Depois que a tarefa concluir o trabalho, você pode limpar o atributo ProtectionEnabled usando o mesmo endpoint, tornando a tarefa elegível para encerramento durante eventos subsequentes de redução horizontal na escala.

    Para obter mais informações sobre o endpoint do agente de container do Amazon ECS, consulte Endpoint de Proteção de Tarefa na Redução de Escala do Amazon ECS.

  • API do Amazon ECS

    É possível usar a API do Amazon ECS para definir e recuperar a proteção de tarefa na redução horizontal da escala se a aplicação tiver um componente que rastreie o status das tarefas ativas. Use UpdateTaskProtection para marcar uma ou mais tarefas como protegidas. Use GetTaskProtection para recuperar o status da proteção.

    Um exemplo dessa abordagem é o caso de a sua aplicação hospedar sessões de servidores de jogos como tarefas do Amazon ECS. Quando um usuário faz login em uma sessão no servidor (tarefa), você pode marcar a tarefa como protegida. Depois que o usuário se desconecta, é possível desmarcar a proteção especificamente para essa tarefa ou desmarcar periodicamente a proteção para tarefas semelhantes que não tenham mais sessões ativas, dependendo da sua necessidade de manter servidores ociosos.

    Para obter mais informações, consulte UpdateTaskProtection e GetTaskProtection na Referência de APIs do Amazon Elastic Container Service.

É possível combinar as duas abordagens. Por exemplo, use o endpoint do agente do Amazon ECS para definir a proteção de tarefas de dentro de um contêiner e use a API do Amazon ECS para remover a proteção de tarefas do seu serviço de controlador externo.

Considerações

Considere os seguintes pontos antes de usar a proteção de tarefa na redução da escala horizontalmente:

  • Recomendamos o uso do endpoint do agente de contêiner do Amazon ECS porque o agente do Amazon ECS tem mecanismos de repetição integrados e uma interface mais simples.

  • É possível redefinir o período de validade da proteção de tarefa na redução da escala na horizontal invocando UpdateTaskProtection para uma tarefa que já tenha a proteção ativada.

  • Determine quanto tempo uma tarefa precisaria para concluir o trabalho necessário e defina a propriedade expiresInMinutes adequadamente. Se você definir a validade da proteção por mais tempo do que o necessário, incorrerá em custos e enfrentará atrasos na implantação de novas tarefas.

  • Há suporte para a proteção contra redução de escala na horizontal no agente de contêiner do Amazon ECS 1.65.0 ou posterior.

    É possível adicionar suporte a esse recurso em instâncias do Amazon EC2 usando versões mais antigas do agente de contêiner do Amazon ECS atualizando o agente para a versão mais recente. Para ter mais informações, consulte Atualizar o agente de contêiner do Amazon ECS.

  • Considerações de implantação:

    • Se o serviço estiver usando uma atualização contínua, novas tarefas serão criadas, mas as tarefas que executem versões mais antigas não serão encerradas até que protectionEnabled seja desmarcada ou expire. É possível ajustar o parâmetro maximumPercentage na configuração de implantação para um valor que permita que novas tarefas sejam criadas quando tarefas antigas estiverem protegidas.

    • Se uma atualização azul/verde for aplicada, a implantação azul com tarefas protegidas não será removida se as tarefas tiverem protectionEnabled. O tráfego será desviado para as novas tarefas que surgirem e as tarefas mais antigas só serão removidas quando protectionEnabled não estiver definida ou quando expirar. Dependendo do tempo limite das atualizações do CodeDeploy ou do CloudFormation, a implantação pode expirar e as tarefas azuis antigas ainda podem estar presentes.

    • Caso use o CloudFormation, a update-stack tem um tempo limite de três horas. Portanto, se você definir a proteção de tarefas por mais de três horas, a implantação do CloudFormation poderá resultar em falha e reversão.

      Durante o tempo em que suas tarefas antigas estão protegidas, a pilha do CloudFormation exibirá UPDATE_IN_PROGRESS. Se a proteção de tarefa na redução da escala na horizontal for removida ou expirar dentro da janela de três horas, sua implantação será bem-sucedida e passará para o status UPDATE_COMPLETE. Se a implantação ficar presa em UPDATE_IN_PROGRESS por mais de três horas, apresentará falha, mostrará o estado UPDATE_FAILED e, em seguida, será revertida para o antigo conjunto de tarefas.

    • O Amazon ECS enviará eventos de serviço quando as tarefas protegidas estiverem impedindo que uma implantação (contínua ou azul/verde) atinja o estado estacionário para que você possa tomar medidas corretivas. Ao tentar atualizar o status de proteção de uma tarefa, se você receber a mensagem de erro DEPLOYMENT_BLOCKED, isso significa que o serviço tem mais tarefas protegidas do que a contagem desejada de tarefas para o serviço. Para corrigir esse erro, execute um dos seguintes procedimentos:

      • Aguarde até que a proteção da tarefa atual expire. Em seguida, defina a proteção da tarefa.

      • Determine quais tarefas podem ser interrompidas. Em seguida, use UpdateTaskProtection com a opção protectionEnabled definida como false para essas tarefas.

      • Aumente a contagem de tarefas desejada do serviço para mais do que o número de tarefas protegidas.

Permissões do IAM necessárias para a proteção de tarefa na redução da escala horizontalmente

A tarefa deve ter o perfil de tarefa do Amazon ECS com as seguintes permissões:

  • ecs:GetTaskProtection: permite que o agente de contêiner do Amazon ECS chame GetTaskProtection.

  • ecs:UpdateTaskProtection: permite que o agente de contêiner do Amazon ECS chame UpdateTaskProtection.