Avisos de interrupção de instância spot
Um aviso de interrupção da instância spot é um aviso emitido dois minutos antes de o Amazon EC2 parar ou encerrar uma instância spot. Se você especificar uma hibernação como o comportamento de interrupção, receberá um aviso de interrupção, mas não receberá o aviso dois minutos antes porque o processo de hibernação começará imediatamente.
A melhor maneira de lidar com interrupções de instâncias spot com tranquilidade é arquitetar a aplicação para que ela seja tolerante a falhas. Para fazer isso, é possível aproveitar os avisos de interrupção de instância spot. Recomendamos que você verifique esses avisos de interrupção a cada 5 segundos.
Os avisos de interrupção são disponibilizados como um evento do Eventbridge e como itens nos metadados de instância na instância spot. Avisos de interrupção são emitidos de acordo com o melhor esforço.
EC2 Spot Instance interruption notice
Quando o Amazon EC2 vai interromper a instância spot, ele emite um evento dois minutos antes da interrupção real (exceto para a hibernação, que recebe o aviso de interrupção, mas não dois minutos antes, porque a hibernação começa imediatamente). Este evento pode ser detectado pelo Amazon EventBridge. Para obter mais informações sobre eventos no EventBridge, consulte o Guia do usuário do Amazon EventBridge. Para obter um exemplo detalhado que orienta você sobre como criar e usar regras de evento, consulte Aproveitar os avisos de interrupção de instância spot do Amazon EC2
Este é um exemplo do evento de interrupção da instância spot. Os valores possíveis para instance-action
são hibernate
, stop
ou terminate
.
{
"version": "0",
"id": "12345678-1234-1234-1234-123456789012
",
"detail-type": "EC2 Spot Instance Interruption Warning",
"source": "aws.ec2",
"account": "123456789012
",
"time": "yyyy
-mm
-dd
Thh
:mm
:ss
Z",
"region": "us-east-2
",
"resources": ["arn:aws:ec2:us-east-2a
:instance/i-1234567890abcdef0
"],
"detail": {
"instance-id": "i-1234567890abcdef0
",
"instance-action": "action
"
}
}
nota
O formato de ARN do evento de interrupção da instância spot é arn:aws:ec2:
. Esse formato é diferente do formato de ARN de recurso do EC2.availability-zone
:instance/instance-id
instance-action
Se a instância spot estiver marcada para ser parada ou terminada pelo Amazon EC2, o item instance-action
estará presente nos seus metadados de instância. Caso contrário, não estará presente. Você pode recuperar instance-action
usando o Instance Metadata Service versão 2 (IMDSv2) da seguinte forma.
Use o comando referente ao seu sistema operacional.
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/spot/instance-action
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/meta-data/spot/instance-action
O item instance-action
especifica a ação e o tempo aproximado (em UTC) em que a ação ocorrerá.
A saída do exemplo a seguir indica o momento em que essa instância será parada.
{"action": "stop", "time": "2017-09-18T08:22:00Z"}
A saída do exemplo a seguir indica o momento em que essa instância será terminada.
{"action": "terminate", "time": "2017-09-18T08:22:00Z"}
Se o Amazon EC2 não estiver se preparando para parar ou terminar a instância, ou se você mesmo terminar a instância, instance-action
não estará presente nos metadados da instância e você receberá um erro HTTP 404 ao tentar recuperá-la.
termination-time
Este item é mantido para compatibilidade com versões anteriores. Use instance-action
em seu lugar.
Se a instância spot estiver marcada para ser encerrada pelo Amazon EC2 (devido a uma interrupção da instância spot em que o comportamento de interrupção está definido como terminate
ou devido ao cancelamento de uma solicitação de instância spot persistente), o item termination-time
estará presente nos metadados da instância. Caso contrário, não estará presente. É possível recuperar termination-time
usando o IMDSv2 da seguinte maneira.
Use o comando referente ao seu sistema operacional.
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
[ec2-user ~]$
if curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then echo termination_scheduled; fi
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/meta-data/spot/termination-time
O item termination-time
especifica o horário aproximado em UTC em que a instância receberá a sinalização de desligamento. O seguinte é um exemplo de saída.
2015-01-05T18:02:00Z
Se o Amazon EC2 não estiver se preparando para encerrar a instância (seja porque não há interrupção da instância spot, seja porque o comportamento de interrupção está definido como stop
ou hibernate
), ou se você tiver encerrado a instância spot por conta própria, o item termination-time
não estará presente nos metadados da instância (portanto, você receberá um erro HTTP 404) ou conterá um valor que não corresponde a um valor de tempo.
Se o Amazon EC2 não encerrar a instância, o status da solicitação será definido como fulfilled
. O valor de termination-time
permanece nos metadados da instância com o tempo aproximado original, que agora está no passado.