View a markdown version of this page

Gestalten Sie Ihre Anwendungen so, dass sie das Beenden von Instances problemlos verarbeiten - 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.

Gestalten Sie Ihre Anwendungen so, dass sie das Beenden von Instances problemlos verarbeiten

In diesem Thema werden Funktionen beschrieben, mit denen Sie verhindern können, dass Ihre Amazon EC2 Auto Scaling-Gruppe Amazon EC2-Instances beendet, die noch nicht beendet werden können. Standardmäßig hat Auto Scaling keinen Einblick in die Anwendungen, die auf Ihren Instances ausgeführt werden. Es kann Instances beenden, bevor Ihre Anwendung ordnungsgemäß heruntergefahren oder die ihr zugewiesenen Aufgaben abgeschlossen werden kann. Diese Funktionen geben Ihrer Anwendung Zeit, um laufende Arbeiten abzuschließen, den Status zu übertragen oder vor dem Beenden der Instanz eine Bereinigung durchzuführen. Sie können sie je nach den Anforderungen Ihrer Anwendung einzeln oder in Kombination verwenden.

Diese Funktionen sind besonders nützlich für statusbehaftete Workloads, bei denen jede Instance in Ihrer Flotte andere Daten, Jobs oder Status enthält als andere Instances. Das Beenden von Stateful-Instances ohne ordnungsgemäßes Herunterfahren könnte dazu führen, dass Jobs mit langer Ausführungszeit von Anfang an neu gestartet werden, Datenredundanz oder Datenverlust reduziert und laufende Transaktionen oder Berechnungen unterbrochen werden. Um eine Stateful-Instance ordnungsgemäß herunterzufahren, sollte ihre Arbeitslast entweder abgezogen (Abschluss aller aktuell zugewiesenen Jobs) oder übertragen werden (Verschieben von Jobs, Daten oder Konfiguration auf eine andere aktive Instance).

Beendigungs-Lebenszyklus-Hooks

Ein Terminierungs-Lifecycle-Hook verlängert die Lebensdauer Ihrer Amazon EC2-Instance, die bereits für die Kündigung ausgewählt wurde. Es bietet zusätzliche Zeit, um laufende Arbeiten abzuschließen, die derzeit der Instance zugewiesen sind, oder um den Fortschritt zu speichern und die Arbeit auf eine andere Instance zu übertragen.

Bei vielen Workloads kann ein Lifecycle-Hook für die Kündigung ausreichen, um eine Anwendung auf einer Instance, die für die Kündigung ausgewählt wurde, ordnungsgemäß herunterzufahren. Dies ist ein Best-Effort-Ansatz und kann nicht verwendet werden, um eine Kündigung zu verhindern, wenn eine Aktion im Lebenszyklus der Kündigung abgebrochen wird. Wenn Ihr Workload nur eine geringe Toleranz für Fehlschläge bei Aktionen im Lebenszyklus der Kündigung aufweist, konfigurieren Sie Richtlinien für den Instance-Lebenszyklus in Kombination mit Ihren Hooks für den Kündigungslebenszyklus, um die Instances beizubehalten.

Um einen Hook für den Lebenszyklus der Kündigung verwenden zu können, müssen Sie wissen, wann eine Instance für die Kündigung ausgewählt wird. Sie haben zwei Möglichkeiten, dies herauszufinden:

Option Description Am besten verwendet für Link zur Dokumentation
Innerhalb der Instance Der Instance Metadata Service (IMDS) ist ein sicherer Endpunkt, bei dem Sie direkt von der Instance aus den Status einer Instance abfragen können. Wenn die Metadaten mit Terminated zurückgegeben werden, ist die Beendigung Ihrer Instance geplant. Anwendungen, bei denen Sie eine Aktion auf der Instance ausführen müssen, bevor die Instance beendet wird. Ruft den Zielstatus des Lebenszyklus ab
Außerhalb der Instance Wenn eine Instance beendet wird, wird eine Ereignisbenachrichtigung generiert. Sie können Regeln mithilfe von Amazon EventBridge, Amazon SQS, Amazon SNS oder AWS Lambda zur Erfassung dieser Ereignisse erstellen und eine Antwort aufrufen, z. B. mit einer Lambda-Funktion. Anwendungen, die außerhalb der Instance Aktionen durchführen müssen. Konfigurieren Sie ein Benachrichtigungsziel

Um einen Lebenszyklus-Hook verwenden zu können, müssen Sie auch wissen, wann eine Instance für die vollständige Beendigung bereit ist. Amazon EC2 Auto Scaling beendet die Instance erst, wenn sie einen CompleteLifecycleAction API-Aufruf erhält oder das Timeout abgelaufen ist, je nachdem, was zuerst eintritt.

Standardmäßig kann eine Instance aufgrund eines Beendigungs-Lebenszyklus-Hook eine Stunde lang weiterlaufen (Heartbeat-Timeout). Sie können den standardmäßigen Timeout konfigurieren, falls eine Stunde nicht ausreicht, um die Lebenszyklus-Aktion abzuschließen. Wenn eine Lifecycle-Aktion im Gange ist, können Sie das Timeout mit API-Aufrufen verlängern. RecordLifecycleActionHeartbeat

Weitere Informationen finden Sie unter Lebenszyklus-Hooks bei Amazon EC2 Auto Scaling.

Instance-Abskalierungsschutz

Sie können den Instance Scale-In Protection verwenden, um zu steuern, welche Instances bei Scale-In-Ereignissen für die Beendigung ausgewählt werden, insbesondere um zu verhindern, dass eine Instance, die aktiv einen Job mit langer Laufzeit verarbeitet, beendet wird. Wenn beispielsweise containerisierte Workloads ausgeführt werden, ist es üblich, alle Instances zu schützen und den Schutz nur für Instances ohne aktuelle oder geplante Aufgaben zu entfernen. Instanzen können die Suche nach neuen Aufträgen fortsetzen und den Schutz erneut aktivieren, wenn neue Jobs zugewiesen werden.

Sie können den Scale-In-Schutz auf Auto Scaling-Gruppen- und Instanzebene aktivieren. Wenn Sie den Scale-In-Schutz auf Auto Scaling-Gruppenebene aktivieren, werden nur neue Instanzen geschützt, wenn sie erstellt werden. Für bestehende Instances können Sie den Schutz einzeln aktivieren.

Anwendungen können den Schutz entweder von den Instanzen selbst oder von einer zentralen Steuerungsebene aus einrichten, die festlegt, ob jede Instanz beendet werden kann. Wir empfehlen den zentralisierten Ansatz für große Flotten oder wenn der Schutz häufig umgeschaltet werden muss, da Sie so stapelweise Aufrufe durchführen SetInstanceProtection und Probleme mit der API-Drosselung vermeiden können.

Weitere Informationen finden Sie unter Verwenden Sie den Instance Scale-In-Schutz, um die Beendigung von Instances zu kontrollieren.

Benutzerdefinierte Beendigungsrichtlinie

Wie beim Instance Scale-In-Schutz hilft Ihnen eine benutzerdefinierte Kündigungsrichtlinie dabei, zu verhindern, dass Ihre Amazon EC2 Auto Scaling-Gruppe bestimmte EC2-Instances beendet. Fehlerhafte Instances können unabhängig von Ihrer benutzerdefinierten Kündigungsrichtlinie immer noch beendet werden.

Ihre Auto Scaling-Gruppe verwendet eine Standard-Kündigungsrichtlinie, um zu bestimmen, welche Amazon EC2-Instances zuerst beendet werden. Wenn Sie mehr Kontrolle darüber haben möchten, welche Instances zuerst beendet werden, können Sie mithilfe einer Lambda-Funktion eine benutzerdefinierte Kündigungsrichtlinie implementieren. Auto Scaling ruft diese Funktion immer dann auf, wenn eine Instanz zum Beenden ausgewählt werden muss, und beendet nur Instances, die von der Funktion zurückgegeben werden. Wenn bei der Funktion ein Fehler auftritt, ein Timeout auftritt oder eine leere Liste zurückgegeben wird, beendet Auto Scaling keine Instances, es sei denn, die Instance ist fehlerhaft.

Eine benutzerdefinierte Kündigungsrichtlinie ist nützlich, wenn Ihre Anwendung erkennen kann, welche Instances inaktiv sind oder gefahrlos beendet werden können. Dies erfordert in der Regel eine Steuerungsebene, die die Arbeitslast in der gesamten Gruppe verfolgt.

Weitere Informationen finden Sie unter Eine benutzerdefinierte Beendigungsrichtlinie mit Lambda erstellen.

Richtlinie zum Lebenszyklus einer Instanz

Richtlinien für den Instanzlebenszyklus bieten Schutz vor Amazon EC2 Auto Scaling-Terminierungen, wenn eine Aktion im Lebenszyklus der Beendigung abgebrochen wird. Im Gegensatz zu Lifecycle-Hooks allein sind die Richtlinien für den Instance-Lebenszyklus so konzipiert, dass sie sicherstellen, dass Instances in den Zustand „Beibehaltung“ übergehen, wenn das ordnungsgemäße Herunterfahren nicht erfolgreich abgeschlossen wird.

Wenn Auto Scaling eine Instance zur Kündigung auswählt, werden Ihre konfigurierten Hooks für den Lebenszyklus der Kündigung aufgerufen und Ihre Anwendung beginnt mit dem ordnungsgemäßen Herunterfahren. Wenn die Aktionen des Terminierungslebenszyklus mit erfolgreich abgeschlossen werdenCONTINUE, wird die Instance normal beendet. Wenn jedoch eine Aktion im Lebenszyklus der Kündigung aus irgendeinem Grund abgebrochen wird, versetzt die Richtlinie für den Instance-Lebenszyklus die Instance in den Status „Beibehalten“, anstatt sie zu beenden. Beibehaltene Instances werden nicht auf die gewünschte Kapazität Ihrer Auto Scaling-Gruppe angerechnet, sodass Ersatz-Instances automatisch gestartet werden. Es fallen Amazon EC2-Standardgebühren sowohl für die zurückgehaltene Instance als auch für deren Ersatz an, bis Sie die zurückgehaltene Instance mithilfe der TerminateInstanceInAutoScalingGroup API manuell beenden.

Um diese Funktion nutzen zu können, müssen Sie sowohl eine Instance Lifecycle-Policy, bei der der TerminateHookAbandon Aufbewahrungs-Trigger auf eingestellt istretain, als auch mindestens einen Terminierungs-Lifecycle-Hook konfigurieren. Da für verwaltete Instances fortlaufende Amazon EC2-Kosten anfallen und manuelle Maßnahmen erforderlich sind, ist die Überwachung von entscheidender Bedeutung. Sie sollten CloudWatch Metriken wie aktivieren GroupTerminatingRetainedInstances und CloudWatch Alarme erstellen, um Sie zu benachrichtigen, wenn Instances in den Status „Beibehalten“ übergehen.

Weitere Informationen finden Sie unter Steuern Sie die Aufbewahrung von Instances mithilfe von Richtlinien für den Instance-Lebenszyklus.

Setzen Sie Kündigungen vollständig aus

Wenn Sie die vollständige Kontrolle über alle EC2-Instance-Terminierungen innerhalb Ihrer Amazon EC2 Auto Scaling-Gruppe benötigen, setzen Sie den Vorgang aus. Terminate Wir empfehlen, diese Option nur zu verwenden, wenn Ihnen die oben genannten Optionen nicht die Kontrolle bieten, die Sie für Ihren Service benötigen. Indem Sie den Vorgang aufrufen, SuspendProcesses um den Terminate Prozess zu unterbrechen, verhindern Sie, dass Auto Scaling versucht, ihn aus irgendeinem Grund zu beenden, mit Ausnahme solcher, die durch eine Benutzeranfrage an die TerminateInstanceInAutoScalingGroup API initiiert wurden.

Weitere Informationen finden Sie unter Amazon EC2 Auto Scaling-Prozesse aussetzen und wieder aufnehmen.

Einschränkungen

Wichtig

Beachten Sie die folgenden Einschränkungen, wenn Sie Ihre Anwendung auf Amazon EC2 Auto Scaling so gestalten, dass Instance-Beenden problemlos verarbeitet werden.

Ungesunde Instances umgehen einige Schutzmaßnahmen

Wenn eine Instance fehlerhaft ist, beginnt Amazon EC2 Auto Scaling, sie zu beenden, auch wenn Sie benutzerdefinierte Kündigungsrichtlinien oder einen Scale-In-Schutz eingerichtet haben. Die einzige Möglichkeit, den Ersatz fehlerhafter Instances durch Auto Scaling zu verhindern, besteht darin, den Prozess,, oder auszusetzen. HealthCheck ReplaceUnhealthy Terminate Sie können Lifecycle-Hooks und eine Instance Lifecycle-Policy verwenden, um zu ermöglichen, dass die Anwendung ordnungsgemäß heruntergefahren wird, oder Sie können alle Daten kopieren, die Sie wiederherstellen müssen, bevor die instabile Instance beendet wird.

Feature Steuert fehlerfreie Instanzen Steuert fehlerhafte Instanzen
Benutzerdefinierte Kündigungsrichtlinien Ja Nein
Scale-in Schutz Ja Nein
HealthCheckReplaceUnhealthyAussetzen oder Terminate verarbeiten Ja Ja
Lebenszyklus-Hooks Ja Ja
Richtlinie zum Lebenszyklus einer Instanz Ja Ja

Lifecycle-Hooks allein garantieren kein ordnungsgemäßes Herunterfahren

Standardmäßig werden die Hooks für den Lebenszyklus der Kündigung nach bestem Wissen und Gewissen ausgeführt. Wenn eine Aktion im Lebenszyklus der Beendigung abgebrochen wird, fährt Amazon EC2 Auto Scaling mit der sofortigen Beendigung der Instance fort. Sie können Hooks für den Terminierungslebenszyklus mit einer Richtlinie für den Instance-Lebenszyklus kombinieren, um Instances beizubehalten, wenn Aktionen im Kündigungslebenszyklus abgebrochen werden. Mit dieser Kombination:

  • Ihre Hooks für den Lebenszyklus der Kündigung versuchen, Ihre Anwendung ordnungsgemäß herunterzufahren, nachdem Auto Scaling eine Instance-Beendigung auslöst und das Draining von allen konfigurierten Elastic Load Balancing-Load Balancing-Load Balancing-Load Balancing-Load Balancing-Geräten abgeschlossen ist.

  • Wenn eine Aktion im Lebenszyklus der Kündigung aus irgendeinem Grund abgebrochen wird, wechselt die Instance in den Status „Beibehalten“, anstatt beendet zu werden.

  • Die beibehaltene Instance verbleibt in ihrem aktuellen Amazon EC2-Status, sodass Sie Ihre Shutdown-Verfahren manuell abschließen oder den Fehler untersuchen können.

  • Sie können die zurückgehaltenen Instances manuell beenden, indem Sie die TerminateInstanceInAutoScalingGroup API aufrufen, nachdem Sie die erforderlichen Aktionen abgeschlossen haben.

Weitere Informationen finden Sie unter Steuern Sie die Aufbewahrung von Instances mithilfe von Richtlinien für den Instance-Lebenszyklus.

Bestimmte Instance-Marktoptionen können mit begrenzter Vorankündigung unterbrochen werden

Wenn Sie Instance-Market-Optionen wie Spot-Instances und unterbrechbare Kapazitätsreservierungen in Ihrer Auto Scaling-Gruppe verwenden, kann Amazon EC2 Ihre Instances jederzeit unterbrechen und zurückfordern. Diese Unterbrechungen umgehen alle Amazon EC2 Auto Scaling-Schutzmechanismen, einschließlich:

  • Beendigungs-Lebenszyklus-Hooks

  • Instance-Abskalierungsschutz

  • Benutzerdefinierte Kündigungsrichtlinien

  • Richtlinien für den Lebenszyklus einer Instanz

  • Unterbrochene Prozesse

Wenn eine Spot-Instance eine Benachrichtigung über eine Unterbrechung erhält, haben Sie etwa zwei Minuten Zeit, um das ordnungsgemäße Herunterfahren durchzuführen. Sie können zwar Lifecycle-Hooks zur Kündigung verwenden, um auf Spot-Instance-Unterbrechungen zu reagieren, aber die Instance wird am Ende des Zwei-Minuten-Fensters zwangsweise beendet, auch wenn der Lifecycle-Hook noch läuft. Richtlinien für den Instance-Lebenszyklus können Spot-Instance-Unterbrechungen ebenfalls nicht verhindern.

Weitere Informationen zum Umgang mit Spot-Instance-Unterbrechungen finden Sie unter Spot-Instance-Unterbrechungen und bewährte Methoden für Amazon EC2 Spot im Amazon EC2-Benutzerhandbuch.

Direkte Amazon EC2-Kündigungen umgehen alle Schutzmaßnahmen

Wenn Sie eine Instance in Ihrer Auto Scaling-Gruppe direkt mit der Amazon TerminateInstances EC2-API beenden, werden bei der Kündigung alle Amazon EC2 Auto Scaling-Schutzmechanismen umgangen.

Verwenden Sie stattdessen die API, um Instances in Ihrer Auto Scaling-Gruppe zu beenden und dabei Ihre konfigurierten Schutzmaßnahmen zu beachten. TerminateInstanceInAutoScalingGroup

Beispielszenarien

Wenn Sie Amazon EC2 Auto Scaling verwenden, können Sie wählen, wie viel Flottenmanagement Auto Scaling in Ihrem Namen übernimmt und wie viel direkte Kontrolle Sie über Entscheidungen zur Kündigung von EC2-Instances behalten. Je empfindlicher Ihr Workload auf Instance-Kündigungen reagiert, desto mehr Kontrolle möchten Sie möglicherweise behalten. Die folgenden Beispiele beschreiben Workloads mit unterschiedlichen Toleranzstufen und die empfohlenen Konfigurationen:

Beispiel 1: Verteilte Datenbankknoten (niedrige Toleranz)

Sie führen eine verteilte Datenbank aus, in der jede EC2-Instance eine Partition Ihrer Daten mit einem Replikationsfaktor von 3 enthält. Der Verlust mehrerer Instanzen, die Replikate derselben Partition enthalten, kann zu Datenverlust führen oder dazu führen, dass diese Partition nicht mehr verfügbar ist.

Herausforderung: Auto Scaling beendet Instances möglicherweise schneller, als Daten erneut auf andere Knoten repliziert werden können, und bei Terminierungen sinkt Ihre Kapazität möglicherweise unter das, was zur Aufrechterhaltung Ihres Replikationsfaktors erforderlich ist.

Ziehen Sie die folgenden Konfigurationen in Betracht:

  • Aktivieren Sie den Instance Scale-In-Schutz auf allen Datenbank-Instances; entfernen Sie ihn programmgesteuert erst, nachdem Sie bestätigt haben, dass die Daten sicher an anderer Stelle repliziert werden.

  • Konfigurieren Sie Terminierungs-Lifecycle-Hooks mit verlängerten Timeouts in Kombination mit einer Instance Lifecycle-Policy, um den Abschluss der Datenübertragung zu ermöglichen.

  • Richten Sie eine Richtlinie zur Instance-Wartung ein, bei der ein Mindestinstanzprozentsatz von 100% eingehalten wird, um die erforderliche Kapazität aufrechtzuerhalten.

Beispiel 2: Long-running Auftragsverarbeitung (Mittlere Toleranz)

Sie haben eine Amazon SQS-Warteschlange, die eingehende Nachrichten für Aufträge mit langer Laufzeit sammelt. Wenn eine neue Nachricht eingeht, ruft eine EC2-Instance die Nachricht ab und startet einen Job, dessen Verarbeitung 3 Stunden dauert. Wenn die Warteschlange wächst, fügt Auto Scaling Instances hinzu, die auf Ihren Skalierungsrichtlinien basieren. Wenn die Warteschlange kleiner wird, beendet Auto Scaling die Instances.

Herausforderung: Auto Scaling beendet möglicherweise eine Instance, die 3 Stunden nach der Verarbeitung eines Jobs hinter sich hat, und nicht eine Instance im Leerlauf. Der Job kann auf einer anderen Instance neu gestartet werden, aber Sie verlieren erhebliche Fortschritte.

Ziehen Sie die folgenden Konfigurationen in Betracht:

  • Konfigurieren Sie eine benutzerdefinierte Kündigungsrichtlinie, die dem Beenden inaktiver Instances zuerst Priorität einräumt.

  • Verwenden Sie Hooks für den Lebenszyklus der Kündigung, damit gerade ausgeführte Jobs abgeschlossen werden können.

  • Aktivieren Sie den Instance Scale-In-Schutz programmgesteuert, wenn eine Instance einen Job startet, und entfernen Sie ihn, wenn der Job abgeschlossen ist.

Beispiel 3: Personalflotte für Testumgebungen (hohe Toleranz)

Sie führen eine Flotte von EC2-Instances aus, die automatisierte Tests, CI/CD Pipeline-Jobs oder Entwicklungsworkloads ausführen. Diese Worker-Instances rufen Aufgaben aus einer Warteschlange ab, und die Testergebnisse können neu generiert werden, wenn ein Job fehlschlägt.

Herausforderung: Testjobs können bei Scale-In-Ereignissen unterbrochen werden. Da Tests jedoch ohne Auswirkungen wiederholt werden können, sollten Sie die Optimierung im Hinblick auf Kosten und Einfachheit und nicht auf eine unterbrechungsfreie Verfügbarkeit vornehmen.

Ziehen Sie die folgenden Konfigurationen in Betracht:

  • Verwenden Sie Hooks für den Kündigungszyklus, damit Anfragen während des Fluges abgeschlossen werden können.

  • Erwägen Sie den Einsatz von Spot-Instances mit einer kapazitätsoptimierten Zuweisungsstrategie, um die Kosten weiter zu senken.