Como lidar com avisos de encerramento Spot em tarefas do AWS Fargate Spot?

Data da última atualização: 14/04/2022

Quero saber como lidar com avisos de encerramento Spot nas tarefas do AWS Fargate Spot.

Breve descrição

Você pode usar o Fargate Spot para executar tarefas do Amazon Elastic Container Service (Amazon ECS) tolerantes a interrupções. Um aviso de encerramento é um aviso de dois minutos que você recebe antes que a tarefa Fargate Spot seja encerrada. Ele ajuda você a gerenciar interrupções Spot, dando às aplicações tempo para se prepararem para um desligamento normal. O aviso de encerramento é criado assim que a tarefa do Fargate Spot é marcada para encerramento. O aviso indica a hora em que a tarefa do Fargate Spot que está sendo executada será encerrada. O aviso é enviado como um evento de alteração de estado da tarefa para o Amazon EventBridge e como um sinal SIGTERM para a tarefa em execução.

Para garantir que os contêineres no Fargate Spot sejam encerrados antes que a tarefa pare, especifique um valor stopTimeout de 120 segundos ou menos na definição de contêiner usada pela tarefa. Especificar um valor stopTimeout dá ao contêiner tempo necessário para ser encerrado normalmente. Decorrido esse tempo, o contêiner é interrompido a força.

Observação: você pode especificar um valor máximo de 120 segundos para stopTimeout. Se não especificar um valor para esse parâmetro, o valor padrão de 30 segundos será usado.

Quando o sinal de interrupção é recebido em serviços do Amazon ECS usando o Fargate Spot, o programador de serviços usa os valores minimumHealthyPercent e maximumPercent para determinar se há capacidade adicional disponível. Se houver capacidade disponível, o programador de serviços tentará iniciar tarefas adicionais no Fargate Spot. No entanto, se o programador de serviços não conseguir encontrar capacidade para novas tarefas, as tarefas antigas serão encerradas após o término da duração de stopTimeout.

Considere o seguinte ao usar o Fargate Spot com um balanceador de carga:

  • As tarefas executadas como FARGATE_SPOT podem não ter o registro cancelado do grupo de destino de um balanceador de carga até que elas façam a transição para um estado STOPPED.
  • Com FARGATE_SPOT, você tem apenas dois minutos para cancelar o registro do grupo-alvo antes que a tarefa seja encerrada. Isso significa que você deve definir o atraso de cancelamento de registro para qualquer grupo-alvo associado a FARGATE_SPOT como um valor inferior a dois minutos.

Resolução

Quando não há capacidade disponível ou a capacidade é recuperada para o Fargate Spot, o programador de serviços do ECS não pode iniciar novas tarefas e encerra as tarefas existentes após gerar um aviso de dois minutos. No entanto, esses eventos não são relatados no console do Amazon ECS.

Como os eventos do ECS são entregues ao EventBridge quase em tempo real, é uma prática recomendada escrever regras simples para indicar os eventos de sua escolha e ações automatizadas que devem ser tomadas quando um evento corresponde a uma regra. Este artigo aborda as regras do EventBridge para os seguintes casos de uso:

  • Uma tarefa FARGATE_SPOT é encerrada devido à interrupção do Fargate Spot.
  • Uma tarefa FARGATE_SPOT não pode ser efetivada devido à indisponibilidade da capacidade do Fargate Spot.

Uma tarefa FARGATE_SPOT é encerrada devido à interrupção do Fargate Spot

Veja a seguir um snippet de um evento de alteração de estado de tarefa exibindo o motivo da parada e o código de parada para uma interrupção do Fargate Spot.

{
  "version": "0",
  "id": "a99d3f53-4a7c-4153-a1a5-48957fc83b8f",
  "detail-type": "ECS Task State Change",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9b"
  ],
  "detail": {
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "createdAt": "2022-02-25T10:13:08.455Z",
    "desiredStatus": "STOPPED",
    "lastStatus": "RUNNING",
    "stoppedReason": "Your Spot Task was interrupted.",
    "stopCode": "TerminationNotice",
    "taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
    ...
  }
}

Observe que o stopCode é mencionado como TerminationNotice quando uma tarefa é interrompida devido à interrupção do Fargate Spot. Isso significa que você pode criar uma regra do EventBridge que envia um alerta do Amazon Simple Notification Service (Amazon SNS) sempre que uma tarefa FARGATE_SPOT é interrompida devido ao código de parada TerminationNotice.

Faça o seguinte:

  1. Crie um tópico do Amazon SNS.
  2. Crie uma regra do EventBridge para esse caso de uso.

Para criar uma regra do EventBridge para esse caso de uso, faça o seguinte:

1.    Abra o console do Amazon EventBridge.

2.    No painel de navegação, selecione Funções.

3.    Selecione Create rule (Criar regra).

4.    Insira um nome e uma descrição para a regra.

5.    Em Event bus (Barramento de eventos), selecione AWS default event bus (Barramento de eventos padrão da AWS).

6.    Para Rule type (Tipo de regra), selecione Rule with an event pattern (Regra com um padrão de evento).

7.    Escolha Next (Seguinte).

8.    Para Event source (Fonte do evento), selecione AWS services (Serviços da AWS).

9.    Para Event pattern (Padrão de evento), escolha Custom patterns (JSON editor) (Padrões personalizados - editor JSON) e adicione o seguinte padrão:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "stopCode": [
      "TerminationNotice"
    ],
    "clusterArn": [
      "arn:aws:ecs:exampleregion:1111222233334444:cluster/examplecluster"
    ]
  }
}

10.    Escolha Next (Seguinte).

11.    Para Target types (Tipos de destino), selecione AWS service (Serviço da AWS).

12.    Para Select a target (Selecionar um destino), selecione SNS topic (Tópico do SNS).

13.    Para Topic (Tópico), selecione o tópico do SNS que você criou.

14.    Escolha Next (Seguinte).

15.    Na página configure tags - optional (configurar etiquetas - opcional), escolha Next (Seguinte).

16.    Revise as opções e escolha Create rule (Criar regra).

Uma tarefa FARGATE_SPOT não pode ser efetivada devido à indisponibilidade da capacidade do Fargate Spot

Veja a seguir um snippet do evento de falha de efetivação da tarefa de serviço que ocorreu sob as seguintes condições:

  • A tarefa estava tentando usar o provedor de capacidade FARGATE_SPOT.
  • O programador de serviços não conseguiu adquirir capacidade do Fargate Spot.
{
  "version": "0",
  "id": "403b98b2-616e-4ec7-8dff-b2cba8d5bf64",
  "detail-type": "ECS Service Action",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "time": "2022-02-25T14:56:32.756Z",
  "region": "ap-southeast-2",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:service/default/servicetest"
  ],
  "detail": {
    "eventType": "ERROR",
    "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "capacityProviderArns": [
      "arn:aws:ecs:ap-southeast-2:1111222233334444:capacity-provider/FARGATE_SPOT"
    ],
    "reason": "RESOURCE:FARGATE",
    "createdAt": "2022-02-25T14:21:04.163Z"
  }
}

Quando uma tarefa não pode ser efetivada devido à capacidade indisponível do Fargate Spot, o eventName é mencionado como SERVICE_TASK_PLACEMENT_FAILURE. Isso significa que você pode criar uma regra do EventBridge que enviará um alerta do SNS sempre que uma tarefa do FARGATE_SPOT não puder ser efetivada.

Faça o seguinte:

1.    Crie um tópico do SNS.

2.    Crie uma regra do Amazon EventBridge para esse caso de uso. Para fazer isso, use as instruções fornecidas na seção Uma tarefa FARGATE_SPOT é encerrada devido à interrupção do Fargate Spot, exceto pela seguinte alteração:

Para Event pattern (Padrão de evento), escolha Custom patterns (JSON editor) (Padrões personalizados - editor JSON) e adicione o seguinte padrão:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Deployment State Change"
  ],
  "detail": {
    "eventName": [
      "SERVICE_TASK_PLACEMENT_FAILURE"
    ],
    "clusterArn": [
      "arn:aws:ecs:example-region:1111222233334444:cluster/example-cluster"
    ],
    "reason": [
      "RESOURCE:FARGATE"
    ]
  }
}