Eine benutzerdefinierte Beendigungsrichtlinie mit Lambda erstellen - 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.

Eine benutzerdefinierte Beendigungsrichtlinie mit Lambda erstellen

Amazon EC2 Auto Scaling verwendet Kündigungsrichtlinien, um zu priorisieren, welche Instances zuerst beendet werden sollen, wenn Sie die Größe Ihrer Auto Scaling Scaling-Gruppe verringern (als Scaling In bezeichnet). Ihre Auto-Scaling-Gruppe verwendet eine Standard-Beendigungsrichtlinie, Sie können jedoch optional eigene Beendigungsrichtlinien auswählen oder erstellen. Weitere Informationen zur Auswahl einer vordefinierten Beendigungsrichtlinie finden Sie unter Kündigungsrichtlinien für Amazon EC2 Auto Scaling konfigurieren.

In diesem Thema erfahren Sie, wie Sie mithilfe einer AWS Lambda Funktion, die Amazon EC2 Auto Scaling als Reaktion auf bestimmte Ereignisse aufruft, eine benutzerdefinierte Kündigungsrichtlinie erstellen. Die Lambda-Funktion, die Sie erstellen, verarbeitet die Informationen in den von Amazon EC2 Auto Scaling gesendeten Eingabedaten und gibt eine Liste der Instances zurück, die zum Beenden bereit sind.

Eine benutzerdefinierte Beendigungsrichtlinie bietet eine bessere Kontrolle darüber, welche Instances wann beendet werden. Wenn Ihre Auto Scaling-Gruppe beispielsweise skaliert, kann Amazon EC2 Auto Scaling nicht feststellen, ob Workloads ausgeführt werden, die nicht unterbrochen werden sollten. Mit einer Lambda-Funktion können Sie die Kündigungsanforderung validieren und warten, bis die Arbeitslast abgeschlossen ist, bevor Sie die Instance-ID zur Kündigung an Amazon EC2 Auto Scaling zurücksenden.

Eingabedaten

Amazon EC2 Auto Scaling generiert eine JSON Nutzlast zur Skalierung von Ereignissen und tut dies auch, wenn Instances aufgrund der maximalen Instance-Lebensdauer oder der Instance-Aktualisierungsfunktionen kurz vor der Beendigung stehen. Es generiert auch eine JSON Nutzlast für die Skalierung von Ereignissen, die es auslösen kann, wenn Ihre Gruppe zwischen Availability Zones neu verteilt wird.

Diese Payload enthält Informationen über die Kapazität, die Amazon EC2 Auto Scaling zum Beenden benötigt, eine Liste von Instances, die zur Kündigung vorgeschlagen werden, und das Ereignis, das die Kündigung ausgelöst hat.

Es folgt ein Beispiel einer Nutzlast:

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

Die Payload umfasst den Namen der Auto Scaling Scaling-Gruppe, ihren Amazon-Ressourcennamen (ARN) und die folgenden Elemente:

  • CapacityToTerminate beschreibt, wie viel Ihrer Spot- oder On-Demand-Kapazität in einer bestimmten Availability Zone beendet wird.

  • Instancesstellt die Instances dar, die Amazon EC2 Auto Scaling auf der Grundlage der darin enthaltenen Informationen zur Kündigung vorschlägtCapacityToTerminate.

  • Cause beschreibt das Ereignis, das die Beendigung ausgelöst hat: SCALE_IN, INSTANCE_REFRESH, MAX_INSTANCE_LIFETIME oder REBALANCE.

In den folgenden Informationen werden die wichtigsten Faktoren beschrieben, die dazu beitragen, wie Amazon EC2 Auto Scaling die Instances in den Eingabedaten generiert:

  • Die Aufrechterhaltung des Gleichgewichts zwischen den Availability Zones hat Vorrang, wenn eine Instance aufgrund einer Vielzahl von Ereignissen und aufgrund von Instance-Aktualisierungen beendet wird. Wenn daher eine Availability Zone über mehr Instances verfügt als die anderen Availability Zones, die von der Gruppe verwendet werden, umfassen die Eingabedaten nur Instances zur Beendigung, die aus der unausgewogenen Availability Zone stammen. Wenn die von der Gruppe verwendeten Availability Zones ausgeglichen sind, enthalten die Eingabedaten Instances aus allen Availability Zones der Gruppe.

  • Wenn Sie eine Richtlinie für gemischte Instances verwenden, hat die Aufrechterhaltung Ihrer Spot- und On-Demand-Kapazitäten auf der Grundlage Ihrer gewünschten Prozentsätze für jede Kaufoption ebenfalls Vorrang. Wir identifizieren zunächst, welcher der beiden Typen (Spot oder On-Demand) beendet werden soll. Außerdem ermitteln wir dann, welche Instances (innerhalb der identifizierten Kaufoption) in welchen Availability Zones beendet werden sollen, was dazu führt, dass die Availability Zones am stärksten ausgeglichen sind.

Antwortdaten

Die Eingabedaten und Antwortdaten arbeiten zusammen, um die Liste der zu beendenden Instances einzugrenzen.

Mit der angegebenen Eingabe sollte die Antwort Ihrer Lambda-Funktion wie im folgenden Beispiel aussehen:

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

Die InstanceIDs in der Antwort stellen die Instances dar, die zum Beenden bereit sind.

Alternativ können Sie einen anderen Satz von Instances zurückgeben, die zum Beenden bereit sind, wodurch die Instances in den Eingabedaten außer Kraft gesetzt werden. Wenn beim Aufruf Ihrer Lambda-Funktion keine Instances beendet werden können, können Sie auch keine Instances zurückgeben.

Wenn keine Instances zum Beenden bereit sind, sollte die Antwort Ihrer Lambda-Funktion wie im folgenden Beispiel aussehen:

{ "InstanceIDs": [ ] }

Überlegungen

Beachten Sie die folgenden Überlegungen bei der Verwendung einer benutzerdefinierten Beendigungsrichtlinie:

  • Wenn Sie eine Instance zuerst in den Antwortdaten zurückgeben, wird die Beendigung nicht garantiert. Wenn mehr als die erforderliche Anzahl von Instances zurückgegeben wird, wenn Ihre Lambda-Funktion aufgerufen wird, bewertet Amazon EC2 Auto Scaling jede Instance anhand der anderen Kündigungsrichtlinien, die Sie für Ihre Auto Scaling Scaling-Gruppe angegeben haben. Wenn mehrere Beendigungsrichtlinien vorhanden sind, wird versucht, die nächste Beendigungsrichtlinie in der Liste anzuwenden. Wenn mehr Instances vorhanden sind, als zum Beenden erforderlich sind, wird die nächste Beendigungsrichtlinie fortgesetzt usw. Wenn keine anderen Beendigungsrichtlinien angegeben sind, wird die Standardbeendigungsrichtlinie verwendet, um zu bestimmen, welche Instances beendet werden sollen.

  • Wenn keine Instances zurückgegeben werden oder bei Ihrer Lambda-Funktion ein Timeout auftritt, wartet Amazon EC2 Auto Scaling eine kurze Zeit, bevor Ihre Funktion erneut aufgerufen wird. Bei jeder Skalierung wird der Versuch fortgesetzt, solange die gewünschte Kapazität der Gruppe geringer ist als die aktuelle Kapazität. Zum Beispiel versucht es bei Instance-Aktualisierungsbasierten Beendigungen eine Stunde lang. Wenn danach weiterhin Instances nicht beendet werden, schlägt der Instance-Aktualisierungsvorgang fehl. Bei maximaler Instance-Lebensdauer versucht Amazon EC2 Auto Scaling weiterhin, die Instance zu beenden, bei der festgestellt wurde, dass sie ihre maximale Lebensdauer überschritten hat.

  • Da Ihre Funktion wiederholt erneut versucht wird, stellen Sie sicher, dass Sie permanente Fehler im Code testen und beheben, bevor Sie eine Lambda-Funktion als benutzerdefinierte Beendigungsrichtlinie verwenden.

  • Wenn Sie die Eingabedaten mit Ihrer eigenen Liste der zu beendenden Instances überschreiben und das Beenden dieser Instances die Availability Zones aus dem Gleichgewicht bringt, gleicht Amazon EC2 Auto Scaling die Kapazitätsverteilung zwischen den Availability Zones schrittweise aus. Zuerst ruft es Ihre Lambda-Funktion auf, um zu sehen, ob es Instances gibt, die beendet werden können, damit sie bestimmen kann, ob mit dem Neuausgleich begonnen werden soll. Wenn Instances vorhanden sind, die beendet werden können, werden zuerst neue Instances gestartet. Wenn der Start der Instances abgeschlossen ist, wird erkannt, dass die aktuelle Kapazität Ihrer Gruppe höher als die gewünschte Kapazität ist, und leitet bei Bedarf eine Skalierung ein.

  • Eine benutzerdefinierte Kündigungsrichtlinie hat keinen Einfluss auf Ihre Fähigkeit, auch Scale in Protection zu verwenden, um bestimmte Instances vor der Kündigung zu schützen. Weitere Informationen finden Sie unter Verwenden Sie den Instance Scale-In Protection, um die Instanzbeendigung zu kontrollieren.

So erstellen Sie die Lambda-Funktion:

Erstellen Sie zunächst die Lambda-Funktion, sodass Sie ihren Amazon-Ressourcennamen (ARN) in den Kündigungsrichtlinien für Ihre Auto Scaling Scaling-Gruppe angeben können.

Erstellen einer Lambda-Funktion (Konsole)
  1. Öffnen Sie die Funktions-Seite in der Lambda-Konsole.

  2. Wählen Sie in der Navigationsleiste oben dieselbe Region aus, die Sie beim Erstellen der Auto-Scaling-Gruppe verwendet haben.

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

  4. Geben Sie unter Basic information (Grundlegende Informationen) bei Function name (Funktionsname) den Namen für Ihre Funktion ein.

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

  6. Wenn Ihre Funktion noch in der Konsole geöffnet ist, fügen Sie unter Funktionscode Ihren Code in den Editor ein.

  7. Wählen Sie Bereitstellen.

  8. Optional können Sie eine veröffentlichte Version der Lambda-Funktion erstellen, indem Sie die Registerkarte Versionen und dann Eine neue Version veröffentlichen auswählen. Weitere Informationen zur Versionierung in Lambda finden Sie unterVersionen der Lambda-Funktion im AWS Lambda -Entwicklerhandbuch.

  9. Wenn Sie eine Version veröffentlichen möchten, wählen Sie die Registerkarte Aliasnamen aus, wenn Sie einen Alias mit dieser Version der Lambda-Funktion verbinden möchten. Weitere Informationen zu Aliassen in Lambda finden Sie unter Versionen der Lambda-Funktion im AWS Lambda -Entwicklerhandbuch.

  10. Wählen Sie als Nächstes die Registerkarte Konfiguration und dann Berechtigungen aus.

  11. Scrollen Sie nach unten bis zu Ressourcenbasierte Richtlinie und wählen Sie dann Hinzufügen von Berechtigungen aus. Eine ressourcenbasierte Richtlinie wird verwendet, um dem Prinzipal, der in der Richtlinie angegeben ist, Berechtigungen zum Aufrufen Ihrer Funktion zu erteilen. In diesem Fall ist der Principal die serviceverknüpfte Amazon EC2 Auto Scaling Scaling-Rolle, die der Auto Scaling Scaling-Gruppe zugeordnet ist.

  12. In der Richtlinienanweisung konfigurieren Sie Ihre Berechtigungen:

    1. Wählen Sie AWS-Konto.

    2. Geben Sie für Principal die Rolle ARN der anrufenden serviceverknüpften Rolle ein, zum Beispiel. arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling

    3. Wählen Sie für Aktion die Option lambda: aus. InvokeFunction

    4. Für Anweisungs-ID geben Sie eine eindeutige Anweisungs-ID ein, wie z. B. AllowInvokeByAutoScaling.

    5. Wählen Sie Save (Speichern) aus.

  13. Nachdem Sie diese Anweisungen befolgt haben, geben Sie als nächsten Schritt Ihre Funktion in den Kündigungsrichtlinien für Ihre Auto Scaling Scaling-Gruppe an. ARN Weitere Informationen finden Sie unter Ändern Sie die Kündigungsrichtlinie für eine Auto Scaling Scaling-Gruppe.

Anmerkung

Beispiele, die Sie als Referenz für die Entwicklung Ihrer Lambda-Funktion verwenden können, finden Sie im GitHub Repository für Amazon EC2 Auto Scaling.

Einschränkungen

  • Sie können nur eine Lambda-Funktion in den Beendigungsrichtlinien für eine Auto-Scaling-Gruppe angeben. Wenn mehrere Beendigungsrichtlinien angegeben sind, muss zuerst die Lambda-Funktion angegeben werden.

  • Sie können auf Ihre Lambda-Funktion verweisen, indem Sie entweder ein unqualifiziertes ARN (ohne Suffix) oder ein qualifiziertes Objekt verwendenARN, das entweder eine Version oder einen Alias als Suffix hat. Wenn eine unqualifizierte Option verwendet ARN wird (z. B.function:my-function), muss Ihre ressourcenbasierte Richtlinie für die unveröffentlichte Version Ihrer Funktion erstellt werden. Wenn eine qualifizierte Option verwendet ARN wird (z. B. function:my-function:1 oderfunction:my-function:prod), muss Ihre ressourcenbasierte Richtlinie für diese spezifische veröffentlichte Version Ihrer Funktion erstellt werden.

  • Sie können kein qualifiziertes Wort ARN mit dem Suffix verwenden. $LATEST Wenn Sie versuchen, eine benutzerdefinierte Kündigungsrichtlinie hinzuzufügen, die sich auf ein ARN mit dem $LATEST Suffix qualifiziertes Objekt bezieht, wird ein Fehler ausgegeben.

  • Die Anzahl der in den Eingabedaten angegebenen Instances ist auf 30.000 Instances begrenzt. Wenn es mehr als 30.000 Instances gibt, die beendet werden könnten, nehmen die Eingabedaten "HasMoreInstances": true auf, umanzugehen, dass die maximale Anzahl von Instances zurückgegeben wird.

  • Die maximale Laufzeit für Ihre Lambda-Funktion beträgt zwei Sekunden (2.000 Millisekunden). Als bewährte Methode sollten Sie den Zeitüberschreitungswert Ihrer Lambda-Funktion auf der Grundlage Ihrer erwarteten Laufzeit festlegen. Lambda-Funktionen haben eine Standard-Zeitüberschreitung von drei Sekunden, dies kann jedoch verringert werden.

  • Wenn Ihre Laufzeit das 2-Sekunden-Limit überschreitet, wird jede aktive Skala so lange in der Warteschleife gehalten, bis die Laufzeit unter diesen Schwellenwert fällt. Suchen Sie für Lambda-Funktionen mit durchweg längeren Laufzeiten nach einer Möglichkeit, die Laufzeit zu reduzieren, z. B. indem Sie die Ergebnisse zwischenspeichern, sodass sie bei nachfolgenden Lambda-Aufrufen abgerufen werden können.