Tutorial: Konfigurieren eines Lebenszyklus-Hook, der eine Lambda-Funktion aufruft - Amazon EC2 Auto Scaling

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Tutorial: Konfigurieren eines Lebenszyklus-Hook, der eine Lambda-Funktion aufruft

In dieser Übung erstellen Sie eine EventBridge Amazon-Regel, die ein Filtermuster enthält, das bei Übereinstimmung eine AWS Lambda Funktion als Regelziel aufruft. Wir stellen das Filtermuster und Beispielfunktionscode zur Verfügung.

Wenn alles richtig konfiguriert ist, führt die Lambda-Funktion am Ende dieses Tutorials beim Start von Instances eine benutzerdefinierte Aktion aus. Die benutzerdefinierte Aktion protokolliert einfach das Ereignis im CloudWatch Logs-Protokollstream, der der Lambda-Funktion zugeordnet ist.

Die Lambda-Funktion führt auch einen Rückruf durch, damit der Lebenszyklus der Instance fortgesetzt werden kann, wenn diese Aktion erfolgreich ist. Die Instance kann jedoch den Start abbrechen und beendet werden, wenn die Aktion fehlschlägt.

In der folgenden Abbildung wird der Ablauf für ein Scale-Out-Ereignis zusammengefasst, wenn Sie eine Lambda-Funktion verwenden, um eine benutzerdefinierte Aktion auszuführen. Nach dem Start einer Instance wird der Lebenszyklus der Instance angehalten, bis der Lifecycle-Hook abgeschlossen ist, entweder durch eine Zeitüberschreitung oder dadurch, dass Amazon EC2 Auto Scaling ein Signal zum Fortfahren empfängt.

Der Ablauf für ein Scale-Out-Ereignis, wenn Sie eine Lambda-Funktion verwenden, um eine benutzerdefinierte Aktion auszuführen.

Voraussetzungen

Erstellen Sie vor Beginn dieses Tutorials eine Auto-Scaling-Gruppe, falls noch keine vorhanden ist. Öffnen Sie zum Erstellen einer Auto-Scaling-Gruppe die Seite Auto-Scaling-Gruppen der Amazon EC2-Konsole und wählen Sie Eine Auto-Scaling-Gruppe erstellen aus.

Schritt 1: Erstellen einer IAM-Rolle mit Berechtigungen zum Abschließen von Lebenszyklus-Aktionen

Bevor Sie eine Lambda-Funktion erstellen, müssen Sie zunächst eine Ausführungsrolle und eine Berechtigungsrichtlinie erstellen, damit Lambda Lebenszyklus-Hooks abschließen kann.

So erstellen Sie die Richtlinie
  1. Öffnen Sie in der IAM-Konsole Policies (Richtlinien) und wählen Sie dann Create policy (Richtlinie erstellen) aus.

  2. Wählen Sie den Tab JSON.

  3. Im Kästchen Policy Document fügen Sie das folgende Richtliniendokument in das Feld ein und ersetzen den Text in Kursivschrift mit Ihrer Kontonummer und dem Namen Ihrer Auto-Scaling-Gruppe.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. Wählen Sie Weiter aus.

  5. Geben Sie unter Policy name (Richtlinienname) LogAutoScalingEvent-policy ein. Wählen Sie Richtlinie erstellen aus.

Wenn Sie die Richtlinie fertig erstellt haben, können Sie eine Rolle erstellen, die sie verwendet.

So erstellen Sie die Rolle
  1. Wählen Sie im Navigationsbereich auf der linken Seite Roles (Rollen).

  2. Wählen Sie Rolle erstellen aus.

  3. Wählen Sie für Select trusted entity (Vertrauenswürdige Entität auswählen) die Option AWS -Dienst.

  4. Wählen Sie für Ihren Anwendungsfall Lambda und dann Next (Weiter) aus.

  5. Wählen Sie unter Berechtigungen hinzufügen die Richtlinie aus, die Sie erstellt haben (LogAutoScalingEvent-policy), und die benannte Richtlinie aus. AWSLambdaBasicExecutionRole Wählen Sie anschließend Weiter.

    Anmerkung

    Die AWSLambdaBasicExecutionRoleRichtlinie verfügt über die Berechtigungen, die die Funktion benötigt, um Protokolle in Logs zu CloudWatch schreiben.

  6. Geben Sie auf der Seite Set role name and review (Rollenname festlegen und überprüfen) für Role name (Rollenname) LogAutoScalingEvent-role ein und wählen Sie Create role (Rolle erstellen) aus.

Schritt 2: Erstellen einer Lambda-Funktion

Erstellen Sie eine Lambda-Funktion, die als Ziel für Ereignisse dienen soll. Die in Node.js geschriebene Lambda-Beispielfunktion wird aufgerufen, EventBridge wenn ein entsprechendes Ereignis von Amazon EC2 Auto Scaling ausgelöst wird.

Eine Lambda-Funktion erstellen
  1. Öffnen Sie die Funktions-Seite in der Lambda-Konsole.

  2. Wählen Sie Funktion erstellen und Von Grund auf neu erstellen aus.

  3. Geben Sie unter Basic Information (Grundlegende Informationen) für Function name (Funktionsname) LogAutoScalingEvent ein.

  4. Wählen Sie unter Laufzeit die Option Node.js 18.x aus.

  5. Scrollen Sie nach unten und wählen Sie Ändern der standardmäßigen Ausführungsrolle und dann unter Ausführungsrolle Verwenden einer vorhandenen Rolle aus.

  6. Wählen Sie für Existing role die Option -role aus. LogAutoScalingEvent

  7. Übernehmen Sie im Übrigen die Standardwerte.

  8. Wählen Sie Funktion erstellen. Sie kehren zum Code und zur Konfiguration der Funktion zurück.

  9. Fügen Sie bei geöffneter LogAutoScalingEvent-Funktion in der Konsole unter Code-Quelle im Editor den folgenden Beispielcode in die Datei index.mjs ein.

    import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling"; export const handler = async(event) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new AutoScalingClient({ region: event.region }); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['EC2InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; const command = new CompleteLifecycleActionCommand(params); try { var data = await autoscaling.send(command); console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } catch (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } return response; };

    Dieser Code protokolliert einfach das Ereignis, sodass Sie am Ende dieses Tutorials sehen können, dass ein Ereignis im CloudWatch Log-Log-Stream erscheint, das mit dieser Lambda-Funktion verknüpft ist.

  10. Wählen Sie Bereitstellen.

Schritt 3: Erstellen Sie eine Regel EventBridge

Erstellen Sie eine EventBridge Regel, um Ihre Lambda-Funktion auszuführen. Weitere Hinweise zur Verwendung finden Sie EventBridge unterWird EventBridge zur Behandlung von Auto Scaling Scaling-Ereignissen verwendet.

So erstellen Sie eine Regel mithilfe der Konsole
  1. Öffnen Sie die EventBridge-Konsole.

  2. Wählen Sie im Navigationsbereich Rules aus.

  3. Wählen Sie Regel erstellen aus.

  4. Zum Define rule detail (Festlegen der Regeldetails) gehen Sie folgendermaßen vor:

    1. Geben Sie unter Name LogAutoScalingEvent-rule ein.

    2. Bei Event bus (Ereignisbus) wählen Sie default (Standard) aus. Wenn ein AWS-Service in Ihrem Konto ein Ereignis generiert, wird es immer an den Standard-Event-Bus Ihres Kontos weitergeleitet.

    3. Bei Rule type (Regeltyp) wählen Sie Rule with an event pattern (Regel mit einem Ereignismuster) aus.

    4. Wählen Sie Weiter aus.

  5. Bei Build event pattern (Ereignis-Muster erstellen) gehen Sie wie folgt vor:

    1. Wählen Sie als Eventquelle AWS Events oder EventBridge Partnerevents aus.

    2. Scrollen Sie nach unten zu Ereignis-Muster und gehen Sie wie folgt vor:

      1. Wählen Sie für Ereignisquelle die Option AWS-Services aus.

      2. Für AWS-Service, wählen Sie Auto Scaling aus.

      3. Wählen Sie in Event Type (Ereignistyp) die Option Instance Launch and Terminate (Starten und Beenden von Instances) aus.

      4. Standardmäßig entspricht die Regel jedem Abskalierungs- oder Aufskalierungs-Ereignis. Um eine Regel zu erstellen, die Sie benachrichtigt, wenn ein Aufskalierungs-Ereignis vorliegt und eine Instance aufgrund eines Lebenszyklus-Hook in einen Wartezustand versetzt wird, wählen Sie Specific instance event(s) (Bestimmte Instance-Ereignisse) und wählen Sie EC2 Instance-launch Lifecycle Action (Lebenszyklusaktion beim Start von EC2-Instances) aus.

      5. Standardmäßig stimmt die Regel mit jeder Auto-Scaling-Gruppe in der Region überein. Damit die Regel mit einer bestimmten Auto-Scaling-Gruppe übereinstimmt, wählen Sie Specific group name(s) und wählen Sie dann die Gruppe aus.

      6. Wählen Sie Weiter aus.

  6. Bei Select target(s) (Ziel(e) auswählen) gehen Sie wie folgt vor:

    1. Für Target types (Zieltypen), wählen Sie AWS-Service aus.

    2. Für Select a target (Ein Ziel auswählen), wählen die Option Lambda function (Lambda-Funktion) aus.

    3. Wählen Sie für Funktion die Option LogAutoScalingEvent.

    4. Klicken Sie zweimal auf Weiter.

  7. Wählen Sie auf der Seite Überprüfen und erstellen die Option Regel erstellen aus.

Schritt 4: Hinzufügen eines Lebenszyklus-Hooks

In diesem Abschnitt fügen Sie einen Lebenszyklus-Hook hinzu, damit Lambda Ihre Funktion beim Start auf Instances ausführt.

So fügen Sie einen Lebenszyklus-Hook hinzu
  1. Öffnen Sie die Seite Auto-Scaling-Gruppen in der Amazon-EC2-Konsole.

  2. Aktivieren Sie das Kontrollkästchen neben Ihrer Auto-Scaling-Gruppe. Im unteren Teil der Seite wird ein geteilter Bereich geöffnet.

  3. Wählen Sie im unteren Bereich auf der Registerkarte Instance management (Instance-Verwaltung) unter Lebenszyklus-Hooks die Option Create Lebenszyklus hook (Lebenszyklus-Hook erstellen) aus.

  4. Gehen Sie wie folgt vor, um einen Lebenszyklus-Hook zum Aufskalieren (Start von Instances) zu definieren:

    1. Geben Sie für Lebenszyklus-Hooks den Wert LogAutoScalingEvent-hook ein.

    2. Wählen Sie bei Lifecycle Transition (Lebenszykluswechsel) die Option Instance launch (Instance-Start) aus.

    3. Für Heartbeat-Zeitüberschreitung geben Sie den Wert 300 für die Anzahl an Sekunden ein, um auf einen Rückruf von Ihrer Lambda-Funktion zu warten.

    4. Für Standardergebnis wählen Sie ABBRECHEN aus. Dies bedeutet, dass die Auto-Scaling-Gruppe eine neue Instance beendet, wenn die Zeitüberschreitung des Hook erreicht ist, ohne einen Rückruf von Ihrer Lambda-Funktion erhalten zu haben.

    5. (Optional) Lassen Sie Benachrichtigungs-Metadaten leer. Die Ereignisdaten, an die wir übergeben, EventBridge enthalten alle notwendigen Informationen, um die Lambda-Funktion aufzurufen.

  5. Wählen Sie Erstellen.

Schritt 5: Testen und Prüfen des Ereignisses

Um das Ereignis zu testen, aktualisieren Sie die Auto-Scaling-Gruppe, indem Sie die gewünschte Kapazität der Auto-Scaling-Gruppe um 1 erhöhen. Ihre Lambda-Funktion wird innerhalb weniger Sekunden nach der Erhöhung der gewünschten Kapazität aufgerufen.

So erhöhen Sie die Größe der Auto-Scaling-Gruppe
  1. Öffnen Sie die Seite Auto-Scaling-Gruppen in der Amazon-EC2-Konsole.

  2. Aktivieren Sie das Kontrollkästchen neben der Auto-Scaling-Gruppe, um Details in einem unteren Bereich anzuzeigen und weiterhin die oberen Zeilen des oberen Bereichs anzuzeigen.

  3. Wählen Sie im unteren Bereich auf der Registerkarte Details die Option Gruppendetails, Bearbeiten aus.

  4. Erhöhen Sie für Desired capacity (Gewünschte Kapazität den aktuellen Wert um 1.

  5. Wählen Sie Aktualisieren. Während eine Instance gestartet wird, zeigt die Spalte Status den Status Updating capacity (Kapazität aktualisieren) an.

Nachdem Sie die gewünschte Kapazität erhöht haben, können Sie prüfen, ob die Lambda-Funktion aufgerufen wurde.

Anzeigen der Ausgabe aus der Lambda-Funktion
  1. Öffnen Sie die Seite Protokollgruppen der CloudWatch Konsole.

  2. Wählen Sie den Namen der Protokollgruppe für Ihre Lambda-Funktion aus (/aws/lambda/LogAutoScalingEvent).

  3. Wählen Sie den Namen des Protokoll-Streams aus, um die von der Funktion für die Lebenszyklus-Aktion bereitgestellten Daten anzuzeigen.

Als Nächstes können Sie anhand der Beschreibung der Skalierungsaktivitäten prüfen, ob die Instance erfolgreich gestartet wurde.

Ansehen der Skalierungsaktivität
  1. Wählen Sie auf der Seite Auto-Scaling-Gruppen Ihre Gruppe aus.

  2. Auf der Registerkarte Activity (Aktivität) wird unter Activity history (Aktivitätsverlauf) in der Spalte Status angezeigt, ob Ihre Auto-Scaling-Gruppe Instances erfolgreich gestartet hat.

    • Wenn die Aktion erfolgreich war, hat die Skalierungsaktivität den Status „Erfolgreich“.

    • Wenn es fehlgeschlagen ist, sehen Sie nach einigen Minuten eine Skalierungsaktivität mit dem Status „Abgebrochen“ und die Statusmeldung „Instance konnte nicht abgeschlossen werden: Lebenszyklusaktion des Benutzers: Lebenszyklusaktion mit Token E85EB647-4FE0-4909-B341-A6C42Beispiel wurde abgebrochen: Lebenszyklusaktion mit ABBRUCH-Ergebnis abgeschlossen“.

So verkleinern Sie die Auto-Scaling-Gruppe

Wenn Sie die zusätzliche Instance, die Sie für diesen Test gestartet haben, nicht benötigen, können Sie die Registerkarte Details öffnen und Desired capacity (Gewünschte Kapazität) um 1 reduzieren.

Schritt 6: Bereinigen

Wenn Sie mit den Ressourcen gearbeitet haben, die Sie speziell für dieses Tutorial erstellt haben, führen Sie die folgenden Schritte aus, um sie zu löschen.

So löschen Sie den Lebenszyklus-Hook
  1. Öffnen Sie die Seite Auto-Scaling-Gruppen in der Amazon-EC2-Konsole.

  2. Aktivieren Sie das Kontrollkästchen neben Ihrer Auto-Scaling-Gruppe.

  3. Wählen Sie auf der Registerkarte Instance management (Instance-Verwaltung) unter Lebenszyklus-Hooks den Lebenszyklus (LogAutoScalingEvent-hook) aus.

  4. Wählen Sie Actions (Aktionen), Delete (Löschen) aus.

  5. Um dies zu bestätigen, wählen Sie erneut Delete (Löschen) aus.

Um die EventBridge Amazon-Regel zu löschen
  1. Öffnen Sie die Seite Regeln in der EventBridge Amazon-Konsole.

  2. Wählen Sie in Event bus (Ereignisbus) den Ereignisbus aus, der der Regel zugeordnet ist (Default).

  3. Aktivieren Sie das Kontrollkästchen neben Ihrer Regel (LogAutoScalingEvent-rule).

  4. Wählen Sie Löschen aus.

  5. Wenn Sie zur Bestätigung aufgefordert werden, geben Sie den Namen der Anwendung ein, und wählen Sie dann Delete aus.

Wenn Sie mit der Beispielfunktion fertig sind, löschen Sie sie. Sie können auch die Protokollgruppe löschen, welche die Protokolle der Funktion speichert, sowie die von Ihnen erstellte Ausführungsrolle und Berechtigungsrichtlinie.

So löschen Sie eine Lambda-Funktion
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die Funktion (LogAutoScalingEvent) aus.

  3. Wählen Sie Aktionen, Löschen aus.

  4. Wenn Sie zur Bestätigung aufgefordert werden, geben Siedeleteum die angegebene Funktion zu löschen und wählen Sie dannLöschen.

So löschen Sie die Protokollgruppe
  1. Öffnen Sie die Seite Protokollgruppen der CloudWatch Konsole.

  2. Wählen Sie die Protokollgruppe der Funktion (/aws/lambda/LogAutoScalingEvent).

  3. Wählen Sie Actions (Aktionen), Delete log group(s) (Protokollgruppe(n) löschen) aus.

  4. Wählen Sie im Dialogfeld Delete log group(s) (Protokollgruppe(n) löschen) die Option Delete (Löschen) aus.

So löschen Sie die Ausführungsrolle
  1. Öffnen Sie die Seite Roles (Rollen) in der IAM-Konsole.

  2. Wählen Sie die Rolle der Funktion (LogAutoScalingEvent-role).

  3. Wählen Sie Löschen aus.

  4. Wenn Sie zur Bestätigung aufgefordert werden, geben Sie den Namen der Rolle ein und wählen Sie dann Delete (Löschen).

Löschen der IAM-Richtlinie
  1. Öffnen Sie die Seite Richtlinien in der IAM-Konsole.

  2. Wählen Sie die Richtlinie aus, die Sie erstellt haben (LogAutoScalingEvent-policy).

  3. Wählen Sie Aktionen, Löschen aus.

  4. Wenn Sie zur Bestätigung aufgefordert werden, geben Sie den Namen der Richtlinie ein und wählen Sie dann Delete (Löschen).

Die folgenden verwandten Themen können hilfreich sein, wenn Sie EventBridge Regeln erstellen, die auf Ereignissen basieren, die den Instances in Ihrer Auto Scaling Scaling-Gruppe passieren.

Ein Tutorial, das Ihnen zeigt, wie Sie den Instance Metadata Service (IMDS) verwenden, um eine Aktion innerhalb der Instance selbst aufzurufen, finden Sie unter Tutorial: Verwenden Sie Datenskript- und Instance-Metadaten, um den Lebenszyklusstatus abzurufen.