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

5 minuto de leitura
0

Minha instância do Amazon Elastic Compute Cloud (Amazon EC2) foi marcada como não íntegra e movida para o estado “Encerramento do Auto Scaling”. Em seguida, minha instância do Amazon EC2 foi encerrada antes que eu pudesse determinar a causa do problema.

Breve descrição

Adicione um gancho do ciclo de vida ao seu grupo do AWS Auto Scaling para mover instâncias no estado Terminating para o estado Terminating:Wait. Nesse estado, você pode acessar as instâncias antes que elas sejam encerradas e, em seguida, solucionar o motivo pelo qual elas foram marcadas como não íntegras.

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

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

Use as etapas a seguir para configurar um gancho do ciclo de vida usando a AWS CLI. Em seguida, crie o tópico necessário do Amazon Simple Notification Service (Amazon SNS) e as permissões do AWS Identity and Access Management (IAM).

Ou você pode configurar um gancho do ciclo de vida usando o Console de Gerenciamento da AWS. Em seguida, consulte o seguinte para gerenciar os tópicos do Amazon SNS e as permissões do IAM no console:

Criar um tópico do Amazon SNS

1.    Crie um tópico em que o AWS Auto Scaling possa enviar notificações do ciclo de vida. O exemplo a seguir chama o comando create-topic para criar o tópico AsNotifications:

$ aws sns create-topic --name ASNotifications

Um nome de recurso da Amazon (ARN) semelhante ao seguinte é retornado:

"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

Configurar permissões do IAM

As permissões do IAM são configuradas criando um perfil do IAM que concede ao serviço AWS Auto Scaling permissões para enviar ao tópico do 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.    Cole o seguinte no arquivo de texto e salve-o.

{
  "Version": "2012-10-17",
  "Statement": [{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "autoscaling.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    Use 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. Certifique-se de salvar o ARN do perfil do IAM e o tópico do SNS.

4.    Adicione permissões à função para permitir que o AWS 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 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

Essa 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 serviço AWS Auto Scaling faça chamadas para todos os tópicos e filas do SNS. Para restringir o acesso do AWS Auto Scaling somente 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, use o comando put-lifecycle-hook para configurar o gancho do ciclo de vida:

aws autoscaling put-lifecycle-hook --lifecycle-hook-name AStroublshoot --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 

Certifique-se de substituir seu próprio nome de grupo do AWS Auto Scaling, o ARN de destino do SNS e o ARN da função do IAM antes de executar esse comando.

Esse comando:

  • Nomeia o gancho do ciclo de vida (AStroubleshoot)
  • Identifica o grupo do AWS 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, escolha uma instância e use terminate-instance-in-auto-scaling group para encerrar a instância. Isso força o AWS Auto Scaling a encerrar a instância, da mesma forma que quando a instância se torna não integra. Depois que a instância for movida para o estado Terminating:Wait, você pode manter sua instância nesse estado usando record-lifecycle-action-heartbeat. Ou permita que o encerramento seja concluído usando complete-lifecycle-action.

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 de ciclo de vida do Amazon EC2 Auto Scaling

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos