Wie verzögere ich die Beendigung von fehlerhaften Amazon EC2-Instances durch Auto Scaling, damit ich diese beheben kann?

Lesedauer: 5 Minute
0

Meine Amazon Elastic Compute Cloud (Amazon EC2)-Instance wurde als fehlerhaft markiert und in den Status „Auto Scaling Terminating“ versetzt. Anschließend wurde meine Amazon EC2-Instance beendet, bevor ich die Ursache des Problems ermitteln konnte.

Kurzbeschreibung

Fügen Sie Ihrer AWS Auto-Scaling-Gruppe einen Lebenszyklus-Hook hinzu, um Instances im Status Terminating in den Status Terminating:Wait zu verschieben. In diesem Status können Sie auf Instances zugreifen, bevor sie beendet werden, und so Fehler beheben, auf deren Grundlage sie als fehlerhaft markiert wurden.

Standardmäßig verbleibt eine Instance 3600 Sekunden (1 Stunde) im Status Terminating:Wait. Um diese Zeit zu verlängern, verwenden Sie den Parameter heartbeat-timeout im API-Aufruf put-lifecycle-hook. Die maximale Zeit, für die Sie eine Instance im Status Terminating:Wait belassen können, beträgt 48 Stunden oder das 100-fache des Heartbeat-Timeouts, je nachdem, welcher Wert kleiner ist.

Lösung

**Hinweis:**Wenn Sie beim Ausführen von Befehlen der AWS Command Line Interface (AWS CLI) Fehler erhalten, stellen Sie sicher, dass Sie die neueste Version der AWS CLI verwenden.

Gehen Sie wie folgt vor, um einen Lebenszyklus-Hook mithilfe der AWS-CLI zu konfigurieren. Erstellen Sie dann das erforderliche Amazon Simple Notification Service (Amazon SNS)-Thema und die AWS Identity and Access Management (IAM)-Berechtigungen.

Alternativ können Sie einen Lebenszyklus-Hook mithilfe der AWS-Managementkonsole konfigurieren. Lesen Sie anschließend die folgenden Informationen, um Amazon SNS-Themen und IAM-Berechtigungen in der Konsole zu verwalten:

Erstellen Sie ein Amazon-SNS-Thema

1.Erstellen Sie ein Thema, an das AWS Auto Scaling Lebenszyklusbenachrichtigungen senden kann. Im folgenden Beispiel wird der Befehl create-topic aufgerufen, um das Thema ASNotifications zu erstellen:

$ aws sns create-topic --name ASNotifications

Es wird ein Amazon-Ressourcenname (ARN) zurückgegeben, der dem folgenden ähnelt:

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

2.Erstellen Sie ein Abonnement für das Thema. Sie müssen über ein Abonnement verfügen, um das LifecycleActionToken zu erhalten, das erforderlich ist, um das Heartbeat-Timeout des Status „Ausstehend“ zu verlängern oder die Lifecycle-Aktion abzuschließen. Im folgenden Beispiel wird mit dem Befehl subscribe ein Abonnement erstellt, das das E-Mail-Protokoll (SMTP) mit der Endpunkt-E-Mail-Adresse user@amazon.com verwendet.

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

IAM-Berechtigungen konfigurieren

IAM-Berechtigungen werden konfiguriert, indem eine IAM-Rolle erstellt wird, die dem AWS Auto Scaling-Dienst Berechtigungen zum Senden an das SNS-Thema gewährt. Um diese Aufgabe abzuschließen, erstellen Sie eine Textdatei, die die entsprechende Richtlinie enthält. Verweisen Sie dann im Befehl create-role auf die Datei.

1.Verwenden Sie einen Texteditor (wie etwa vi), um die Textdatei zu erstellen:

$ sudo vi assume-role.txt

2.Fügen Sie Folgendes in die Textdatei ein, und speichern Sie die Datei.

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

3.Verwenden Sie den Befehl aws iam create-role, um die IAM-Rolle AS-Lifecycle-Hook-Role anhand der in assume-role.txt gespeicherten Richtlinie zu erstellen:

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

Die Ausgabe enthält den ARN für die Rolle. Achten Sie darauf, sowohl den ARN der IAM-Rolle als auch das SNS-Thema zu speichern.

4.Fügen Sie der Rolle Berechtigungen hinzu, damit AWS Auto Scaling SNS-Benachrichtigungen senden kann, wenn ein Lebenszyklus-Hook-Ereignis eintritt. Im folgenden Beispiel wird der Befehl attach-role-policy verwendet, um die verwaltete Richtlinie AutoScalingNotificationAccessRole an die IAM-Rolle AS-Lifecycle-Hook-Role anzuhängen:

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

Diese verwaltete Richtlinie gewährt die folgenden Berechtigungen:

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

Wichtig: Die von AWS verwaltete Richtlinie AutoScalingNotificationAccessRole ermöglicht es dem AWS Auto Scaling-Dienst, Aufrufe an alle SNS-Themen und Warteschlangen zu tätigen. Verwenden Sie die folgende Beispielrichtlinie, um den Zugriff von AWS Auto Scaling nur auf bestimmte SNS-Themen oder Warteschlangen zu beschränken.

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

Den Lebenszyklus-Hook konfigurieren

Verwenden Sie als Nächstes den Befehl put-lifecycle-hook, um den Lebenszyklus-Hook zu konfigurieren:

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 

Stellen Sie sicher, dass Sie Ihren eigenen AWS Auto Scaling-Gruppennamen, SNS-Ziel-ARN und IAM-Rollen-ARN einfügen, bevor Sie diesen Befehl ausführen.

Dieser Befehl:

  • Benennt den Lebenszyklus-Hook (AStroubleshoot)
  • Identifiziert die AWS Auto Scaling-Gruppe, die dem Lebenszyklus-Hook zugeordnet ist (MyASGroup)
  • Konfiguriert den Hook für die Lebenszyklusphase der Instance-Beendigung (EC2_INSTANCE_TERMINATING)
  • Legt den ARN des SNS-Themas fest (arn:aws:sns:us-west-2:123456789012:ASNotifications)
  • Legt den ARN der IAM-Rolle fest (arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role)

Testen Sie den Lebenszyklus-Hook

Um den Lebenszyklus-Hook zu testen, wählen Sie eine Instance aus und verwenden Sie anschließend terminate-instance-in-auto-scaling group, um die Instance zu beenden. Hierdurch wird AWS Auto Scaling gezwungen, die Instance zu beenden, ähnlich wie wenn die Instance fehlerhaft wird. Nachdem die Instanz zum Status Terminating:Wait gewechselt hat, können Sie Ihre Instance in diesem Zustand belassen, indem Sie folgendes nutzen: record-lifecycle-action-heartbeat. Warten Sie alternativ, bis die Beendigung abgeschlossen ist, indem Sie complete-lifecycle-action verwenden.

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

Ähnliche Informationen

Amazon EC2 Auto Scaling-Lebenszyklus-Hooks

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren