Ir para o conteúdo

Como faço para atrasar o encerramento de instâncias não íntegras do Amazon EC2 para solucioná-las?

5 minuto de leitura
0

Minha instância do Amazon Elastic Compute Cloud (Amazon EC2) não está íntegra e foi encerrada antes que a causa do problema fosse determinada.

Breve descrição

Para solucionar problemas de uma instância EC2 não íntegra antes do encerramento, adicione um gancho do ciclo de vida do Amazon EC2 Auto Scaling para mover o status da instância de Em encerramento para Encerrando: aguarde.

Por padrão, uma instância permanece no estado Encerrando: aguarde por 3.600 segundos (1 hora). Para aumentar esse tempo, use o parâmetro heartbeat-timeout na chamada de API put-lifecycle-hook. O tempo máximo pelo qual você pode manter uma instância no estado Encerrando: aguarde é de 48 horas ou 100 vezes o tempo limite de pulsação, o que for menor.

Resolução

Use a AWS Command Line Interface (AWS CLI) para configurar um gancho do ciclo de vida.

Observação: se você receber erros ao executar comandos da AWS CLI, consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Crie um tópico do Amazon SNS

Para criar um tópico do Amazon Simple Notification Service (Amazon SNS), conclua as seguintes etapas:

  1. Crie um tópico do SNS em que o grupo do EC2 Auto Scaling envie notificações de ciclo de vida. O exemplo a seguir executa o comando create-topic para criar o tópicoASNotifications:

    $ aws sns create-topic --name ASNotifications

    A saída retorna um ARN semelhante ao seguinte:

    "TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"
  2. Crie uma assinatura para o tópico. Você deve ter uma assinatura para receber o LifecycleActionToken, necessário para estender o tempo limite de pulsação do estado pendente ou concluir a ação do ciclo de vida. O exemplo a seguir usa o comando subscribe para criar uma assinatura que usa o protocolo de e-mail (SMTP) com o endereço de e-mail do endpoint user@amazon.com:

    $ aws sns subscribe --topic-arn arn:aws:sns:us-west-2:123456789012:ASNotifications --protocol email --notification-endpoint user@amazon.com

Configure permissões do IAM

Configure uma função do AWS Identity and Access Management (IAM) que conceda ao grupo do EC2 Auto Scaling permissões de serviço para enviar ao tópico SNS. Para concluir essa tarefa, crie um arquivo de texto que contenha a política apropriada. Em seguida, faça referência ao arquivo no comando create-role.

  1. Use um editor de texto (como vi) para criar o arquivo de texto:

    $ sudo vi assume-role.txt
  2. Insira as seguintes informações no arquivo de texto e salve-o:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "autoscaling.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  3. Execute o comando aws iam create-role para criar o perfil do IAM AS-Lifecycle-Hook-Role a partir da política salva em assume-role.txt:

    $ aws iam create-role --role-name AS-Lifecycle-Hook-Role --assume-role-policy-document file://assume-role.txt

    A saída contém o ARN da função. Anote o ARN do perfil do IAM e do tópico do SNS.

  4. Adicione permissões à função para que o EC2 Auto Scaling envie notificações de SNS quando ocorrer um evento do gancho do ciclo de vida. O exemplo a seguir usa o comando attach-role-policy para anexar a política gerenciada pela AWS AutoScalingNotificationAccessRole ao perfil do IAM AS-Lifecycle-Hook-Role:

    $ aws iam attach-role-policy --role-name AS-Lifecycle-Hook-Role --policy-arn arn:aws:iam::aws:policy/service-role/AutoScalingNotificationAccessRole

    A política gerenciada concede as seguintes permissões:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Resource": "*",
          "Action": [
            "sqs:SendMessage",
            "sqs:GetQueueUrl",
            "sns:Publish"
          ]
        }
      ]
    }

    Importante: a política gerenciada pela AWS AutoScalingNotificationAccessRole permite que o EC2 Auto Scaling faça chamadas para todos os tópicos e filas do SNS. Para restringir o acesso do EC2 Auto Scaling a tópicos ou filas específicos do SNS, use o exemplo de política a seguir.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Resource": "arn:aws:sns:us-west-2:123456789012:ASNotifications",
          "Action": [
            "sqs:SendMessage",
            "sqs:GetQueueUrl",
            "sns:Publish"
          ]
        }
      ]
    }

Configure o gancho do ciclo de vida

Em seguida, execute o comando put-lifecycle-hook para configurar o gancho do ciclo de vida:

aws autoscaling put-lifecycle-hook
    --lifecycle-hook-name AStroubleshoot
    --auto-scaling-group-name MyASGroup
    --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING
    --notification-target-arn arn:aws:sns:us-west-2:123456789012:ASNotifications
    --role-arn arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role

Observação: substitua os valores de exemplo pelo nome do grupo do EC2 Auto Scaling, pelo ARN de destino do SNS e pelo ARN do perfil do IAM.

O comando put-lifecycle-hook completa as seguintes funções:

  • Nomeia o gancho do ciclo de vida (AStroubleshoot)
  • Identifica o grupo do EC2 Auto Scaling associado ao gancho do ciclo de vida (MyASGroup)
  • Configura o gancho para o estágio do ciclo de vida de encerramento da instância (EC2_INSTANCE_TERMINATING)
  • Especifica o ARN do tópico do SNS (arn:aws:sns:us-west-2:123456789012:ASNotifications)
  • Especifica o ARN do perfil do IAM (arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role)

Teste o gancho do ciclo de vida

Para testar o gancho do ciclo de vida, primeiro escolha uma instância. Então, execute o comando terminate-instance-in-auto-scaling-group para encerrar à força a instância. Depois que a instância passar para o estado Encerrando: aguarde, execute o comando record-lifecycle-action-heartbeat para manter a instância nesse estado. Ou execute o comando complete-lifecycle-action para que a finalização termine:

aws autoscaling complete-lifecycle-action
    --lifecycle-hook-name my-lifecycle-hook
    --auto-scaling-group-name MyASGroup
    --lifecycle-action-result CONTINUE
    --instance-id i-0e7380909ffaab747

Informações relacionadas

Ganchos do ciclo de vida do Amazon EC2 Auto Scaling

Como criar um perfil para delegar permissões a um serviço da AWS

Como criar um tópico do Amazon SNS

AWS OFICIALAtualizada há 2 anos