Manju vous montre comment
retarder l'arrêt des instances EC2
à des fins de dépannage

Manju_DUB_0518

Mon instance Amazon EC2 est marquée comme défectueuse, est déplacée vers l'état Auto Scaling Terminating (Arrêt avec l'Auto Scaling) et est finalement arrêtée avant que je puisse identifier la cause du problème.

Vous pouvez ajouter un hook de cycle de vie à votre groupe Auto Scaling pour faire passer les instances de l'état Terminating (Arrêt en cours) à l'état Terminating:Wait (Arrêt en cours : attente). Cet état vous permet d'accéder aux instances avant qu'elles soient arrêtées, afin de pouvoir déterminer pourquoi elles sont marquées comme 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, vous pouvez utiliser 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 de pulsation, la plus petite valeur des deux.

Les hooks de cycle de vie ne peuvent être configurés qu'en utilisant la ligne de commande AWS et API. Les étapes suivantes décrivent le processus de configuration d'un hook de cycle de vie, y compris en créant la rubrique SNS nécessaire et les autorisations IAM en utilisant la ligne de commande AWS. Si vous préférez gérer IAM et SNS en utilisant la console, consultez Créer un rôle pour IAM et Créer une rubrique pour SNS.

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

$ aws sns create-topic --name ASNotifications

2.    Enregistrez l'Amazon Resource Name (ARN) qui est renvoyé. L'ARN renvoyé doit ressembler à ce qui suit :

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

3.    Créez un abonnement à la rubrique SNS. C'est obligatoire pour recevoir le LifecycleActionToken nécessaire pour rallonger le délai d'attente des pulsations de l'état en attente ou pour exécuter l'action du cycle de vie. L'exemple suivant utilise la commande d'abonnement aws sns 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

Les autorisations IAM sont configurées en créant un rôle IAM qui autorise le service Auto Scaling à envoyer des messages à la rubrique SNS. Cela peut être effectué en créant un fichier texte contenant la stratégie adéquate, puis en référençant le fichier à partir de la commande aws iam create-role. Les étapes suivantes vous indiquent comment faire.

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

$ sudo vi assume-role.txt

2.    Collez le contenu suivant 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.    L'exemple suivant utilise 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

Le résultat 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 Auto Scaling à envoyer des notifications SNS lorsqu'un événement de hook de cycle de vie se produit. L'exemple suivant utilise la commande aws iam 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 opérée accorde les autorisations suivantes :

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

Un hook de cycle de vie peut être configuré après que des notifications et des autorisations ont été configurées correctement. L'exemple suivant exécute la commande aws autoscaling put-lifecycle-hook pour configurer le hook du 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

Cette commande effectue les tâches suivantes :

  • Nomme le hook du cycle de vie (AStroubleshoot).
  • Identifie le groupe Auto Scaling auquel le hook de cycle de vie est associé (MyASGroup).
  • Configure le hook pour l'étape du cycle de vie d'arrêt 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).

Assurez-vous de remplacer vos propres nom de groupe Auto Scaling, ARN de cible SNS et ARN de rôle IAM le cas échéant avant d'exécuter cette commande dans votre environnement.

Pour tester le hook de cycle de vie, choisissez une instance et utilisez le groupe terminate-instance-in-auto-scaling pour arrêter l'instance. Cela permet à l'Auto Scaling d'arrêter l'instance, comme lorsque l'instance devient défectueuse. Une fois que l'instance a l'état Terminating:Wait (Arrêt en cours : attente), vous pouvez choisir de conserver l'état Terminating:Wait (Arrêt en cours : attente) pour l'instance à l'aide de record-lifecycle-action-heartbeat ou d'autoriser la finalisation de l'arrêt à l'aide de complete-lifecycle-action. L'exemple suivant fournit la syntaxe nécessaire :

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

Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support.

Date de publication : 04/08/2015

Date de mise à jour : 25/08/2017