Comment puis-je retarder la résiliation Auto Scaling d'instances Amazon EC2 défectueuses afin de pouvoir les dépanner ?

Date de la dernière mise à jour : 18/11/2020

Mon instance Amazon Elastic Compute Cloud (Amazon EC2) a été marquée comme défectueuse et déplacée vers l'état « Arrêt Auto Scaling ». Ensuite, mon instance Amazon EC2 s'est arrêtée avant que je ne puisse déterminer la cause du problème. Comment y remédier ?

Brève description

Ajoutez un hook de cycle de vie à votre groupe AWS Auto Scaling pour faire passer les instances de l'état Terminating (Résiliation en cours) à l'état Terminating:Wait (Résiliation en cours : attente). Dans cet état, vous pouvez accéder aux instances avant qu'elles ne soient résiliées, puis résoudre le problème ayant entraîné leur marquage comme étant défectueuses.

Par défaut, une instance conserve l'état Terminating:Wait (Arrêt en cours : attente) pendant 3 600 secondes (1 heure). Pour augmenter cette durée, utilisez le paramètre heartbeat-timeout dans l'appel d'API put-lifecycle-hook. La durée maximum de conservation d'une instance dans l'état Terminating:Wait (Arrêt en cours : attente) est de 48 heures ou de 100 fois le délai d'expiration de pulsation, la plus petite valeur des deux.

Résolution

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente de l'interface de ligne de commande AWS.

Suivez les étapes suivantes pour configurer un hook de cycle de vie à l'aide de l'interface de ligne de commande AWS. Ensuite, créez la rubrique Amazon Simple Notification Service (Amazon SNS) nécessaire et les autorisations AWS Identity and Access Management (IAM).

Vous pouvez également configurer un hook de cycle de vie à l'aide d'AWS Management Console. Ensuite, reportez-vous à ce qui suit pour gérer les rubriques Amazon SNS et les autorisations IAM dans la console :

Créer une rubrique Amazon SNS

1.    Créez une rubrique dans laquelle AWS Auto Scaling peut envoyer des notifications de cycle de vie. L'exemple suivant appelle la commande create-topic pour créer la rubrique ASNotifications :

$ aws sns create-topic --name ASNotifications

Un Amazon Resource Name (ARN) similaire au suivant est renvoyé :

"TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"

2.    Créez un abonnement à la rubrique. Vous devez avoir un abonnement pour recevoir l'élément LifecycleActionToken requis pour prolonger le délai d'expiration de pulsation de l'état En attente ou pour exécuter l'action du cycle de vie. L'exemple suivant utilise la commande subscribe pour créer un abonnement qui utilise le protocole d'e-mail (SMTP) avec l'adresse e-mail du point de terminaison user@amazon.com.

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

Configurer les autorisations IAM

Les autorisations IAM sont configurées en créant un rôle IAM qui autorise le service AWS Auto Scaling à envoyer des messages à la rubrique SNS. Pour terminer cette tâche, créez un fichier texte qui contient la stratégie appropriée. Ensuite, référencez le fichier dans la commande create-role.

1.    Utilisez un éditeur de texte (tel que vi) pour créer le fichier texte :

$ sudo vi assume-role.txt

2.    Collez ce qui suit dans le fichier texte, puis enregistrez le fichier.

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

3.    Utilisez la commande aws iam create-role pour créer le rôle IAM AS-Lifecycle-Hook-Role à partir de la stratégie enregistrée dans assume-role.txt :

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

La sortie contient l'ARN pour le rôle. Veillez à enregistrer l'ARN du rôle IAM et la rubrique SNS.

4.    Ajoutez des autorisations au rôle pour autoriser AWS Auto Scaling à envoyer des notifications SNS lorsqu'un événement de hook de cycle de vie se produit. L'exemple suivant utilise la commande attach-role-policy pour attacher la stratégie gérée AutoScalingNotificationAccessRole au rôle 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

Cette stratégie gérée accorde les autorisations suivantes :

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

Important : la stratégie gérée AWS AutoScalingNotificationAccessRole permet au service AWS Auto Scaling d'effectuer des appels à toutes les rubriques et files d'attente SNS. Pour restreindre l'accès d'AWS Auto Scaling à des rubriques ou files d'attente SNS spécifiques, utilisez l'exemple de stratégie suivant.

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

Configurer le hook de cycle de vie

Ensuite, utilisez la commande put-lifecycle-hook pour configurer le hook de cycle de vie :

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 

Assurez-vous de remplacer vos propres nom de groupes AWS Auto Scaling, ARN de cible SNS et ARN de rôle IAM avant d'exécuter cette commande.

Cette commande :

  • nomme le hook de cycle de vie (AStroubleshoot) ;
  • identifie le groupe AWS Auto Scaling auquel le hook de cycle de vie (MyASGroup) est associé ;
  • configure le hook pour l'étape du cycle de vie de résiliation de l'instance (EC2_INSTANCE_TERMINATING) ;
  • spécifie l'ARN de la rubrique SNS (arn:aws:sns:us-west-2:123456789012:ASNotifications) ;
  • spécifie l'ARN du rôle IAM (arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role).

Tester le hook de cycle de vie

Pour tester le hook de cycle de vie, choisissez une instance, puis utilisez terminate-instance-in-auto-scaling group pour résilier l'instance. Cela force AWS Auto Scaling à résilier l'instance, comme lorsque l'instance devient défectueuse. Une fois que l'instance passe à l'état Terminating:Wait (Résiliation en cours : attente), vous pouvez conserver votre instance dans cet état en utilisant le paramètre record-lifecycle-action-heartbeat. Vous pouvez également autorisez la résiliation à l'aide de 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

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?