Wie verzögere ich die Beendigung einer fehlerhaften Amazon EC2-Instance, damit ich Probleme beheben kann?

Lesedauer: 4 Minute
0

Meine Amazon Elastic Compute Cloud (Amazon EC2)-Instance ist fehlerhaft und wurde beendet, bevor ich die Ursache des Problems ermittelt habe.

Kurzbeschreibung

Um eine fehlerhafte EC2-Instance vor der Beendigung zu beheben, fügen Sie einen Amazon EC2 Auto Scaling-Lifecycle-Hook hinzu, um den Status der Instance von Terminating auf Terminating:Wait zu verschieben.

Standardmäßig verbleibt eine Instance 3,600 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

Verwenden Sie die AWS-Befehlszeilenschnittstelle (AWS CLI), um einen Lifecycle-Hook zu konfigurieren.

**Hinweis:**Wenn Sie beim Ausführen von Befehlen in AWS CLI Fehlermeldungen erhalten, finden Sie weitere Informationen unter Beheben von AWS CLI-Fehlern. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Erstellen Sie ein Amazon-SNS-Thema

Gehen Sie wie folgt vor, um ein Amazon Simple Notification Service (Amazon SNS) -Thema zu erstellen:

  1. Erstellen Sie ein SNS-Thema, in dem die EC2 Auto Scaling-Gruppe Lebenszyklusbenachrichtigungen sendet. Im folgenden Beispiel wird der Befehl create-topic aufgerufen, um das Thema ASNotifications zu erstellen:

    $ aws sns create-topic --name ASNotifications

    Die Ausgabe gibt einen ARN zurück, 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

Konfigurieren Sie eine AWS Identity and Access Management (IAM) -Rolle, die dem EC2 Auto Scaling-Gruppenservice Berechtigungen zum Senden an das SNS-Thema erteilt. 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. Geben Sie die folgenden Informationen in die Textdatei ein, und speichern Sie dann 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 der Rolle. Notieren Sie sich den ARN sowohl der IAM-Rolle als auch des SNS-Themas.

  4. Fügen Sie der Rolle Berechtigungen hinzu, damit EC2 Auto Scaling SNS-Benachrichtigungen senden kann, wenn ein Lifecycle-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

    Die vorherige 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 EC2 Auto Scaling, Anrufe an alle SNS-Themen und Warteschlangen zu tätigen. Verwenden Sie die folgende Beispielrichtlinie, um den Zugriff von EC2 Auto Scaling auf bestimmte SNS-Themen oder Warteschlangen einzuschrä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 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

**Hinweis:**Ersetzen Sie die Beispielwerte durch Ihren EC2 Auto Scaling-Gruppennamen, den SNS-Ziel-ARN und den IAM-Rollen-ARN.

Der Befehl put-lifecycle-hook vervollständigt die folgenden Funktionen:

  • Benennt den Lebenszyklus-Hook (AStroubleshoot)
  • Identifiziert die EC2 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 Lifecycle-Hook zu testen, wählen Sie zunächst eine Instance aus. Führen Sie in AWS CLI den Befehl terminate-instance-in-auto-scaling-group aus, um die Instance zu beenden. Nachdem die Instance in den Status Terminating:Wait übergegangen ist, führen Sie den Befehl record-lifecycle-action-heartbeat aus, um die Instance in diesem Zustand zu belassen. Oder führen Sie den Befehl complete-lifecycle-action aus, um die Kündigung abzuschließen:

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

Eine Rolle erstellen, um Berechtigungen an einen AWS-Dienst zu delegieren

Ein Amazon SNS-Thema erstellen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 8 Monaten