Comment puis-je retarder la résiliation d’une instance Amazon EC2 non saine afin de pouvoir la dépanner ?

Lecture de 5 minute(s)
0

Mon instance Amazon Elastic Compute Cloud (Amazon EC2) est défectueuse et a été résiliée avant que je ne puisse déterminer la cause du problème.

Brève description

Pour dépanner une instance EC2 défectueuse avant sa résiliation, ajoutez un hook de cycle de vie Amazon EC2 Auto Scaling pour faire passer le statut de l'instance de Terminating à Terminating:Wait.

Par défaut, une instance reste dans le statut Terminating:Wait pendant 3 600 secondes, soit 1 heure. Pour augmenter cette durée, utilisez le paramètre heartbeat-timeout dans l'appel d'API put-lifecycle-hook. La durée maximale pendant laquelle vous pouvez maintenir une instance dans le statut Terminating:Waitest de 48 heures ou 100 fois le délai de pulsation, le délai le plus court étant retenu.

Résolution

Utilisez l'interface de ligne de commande AWS (AWS CLI) pour configurer un hook de cycle de vie.

**Remarque :**Si des erreurs surviennent lorsque vous exécutez des commandes AWS CLI, consultez l’article Résoudre les erreurs AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Créer une rubrique Amazon SNS

Pour créer une rubrique Amazon Simple Notification Service (Amazon SNS), procédez comme suit :

  1. Créez une rubrique SNS dans laquelle le groupe EC2 Auto Scaling envoie des notifications relatives au cycle de vie. L'exemple suivant exécute la commande create-topic pour créer la rubrique ASNotifications :

    $ aws sns create-topic --name ASNotifications

    La sortie renvoie un ARN similaire au suivant :

    "TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"
  2. Créez un abonnement à la rubrique. Vous devez être abonné pour recevoir l’élément LifeCycleActionToken qui est nécessaire pour prolonger le délai de pulsation du statut en attente ou pour terminer l'action du cycle de vie. L'exemple suivant exécute la commande subscribe pour créer un abonnement qui utilise le protocole de messagerie 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

Configurez un rôle AWS Identity and Access Management (IAM) qui accorde au service de groupe EC2 Auto Scaling les autorisations d'envoi vers la rubrique SNS. Pour effectuer cette tâche, créez un fichier texte contenant la politique 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. Entrez les informations suivantes 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. Exécutez la commande aws iam create-role pour créer le rôle IAM AS-Lifecycle-Hook-Role à partir de la politique 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 du rôle. Notez l'ARN du rôle IAM et de la rubrique SNS.

  4. Ajoutez des autorisations au rôle pour permettre à EC2 Auto Scaling d'envoyer des notifications SNS lorsqu'un événement de hook du cycle de vie se produit. L'exemple suivant exécute la commande attach-role-policy pour attacher la politique gérée par AWS 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

    La politique gérée précédente accorde les autorisations suivantes :

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

    Important : La politique gérée par AWS AutoScalingNotificationAccessRole permet à EC2 Auto Scaling de passer des appels à toutes les rubriques et files d'attente du SNS. Pour restreindre l'accès d'EC2 Auto Scaling à des rubriques ou files d'attente SNS spécifiques, utilisez l'exemple de politique 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 du cycle de vie

Exécutez ensuite la commande put-lifecycle-hook pour configurer le hook du cycle de vie :

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

Remarque : Remplacez les valeurs d'exemple par le nom de votre groupe EC2 Auto Scaling, l'ARN cible SNS et l'ARN du rôle IAM.

La commande put-lifecycle-hook exécute les fonctions suivantes :

  • nomme le hook du cycle de vie (AsTroubleshoot)
  • identifie le groupe EC2 Auto Scaling associé au hook du cycle de vie (MyAsGroup)
  • configure le hook pour l'étape du cycle de vie de terminaison 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 du cycle de vie

Pour tester le hook du cycle de vie, choisissez d'abord une instance. Exécutez ensuite la commande terminate-instance-in-auto-scaling group pour forcer la résiliation de l'instance. Une fois que l'instance est passée au statut Terminating:Wait, exécutez la commande record-lifecycle-action-heartbeat pour conserver l'instance dans ce statut. Vous pouvez également exécuter la commande complete-lifecycle-action pour terminer la résiliation :

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

Informations connexes

Hooks de cycle de vie Amazon EC2 Auto Scaling

Création d'un rôle pour la délégation d'autorisations à un service AWS

Création d'une rubrique Amazon SNS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an