Interrupções de Instância spots - Amazon Elastic Compute Cloud

Interrupções de Instância spots

A demanda por Instâncias spot pode variar significativamente de um momento para outro, e a disponibilidade das Instâncias spot também pode variar significativamente dependendo de quantas instâncias do EC2 não utilizadas estão disponíveis. É sempre possível que sua Instância spot possa ser interrompida. Portanto, você deve garantir que o aplicativo esteja preparado para uma interrupção de Instância spot.

Um instância sob demanda especificado em uma Frota do EC2 ou Frota spot não pode ser interrompido.

Motivos para interrupção

Veja a seguir os possíveis motivos pelos quais o Amazon EC2 pode interromper Instâncias spot:

  • Preço – o preço spot é maior do que seu preço máximo.

  • Capacidade – se não houver uma quantidade suficiente de instâncias do EC2 não utilizadas para atender à demanda por Instâncias spot, o Amazon EC2 interromperá as Instâncias spot. A ordem em que as instâncias são interrompidas é determinada pelo Amazon EC2.

  • Restrições – se a solicitação incluir uma restrição como um grupo de execução ou um grupo de zonas de disponibilidade, essas Instâncias spot serão encerradas como um grupo quando não for mais possível atender à restrição.

Comportamentos de interrupção

Você pode especificar que o Amazon EC2 execute uma das seguintes opções quando interromper um Instância spot:

  • Parar a Instância spot

  • Hibernar a Instância spot

  • Encerrar a Instância spot

O padrão é encerrar as Instâncias spot quando elas são interrompidas. Para alterar o comportamento de interrupção, consulte Especificação do comportamento de interrupção.

Parar Instâncias spot interrompidas

Você pode especificar o comportamento de interrupção de modo que o Amazon EC2 pare as Instâncias spot quando elas forem interrompidas, caso os seguintes requisitos sejam atendidos:

Requisitos

  • Para uma solicitação de Instância spot, o tipo deve ser persistent. Você não pode especificar um grupo de execução na solicitação de Instância spot.

  • Para uma solicitação de Frota do EC2 ou Frota spot, o tipo deve ser maintain.

  • O volume raiz deve ser um volume do EBS, e não um volume de armazenamento de instâncias.

Depois que uma Instância spot é interrompida pelo serviço spot, somente o serviço spot poderá reiniciar o Instância spot, e a mesma especificação de execução deverá ser usada.

Para uma Instância spot executada por uma solicitação de persistent Instância spot, o serviço spot reiniciará a instância interrompida quando a capacidade está disponível na mesma zona de disponibilidade e para o mesmo tipo de instância que a instância interrompida.

Se as instâncias de Frota do EC2 e Frota spot forem interrompidas e a frota for do tipo maintain, o serviço spot executará instâncias de substituição para manter a capacidade desejada. O serviço spot localiza os melhores grupos com base na estratégia de alocação especificada (lowestPrice, diversified ou InstancePoolsToUseCount); ele não prioriza o grupo com as instâncias interrompidas anteriormente. Posteriormente, se a estratégia de alocação levar a um grupo contendo as instâncias interrompidas anteriormente, o serviço spot reiniciará as instâncias interrompidas para atender à capacidade desejada.

Por exemplo, considere a Frota spot com a estratégia de alocação lowestPrice. Na execução inicial, um grupo c3.large atende aos critérios de lowestPrice para a especificação de execução. Posteriormente, quando as instâncias c3.large são interrompidas, o serviço spot interrompe as instâncias e repõe a capacidade de outro grupo que se encaixa na estratégia lowestPrice. Desta vez, o grupo passa a ser um grupo c4.large e o serviço spot executa instâncias c4.large para atender a capacidade desejada. Da mesma forma, a Frota spot poderia se mover para um grupo c5.large da próxima vez. Em cada uma dessas transições, o serviço spot não prioriza grupos com instâncias interrompidas anteriormente, mas prioriza apenas a estratégia de alocação especificada. A estratégia lowestPrice pode levar de volta a grupos com instâncias interrompidas anteriormente. Por exemplo, se instâncias forem interrompidas no grupo c5.large e a estratégia lowestPrice levar de volta aos grupos c3.large ou c4.large, as instâncias interrompidas anteriormente serão reiniciadas para atender à capacidade de destino.

Quando uma Instância spot for interrompida, você pode modificar alguns atributos de instância, mas não o tipo de instância. Se você desanexar ou excluir um volume do EBS, ele não será anexado quando a Instância spot for iniciada. Se você desanexar o volume raiz e o serviço spot tentar iniciar a Instância spot, a inicialização da instância falhará e o serviço spot encerrará a instância interrompida.

Você pode encerrar uma Instância spot enquanto ela está interrompida. Se você cancelar uma solicitação spot, uma Frota do EC2 ou uma Frota spot, o serviço spot encerrará todas as Instâncias spot associadas que foram interrompidas.

Enquanto uma Instância spot estiver interrompida, você será cobrado apenas pelos volumes do EBS, que são preservados. Com a Frota do EC2 e a Frota spot, se houver muitas instâncias interrompidas, você poderá exceder o limite de número de volumes do EBS na sua conta.

Colocar Instâncias spot interrompidas em hibernação

Você pode especificar o comportamento de interrupção de modo que o Amazon EC2 coloque as Instâncias spot em hibernação quando elas forem interrompidas, caso os seguintes requisitos sejam atendidos:

Requisitos

  • Para uma solicitação de Instância spot, o tipo deve ser persistent. Você não pode especificar um grupo de execução na solicitação de Instância spot.

  • Para uma solicitação de Frota do EC2 ou Frota spot, o tipo deve ser maintain.

  • O volume da raiz deve ser um volume do EBS, e não um volume do armazenamento de instâncias, e deve ser grande o suficiente para armazenar a memória da instância (RAM) durante a hibernação.

  • As seguintes instâncias são compatíveis: C3, C4, C5, M4, M5, R3 e R4 com menos de 100 GB de memória.

  • Os seguintes sistemas operacionais são compatíveis: Amazon Linux 2, Amazon Linux AMI, Ubuntu com um kernel Ubuntu sintonizado pela AWS (linux-aws) superior a 4.4.0-1041 e Windows Server 2008 R2 e versões posteriores.

  • Instale o agente de hibernação em um sistema operacional suportado ou use uma das seguintes AMIs, que já incluem o agente:

    • Amazon Linux 2

    • Amazon Linux AMI 2017.09.1 ou posterior

    • Ubuntu Xenial 16.04 20171121 ou versão posterior

    • Windows Server 2008 R2 AMI 2017.11.19 ou versão posterior

    • Windows Server 2012 ou Windows Server 2012 R2 AMI 2017.11.19 ou versão posterior

    • Windows Server 2016 AMI 2017.11.19 ou versão posterior

    • Windows Server 2019

  • Inicie o agente. Recomendamos que você use dados do usuário para iniciar o agente na inicialização da instância. Se preferir, você pode iniciar o agente manualmente.

Recomendação

  • Recomendamos que você use um volume do Amazon EBS criptografado como o volume raiz, porque a memória da instância fica armazenada no volume raiz durante a hibernação. Isso garante que o conteúdo da memória (RAM) permaneça criptografado quando os dados estiverem em repouso no volume e quando forem transmitidos entre a instância e o volume. Use uma das três opções a seguir para garantir que o volume raiz seja um volume criptografado do Amazon EBS:

    • Criptografia do EBS em etapa única: em uma chamada de API de instâncias de execução única, você abre as instâncias do EC2 baseadas em EBS criptografadas a partir de uma AMI não criptografada. Para obter mais informações, consulte Usar criptografia em AMIs com EBS.

    • Criptografia do EBS por padrão: você pode habilitar a criptografia do EBS por padrão ao garantir que todos os novos volumes do EBS criados na sua conta da AWS sejam criptografados. Para obter mais informações, consulte Criptografia por padrão.

    • AMI criptografada: você pode habilitar a criptografia do EBS usando uma AMI criptografada para executar sua instância. Se a sua AMI não tiver um snapshot raiz criptografado, você poderá copiá-lo para uma nova AMI e solicitar a criptografia. Para obter mais informações, consulte Criptografar uma imagem não criptografada durante a cópia e Cópia de uma AMI.

Quando uma Instância spot é colocada em estado de hibernação pelo serviço spot, os volumes do EBS são preservados e a memória de instância (RAM) é preservada no volume raiz. Os endereços IP privados da instância também são preservados. Volumes do armazenamento de instâncias e endereços IP públicos (que não sejam endereços IP elásticos) não são preservados. Embora a instância esteja hibernando, você é cobrado apenas pelos volumes do EBS. Com a Frota do EC2 e a Frota spot, se houver muitas instâncias hibernadas, você poderá exceder o limite de número de volumes do EBS na sua conta.

O agente solicita hibernação ao sistema operacional quando a instância recebe um sinal do serviço spot. Se o agente não estiver instalado, o sistema operacional subjacente não oferecer suporte à hibernação ou não houver espaço de volume suficiente para salvar a memória da instância, a hibernação falhará e o serviço spot interromperá a instância.

Quando o serviço spot colocar uma Instância spot em hibernação, você receberá um aviso de interrupção, mas não terá dois minutos antes da interrupção da Instância spot. A hibernação começa imediatamente. Enquanto a instância estiver em processo de hibernação, as verificações de integridade da instância poderão falhar. Quando o processo de hibernação for concluído, o estado da instância será stopped.

Retomar uma Instância spot hibernada

Depois que uma Instância spot for colocada em estado de hibernação pelo serviço spot, ela só poderá ser retomada pelo serviço spot. O serviço spot retomará a instância quando a houver capacidade disponível com um preço spot inferior ao seu preço máximo especificado.

Para obter mais informações, consulte Preparar a hibernação de uma instância.

Para obter informações sobre o Instâncias on-demand em hibernação, consulte Hibernar a instância do Linux.

Especificação do comportamento de interrupção

Se você não especificar um comportamento de interrupção, o padrão será encerrar as Instâncias spot quando elas forem interrompidas. Você pode especificar o comportamento de interrupção ao criar uma solicitação spot. A maneira pela qual você especifica o comportamento de interrupção pode diferir dependendo de como você solicita as Instâncias spot.

Se você solicitar as Instâncias spot usando o assistente de execução de instância, poderá especificar o comportamento de interrupção da seguinte maneira: marque a caixa de seleção Requisição persistente e, em Comportamento da interrupção, escolha um comportamento de interrupção.

Se você solicitar as Instâncias spot usando o console do Spot, poderá especificar o comportamento de interrupção da seguinte maneira: marque a caixa de seleção Manter capacidade de destino e, em Comportamento de interrupção, escolha um comportamento de interrupção.

Se você configurar as Instâncias spot em um modelo de execução, poderá especificar o comportamento de interrupção da seguinte forma: no modelo de execução, expanda Detalhes avançados e marque a caixa de seleção Solicitar Instâncias spot. Escolha Personalizar e, em Comportamento de interrupção, escolha um comportamento de interrupção.

Se você configurar as Instâncias spot em uma configuração de execução ao usar a CLI de request-spot-fleet, poderá especificar o comportamento de interrupção da seguinte maneira: para InstanceInterruptionBehavior, especifique um comportamento de interrupção.

Se você configurar as Instâncias spot usando a CLI de request-spot-instances, poderá especificar o comportamento de interrupção da seguinte forma: para --instance-interruption-behavior, especifique um comportamento de interrupção.

Preparar-se para interrupções

Veja a seguir algumas práticas recomendadas a serem seguidas durante o uso das Instâncias spot:

  • Use o preço máximo padrão, que é o preço sob demanda.

  • Certifique-se de que sua instância esteja preparada assim que a solicitação seja atendida usando uma Imagem de máquina da Amazon (AMI) que contenha a configuração de software necessária. Você também pode usar dados de usuário para executar comandos na inicialização.

  • Armazene regularmente os dados importantes em um lugar em que eles não sejam afetados quando a Instância spot for encerrada. Por exemplo, você pode usar o Amazon S3, o Amazon EBS ou o DynamoDB.

  • Divida o trabalho em tarefas pequenas (usando uma grade, um Hadoop ou uma arquitetura baseada em fila) ou use pontos de verificação para que você possa salvar seu trabalho com frequência.

  • Use avisos de interrupção de Instância spot para monitorar o status das instâncias spot.

  • Embora nos esforcemos ao máximo para fornecer esse aviso o mais rápido possível, pode ser que a Instância spot seja encerrada antes que o aviso seja disponibilizado. Teste o aplicativo para ter a certeza de que ele tratará um encerramento de instância inesperado normalmente, mesmo se você estiver testando avisos de interrupção. Você pode fazer isso executando o aplicativo com uma instância sob demanda e, em seguida, encerrando a instância sob demanda por conta própria.

Preparar a hibernação de uma instância

Você precisa instalar um agente de hibernação na sua instância, a menos que use uma AMI que já inclui o agente. É necessário executar o agente na inicialização da instância, independentemente de ele ter sido incluído na sua AMI ou instalado por você.

Os procedimentos a seguir ajudam você a preparar uma instância do Linux. Para obter instruções sobre como preparar uma instância Windows, consulte Preparação para hibernação de uma instância no Guia do usuário do Amazon EC2 para instâncias do Windows.

Para preparar uma instância do Amazon Linux

  1. Verifique se o kernel oferece suporte à hibernação e atualize-o, se necessário.

  2. Se sua AMI não incluir o agente, instale-o usando o seguinte comando:

    sudo yum update; sudo yum install hibagent
  3. Adicione o seguinte aos dados do usuário:

    #!/bin/bash /usr/bin/enable-ec2-spot-hibernation

Para preparar uma instância do Ubuntu

  1. Se sua AMI não incluir o agente, instale-o usando o seguinte comando: O agente de hibernação só está disponível no Ubuntu 16.04 ou posterior.

    sudo apt-get install hibagent
  2. Adicione o seguinte aos dados do usuário:

    #!/bin/bash /usr/bin/enable-ec2-spot-hibernation

Avisos de interrupção de Instância spots

A melhor maneira de lidar com interrupções de Instância spot com tranquilidade é arquitetar o aplicativo para ser tolerante a falhas. Para fazer isso, você pode aproveitar os avisos de interrupção de Instância spot. Um aviso de interrupção de Instância spot é um aviso emitido dois minutos antes de o Amazon EC2 interromper ou encerrar a 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.

Recomendamos que você verifique esses avisos de interrupção a cada 5 segundos.

Esse aviso de interrupção é disponibilizado como um evento do CloudWatch e como um item nos metadados de instância na Instância spot.

EC2 Instância spot 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). Esse evento pode ser detectado pelo Eventos do Amazon CloudWatch. Para obter mais informações sobre eventos do CloudWatch, consulte o Guia do usuário do Eventos do Amazon CloudWatch. 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 do Instância spot. Os valores possíveis para instance-action são hibernate, stop e terminate.

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Spot Instance Interruption Warning", "source": "aws.ec2", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-2", "resources": ["arn:aws:ec2:us-east-2:123456789012:instance/i-1234567890abcdef0"], "detail": { "instance-id": "i-1234567890abcdef0", "instance-action": "action" } }

instance-action

Se a Instância spot estiver marcada para ser interrompida ou encerrada pelo serviço spot, o item instance-action estará presente nos metadados de instância. Caso contrário, não estará presente. Você pode recuperar instance-action da maneira a seguir.

IMDSv2
[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" –v http://169.254.169.254/latest/meta-data/spot/instance-action
IMDSv1
[ec2-user ~]$ curl 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á.

O exemplo a seguir indica o momento em que essa instância será interrompida.

{"action": "stop", "time": "2017-09-18T08:22:00Z"}

O exemplo a seguir indica o momento em que essa instância será encerrada.

{"action": "terminate", "time": "2017-09-18T08:22:00Z"}

Se o Amazon EC2 não estiver se preparando para interromper ou encerrar a instância, ou se você mesmo encerrar a instância, instance-action não estará presente e você receberá um erro HTTP 404 ao tentar recuperá-la.

termination-time

Este item é mantido para compatibilidade com versões anteriores. Você deve usar instance-action em seu lugar.

Se a Instância spot estiver marcada para encerramento pelo serviço spot, o item termination-time estará presente nos metadados de instância. Caso contrário, não estará presente. Você pode recuperar termination-time da maneira a seguir.

IMDSv2
[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 terminated; fi
IMDSv1
[ec2-user ~]$ if curl -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then echo terminated; fi

O item termination-time especifica o tempo aproximado (em UTC) em que a instância recebe o sinal de desligamento. Por exemplo:

2015-01-05T18:02:00Z

Se o Amazon EC2 não estiver se preparando para encerrar a instância ou se você tiver encerrado a Instância spot por conta própria, o item termination-time não estará presente (e você receberá um erro HTTP 404) ou conterá um valor que não é 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.

Encontrar Instâncias spot interrompidas

No console, o painel Instâncias exibe todas as instâncias, inclusive Instâncias spot. Você pode identificar uma Instância spot usando o valor de spot na coluna Ciclo de vida. A coluna Estado da instância indica se a instância é pending, running, stopping, stopped, shutting-down ou terminated. Para um Instância spot hibernado, o estado da instância é stopped.

Como encontrar uma Instância spot interrompida (console)

  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, escolha Instances (Instâncias). No canto superior direito, escolha o ícone Mostrar/ocultar colunas e, em Atributos de instância, selecione Ciclo de vida. Para o Instâncias spot, o Ciclo de vida é spot.

    Como alternativa, no painel de navegação, escolha Solicitações spot. Você pode visualizar solicitações de Instância spot e Frota spot. Para exibir os IDs das instâncias, selecione uma solicitação da Instância spot ou uma solicitação da Frota spot e escolha a guia Instâncias. Escolha um ID de instância para exibir a instância no painel Instâncias.

  3. Para cada Instância spot, você pode exibir o estado na coluna Estado da instância .

Como encontrar Instâncias spot interrompidas (AWS CLI)

Você pode listar as Instâncias spot interrompidas usando o comando describe-instances com o parâmetro --filters. Para listar apenas os IDs das instâncias na saída, adicione o parâmetro --query.

aws ec2 describe-instances \ --filters Name=instance-lifecycle,Values=spot Name=instance-state-name,Values=terminated,stopped \ --query Reservations[*].Instances[*].InstanceId

Determinar se o Amazon EC2 interrompeu uma Instância spot

Se uma Instância spot for interrompida, hibernada ou encerrada, você pode usar o CloudTrail para ver se o Amazon EC2 interrompeu a Instância spot. Em CloudTrail, o nome do evento BidEvictedEvent indica que o Amazon EC2 interrompeu a Instância spot. Para obter mais informações sobre o uso de CloudTrail, consulte Registrar em log as chamadas de API do Amazon EC2 e do Amazon EBS com o AWS CloudTrail.

Faturamento para Instâncias spot interrompidas

Quando uma Instância spot (que não está em um bloco spot) é interrompida, você é cobrado da maneira indicada a seguir.

Quem interrompe a Instância spot Sistema operacional Interrompida na primeira hora Interrompida em qualquer hora após a primeira

Se você parar ou encerrar a Instância spot

Linux (com exceção de RHEL e SUSE) Cobrança pelos segundos usados Cobrança pelos segundos usados
Windows, RHEL, SUSE Cobrança pela hora completa, mesmo se você usou somente uma parte da hora Cobrança pelas horas completas usadas e cobrança por uma hora completa pela hora parcial interrompida

Se o Amazon EC2 interromper a Instância spot

Linux (com exceção de RHEL e SUSE) Sem cobrança Cobrança pelos segundos usados
Windows, RHEL, SUSE Sem cobrança

Cobrança pelas horas completas usadas, mas sem cobrança pela hora parcial interrompida

Quando uma Instância spot que está em um bloco spot é interrompida, você é cobrado da maneira indicada a seguir.

Quem interrompe a Instância spot Sistema operacional Interrompida na primeira hora Interrompida em qualquer hora após a primeira

Se você parar ou encerrar a Instância spot

Linux (com exceção de RHEL e SUSE) Cobrança pelos segundos usados Cobrança pelos segundos usados
Windows, RHEL, SUSE Cobrança pela hora completa, mesmo se você usou somente uma parte da hora Cobrança pelas horas completas usadas e cobrança por uma hora completa pela hora parcial interrompida

Se o Amazon EC2 interromper a Instância spot

Linux (com exceção de RHEL e SUSE) Sem cobrança Sem cobrança
Windows, RHEL, SUSE Sem cobrança

Sem cobrança