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 Beendigungsrichtlinien, um zu priorisieren, welche Instances zuerst beendet werden sollen, wenn die Größe Ihrer Auto-Scaling-Gruppe verringert (abskaliert) wird. 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 Konfigurieren Sie die Kündigungsrichtlinien für Amazon EC2 Auto Scaling.
In diesem Thema erfahren Sie, wie Sie eine benutzerdefinierte Beendigungsrichtlinie mithilfe einer AWS Lambda -Funktion erstellen, die Amazon EC2 Auto Scaling als Reaktion auf bestimmte Ereignisse aufruft. Die von Ihnen erstellte Lambda-Funktion verarbeitet die Informationen in den Eingabedaten, die von Amazon EC2 Auto Scaling gesendet werden, und gibt eine Liste von Instances zurück, die zum Beenden bereit sind.
Eine benutzerdefinierte Beendigungsrichtlinie bietet eine bessere Kontrolle darüber, welche Instances wann beendet werden. Wenn beispielsweise Ihre Auto-Scaling-Gruppe abskaliert, kann Amazon EC2 Auto Scaling nicht ermitteln, ob Workloads ausgeführt werden, die nicht unterbrochen werden sollten. Mit einer Lambda-Funktion können Sie die Beendigungsanforderung validieren und warten, bis der Workload abgeschlossen ist, bevor Sie die Instance-ID zur Beendigung an Amazon EC2 Auto Scaling zurückgeben.
Eingabedaten
Amazon EC2 Auto Scaling generiert eine JSON-Nutzlast für die Skalierung in Ereignissen und tut dies auch, wenn Instances aufgrund der maximalen Instance-Lebensdauer oder der Funktionen zur Instance-Aktualisierung kurz davor stehen, beendet zu werden. Außerdem generiert es eine JSON-Nutzlast für die Skalierung in Ereignissen, die es bei der Neuverteilung Ihrer Gruppe auf mehrere Availability Zones auslösen kann.
Diese Nutzlast enthält Informationen über die Kapazität, die Amazon EC2 Auto Scaling beendet werden muss, eine Liste der Instances, die es für die Beendigung vorschlägt, und das Ereignis, das die Beendigung 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 Nutzlast enthält den Namen der Auto-Scaling-Gruppe, ihren Amazon-Ressourcennamen (ARN) und die folgenden Elemente:
-
CapacityToTerminatebeschreibt, wie viel von Ihrem Spot oder Ihrer On-Demand Kapazität in einer bestimmten Availability Zone eingestellt werden soll. -
Instancesstellt die Instances dar, die Amazon EC2 Auto Scaling basierend auf den Informationen inCapacityToTerminatevorschlägt. -
Causebeschreibt das Ereignis, das die Beendigung ausgelöst hat:,SCALE_ININSTANCE_REFRESH,MAX_INSTANCE_LIFETIMEoderREBALANCE.
In den folgenden Informationen werden die wichtigsten Faktoren erläutert, wie Amazon EC2 Auto Scaling die InstancesIn den Eingabedaten generiert:
-
Die Aufrechterhaltung des Gleichgewichts zwischen den Availability Zones hat Vorrang, wenn eine Instance aufgrund einer zunehmenden Anzahl von Ereignissen und aufgrund einer Instance-Aktualisierung 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 des Gleichgewichts zwischen Spot und On-Demand Kapazitäten auf der Grundlage der von Ihnen gewünschten Prozentsätze für jede Kaufoption ebenfalls Vorrang. Zunächst ermitteln wir, welcher der beiden Typen (Spot oder On-Demand) gekündigt 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 beim Aufruf Ihrer Lambda-Funktion mehr als die erforderliche Anzahl von Instances zurückgegeben wird, wertet Amazon EC2 Auto Scaling jede Instance anhand der anderen Beendigungsrichtlinien aus, die Sie für Ihre Auto-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 Ihre Lambda-Funktion eine Zeitüberschreitung auftritt, wartet Amazon EC2 Auto Scaling kurz, bevor Sie Ihre Funktion erneut aufrufen. Unabhängig von der Größe des Events versucht es so lange, bis die gewünschte Kapazität der Gruppe unter der aktuellen Kapazität liegt. 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, die als Überschreitung ihrer maximalen Lebensdauer identifiziert wird.
-
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 bringen, passt Amazon EC2 Auto Scaling die Kapazitätsverteilung über Availability Zones schrittweise neu 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 festgestellt, dass die aktuelle Kapazität Ihrer Gruppe höher ist als die gewünschte Kapazität, und veranlasst gegebenenfalls eine Skalierung.
-
Eine benutzerdefinierte Kündigungsrichtlinie hat keinen Einfluss darauf, dass Sie auch Skalierung als Schutz verwenden können, um bestimmte Instances vor der Kündigung zu schützen. Weitere Informationen finden Sie unter Verwenden Sie den Instance Scale-In-Schutz, um die Beendigung von Instances zu kontrollieren.
-
Wenn Ihre Lambda-Funktion keine Instances zurückgibt, verhindert dies nicht automatisch alle Kündigungen. Amazon EC2 Auto Scaling beendet immer noch Instances, die bei den Auto Scaling-Zustandsprüfungen als fehlerhaft eingestuft werden, unabhängig von den Kündigungsrichtlinien.
So erstellen Sie die Lambda-Funktion:
Erstellen Sie zunächst die Lambda-Funktion, damit Sie ihren Amazon-Ressourcennamen (ARN) in den Beendigungsrichtlinien für Ihre Auto-Scaling-Gruppe angeben können.
Erstellen einer Lambda-Funktion (Konsole)
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie in der Navigationsleiste oben dieselbe Region aus, die Sie beim Erstellen der Auto-Scaling-Gruppe verwendet haben.
-
Wählen Sie Funktion erstellen und Von Grund auf neu erstellen aus.
-
Geben Sie unter Basic information (Grundlegende Informationen) bei Function name (Funktionsname) den Namen für Ihre Funktion ein.
-
Wählen Sie Funktion erstellen. Sie kehren zum Code und zur Konfiguration der Funktion zurück.
-
Wenn Ihre Funktion noch in der Konsole geöffnet ist, fügen Sie unter Funktionscode Ihren Code in den Editor ein.
-
Wählen Sie Bereitstellen.
-
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.
-
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.
-
Wählen Sie als Nächstes die Registerkarte Konfiguration und dann Berechtigungen aus.
-
Scrollen Sie nach unten zur Resource-based Richtlinie und wählen Sie dann Berechtigungen hinzufügen 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 wird der Prinzipal die serviceverknüpfte Amazon EC2 Auto Scaling-Rolle sein, die der Auto-Scaling-Gruppe zugeordnet ist.
-
In der Richtlinienanweisung konfigurieren Sie Ihre Berechtigungen:
-
Wählen Sie AWS-Konto.
-
Für Prinzipal geben Sie den ARN der aufrufenden serviceverknüpften Rolle ein, z. B.
arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling. -
Wählen Sie für Aktion die Option Lambda: InvokeFunction aus.
-
Für Anweisungs-ID geben Sie eine eindeutige Anweisungs-ID ein, wie z. B.
AllowInvokeByAutoScaling. -
Wählen Sie Speichern.
-
-
Nachdem Sie diese Anweisungen befolgt haben, fahren Sie als nächsten Schritt damit fort, den ARN Ihrer Funktion in den Beendigungsrichtlinien für Ihre Auto-Scaling-Gruppe anzugeben. Weitere Informationen finden Sie unter Ändern Sie die Kündigungsrichtlinie für eine Auto Scaling-Gruppe.
Anmerkung
Beispiele, die Sie als Referenz für die Entwicklung Ihrer Lambda-Funktion verwenden können, finden Sie im GitHub Repository
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 einen unqualifizierten ARN (ohne Suffix) oder einen qualifizierten ARN verwenden, der entweder eine Version oder einen Alias als Suffix hat. Wenn ein unqualifizierter ARN verwendet wird (z. B.
function:my-function), muss die ressourcenbasierte Richtlinie für die unveröffentlichte Version Ihrer Funktion erstellt werden. Wenn ein unqualifizierter ARN verwendet wird (z. B.function:my-function:1oderfunction:my-function:prod), muss die ressourcenbasierte Richtlinie für die spezifische veröffentlichte Version Ihrer Funktion erstellt werden. -
Sie können einen qualifizierten ARN nicht mit dem
$LATEST-Suffix verwenden. Wenn Sie versuchen, eine benutzerdefinierte Beendigungsrichtlinie hinzuzufügen, die sich auf einen qualifizierten ARN mit dem$LATEST-Suffix bezieht, führt dies zu einem Fehler. -
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": trueauf, 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 Skalierung in Aktion gehalten, bis die Laufzeit diesen Schwellenwert unterschreitet. Finden Sie bei Lambda-Funktionen mit durchgehend längeren Laufzeiten eine Möglichkeit, die Laufzeit zu reduzieren, z. B. indem Sie die Ergebnisse zwischenspeichern, sodass sie bei nachfolgenden Lambda-Aufrufen abgerufen werden können.
-
Cross-account Lambda-Funktionen werden nicht unterstützt. Die Lambda-Funktion, die als benutzerdefinierte Kündigungsrichtlinie verwendet wird, muss zur gleichen AWS-Konto Auto Scaling-Gruppe gehören. Die Einrichtungsanweisungen auf dieser Seite konzentrieren sich speziell auf Konfigurationen mit demselben Konto.
-
Benutzerdefinierte Kündigungsrichtlinien gelten nicht für instabile Instances. Ungesunde Instances werden immer als kündigungsberechtigt angesehen, und die Lambda-Funktion wertet nur die Kündigungsreihenfolge für die verbleibenden Instances aus.