Wie gehe ich mit Spot-Kündigungsbenachrichtigungen in Spot-Aufgaben von AWS Fargate um?

Lesedauer: 5 Minute
0

Ich möchte wissen, wie man mit Spot-Kündigungsbenachrichtigungen in Spot-Aufgaben von AWS Fargate umgeht.

Kurzbeschreibung

Sie können Fargate Spot verwenden, um unterbrechungsfreie Amazon Elastic Container Service (Amazon ECS)-Aufgaben auszuführen. Eine Kündigungsbenachrichtigung ist eine zweiminütige Warnung, die Sie erhalten, bevor die Fargate-Spot-Aufgabe zur Kündigung fällig ist. Diese Warnung hilft Ihnen bei der Verwaltung von Spot-Unterbrechungen, indem sie Ihren Anwendungen Zeit gibt, sich auf eine ordnungsgemäße Schließung vorzubereiten. Die Kündigungsbenachrichtigung wird erstellt, sobald die Fargate-Spot-Aufgabe zur Kündigung markiert ist. Die Benachrichtigung gibt den Zeitpunkt an, zu dem die laufende Fargate-Spot-Aufgabe beendet wird. Die Warnung wird als Ereignis zur Änderung des Aufgabenstatus an Amazon EventBridge und als SIGTERM-Signal an die laufende Aufgabe gesendet.

Um sicherzustellen, dass die Container auf Fargate Spot vor dem Stoppen der Aufgabe beendet werden, geben Sie in der von der Aufgabe verwendeten Containerdefinition einen stopTimeout-Wert von 120 Sekunden oder weniger an. Wenn Sie einen stopTimeout-Wert angeben, erhält der Container die Zeit, sich normal zu beenden. Nach Ablauf dieser Zeit wird der Container zwangsweise gestoppt.

Hinweis: Sie können einen Maximalwert von 120 Sekunden für stopTimeout angeben. Wenn Sie keinen Wert für diesen Parameter angeben, wird der Standardwert von 30 Sekunden verwendet.

Wenn das Unterbrechungssignal auf Amazon-ECS-Services mithilfe von Fargate Spot empfangen wird, bestimmt der Service-Scheduler, ob zusätzliche Kapazität verfügbar ist. Der Service-Scheduler verwendet die Werte MinimumHealthyPercent und MaximumPercent, um diese Bestimmung zu treffen. Wenn Kapazität verfügbar ist, versucht der Service-Scheduler, zusätzliche Aufgaben auf Fargate Spot zu starten. Wenn der Service-Scheduler jedoch die Kapazität für neue Aufgaben nicht findet, werden die alten Aufgaben nach Ablauf der stopTimeout-Dauer beendet.

Beachten Sie Folgendes, wenn Sie Fargate Spot mit einer Lastenverteilung verwenden:

  • Aufgaben, die als FARGATE_SPOT ausgeführt werden, werden möglicherweise nicht von der Zielgruppe einer Lastenverteilung abgemeldet, bis die Aufgabe in den Status STOPPED übergeht.
  • Mit FARGATE_SPOT haben Sie nur zwei Minuten Zeit, um die Zielgruppe abzumelden, bevor die Aufgabe beendet wird. Das bedeutet, dass Sie die Abmeldeverzögerung für alle Zielgruppen, die mit FARGATE_SPOT verknüpft sind, auf einen Wert unter zwei Minuten setzen müssen.

Lösung

Wenn die Kapazität nicht verfügbar ist oder die Kapazität für Fargate Spot zurückgenommen wird, kann der ECS-Service-Scheduler keine neuen Aufgaben starten. Stattdessen beendet der Scheduler die bestehenden Aufgaben nach einer zweiminütigen Vorankündigung. Diese Ereignisse werden jedoch nicht in der Amazon-ECS-Konsole gemeldet.

Die Ereignisse von ECS werden nahezu in Echtzeit an EventBridge übermittelt. Daher empfiehlt es sich, einfache Regeln zu schreiben, um die von Ihnen ausgewählten Ereignisse anzugeben, und automatische Aktionen zu erstellen, wenn ein Ereignis einer Regel entspricht. Dieser Artikel behandelt EventBridge-Regeln für die folgenden Anwendungsfälle:

  • Eine FARGATE_SPOT-Aufgabe wurde aufgrund einer Fargate-Spot-Unterbrechung beendet.
  • Eine FARGATE_SPOT-Aufgabe kann nicht platziert werden, da die Fargate-Spot-Kapazität nicht verfügbar ist.

Eine FARGATE_SPOT-Aufgabe wurde aufgrund einer Fargate-Spot-Unterbrechung beendet

Im Folgenden finden Sie einen Ausschnitt eines Ereignisses zur Änderung des Aufgabenstatus, das den gestoppten Grund und den Stoppcode für eine Fargate-Spot-Unterbrechung anzeigt:

{
  "version": "0",
  "id": "a99d3f53-4a7c-4153-a1a5-48957fc83b8f",
  "detail-type": "ECS Task State Change",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9b"
  ],
  "detail": {
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "createdAt": "2022-02-25T10:13:08.455Z",
    "desiredStatus": "STOPPED",
    "lastStatus": "RUNNING",
    "stoppedReason": "Your Spot Task was interrupted.",
    "stopCode": "SpotInterruption",
    "taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
    ...
  }
}

Beachten Sie, dass StopCode als SpotInterruption bezeichnet wird, wenn eine Aufgabe aufgrund einer Fargate-Spot-Unterbrechung gestoppt wird. Sie können eine EventBridge-Regel erstellen, die eine Amazon Simple Notification Service (Amazon SNS)-Warnung sendet, wenn eine FARGATE_SPOT-Aufgabe von SpotInterruption gestoppt wird.

Führen Sie die folgenden Schritte aus:

1.    Erstellen Sie ein Amazon-SNS-Thema.

2.    Erstellen Sie eine EventBridge-Regel für diesen Anwendungsfall.

Gehen Sie wie folgt vor, um eine EventBridge-Regel für diesen Anwendungsfall zu erstellen:

1.    Öffnen Sie die Amazon-EventBridge-Konsole.

2.    Wählen Sie im Navigationsbereich Regeln aus.

3.    Wählen Sie Regel erstellen aus.

4.    Geben Sie einen Namen und eine Beschreibung für die Regel ein.

5.    Wählen Sie unter Ereignisbus die Option AWS-Standard-Ereignisbus aus.

6.    Wählen Sie für Regeltyp die Option Regel mit einem Ereignismuster aus.

7.    Wählen Sie Weiter aus.

8.    Wählen Sie als Ereignisquelle die Option AWS-Services aus.

9.    Wählen Sie für Ereignismuster die Option Benutzerdefinierte Muster (JSON-Editor) aus und fügen Sie das folgende Muster hinzu:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "stopCode": [
      "SpotInterruption"
    ],
    "clusterArn": [
      "arn:aws:ecs:exampleregion:1111222233334444:cluster/examplecluster"
    ]
  }
}

10.    Wählen Sie Weiter aus.

11.    Wählen Sie für Zieltypen die Option AWS-Service aus.

12.    Wählen Sie für Ziel auswählen die Option SNS-Thema aus.

13.    Wählen Sie für Thema das SNS-Thema aus, das Sie erstellt haben.

14.    Wählen Sie Weiter aus.

15.    Wählen Sie auf der Seite Tags konfigurieren - optional die Option Weiter aus.

16.    Prüfen Sie die Optionen und wählen Sie Regel erstellen aus.

Eine FARGATE_SPOT-Aufgabe kann nicht platziert werden, da die Fargate-Spot-Kapazität nicht verfügbar ist

Im Folgenden finden Sie einen Ausschnitt des Ereignisses bei der Platzierung von Serviceaufgaben, das unter den folgenden Bedingungen aufgetreten ist:

  • Die Aufgabe hat versucht, den Kapazitätsanbieter FARGATE_SPOT zu verwenden.
  • Der Service Scheduler konnte keine Fargate-Spot-Kapazität erwerben.
{
  "version": "0",
  "id": "403b98b2-616e-4ec7-8dff-b2cba8d5bf64",
  "detail-type": "ECS Service Action",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "time": "2022-02-25T14:56:32.756Z",
  "region": "ap-southeast-2",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:service/default/servicetest"
  ],
  "detail": {
    "eventType": "ERROR",
    "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "capacityProviderArns": [
      "arn:aws:ecs:ap-southeast-2:1111222233334444:capacity-provider/FARGATE_SPOT"
    ],
    "reason": "RESOURCE:FARGATE",
    "createdAt": "2022-02-25T14:21:04.163Z"
  }
}

Wenn eine Aufgabe aufgrund der nicht verfügbaren Fargate-Spot-Kapazität nicht platziert werden kann, wird der EventName als SERVICE_TASK_PLACEMENT_FAILURE erwähnt. Das bedeutet, dass Sie eine EventBridge-Regel erstellen können, die eine SNS-Warnung sendet, wenn eine FARGATE_SPOT-Aufgabe nicht platziert werden kann.

Führen Sie die folgenden Schritte aus:

1.    Erstellen Sie ein SNS-Thema.

2.    Erstellen Sie eine Amazon-EventBridge-Regel für diesen Anwendungsfall. Verwenden Sie dazu die Anweisungen im Abschnitt Eine FARGATE_SPOT-Aufgabe wird aufgrund einer Fargate-Spot-Unterbrechung beendet, mit Ausnahme der folgenden Änderung:

Wählen Sie für Ereignismuster die Option Benutzerdefinierte Muster (JSON-Editor) aus und fügen Sie das folgende Muster hinzu:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Deployment State Change"
  ],
  "detail": {
    "eventName": [
      "SERVICE_TASK_PLACEMENT_FAILURE"
    ],
    "clusterArn": [
      "arn:aws:ecs:example-region:1111222233334444:cluster/example-cluster"
    ],
    "reason": [
      "RESOURCE:FARGATE"
    ]
  }
}

Zugehörige Informationen

Umgang mit Fargate-Spot-Kündigungsbenachrichtigungen

Erstellen von Amazon-EventBridge-Regeln, die auf Ereignisse reagieren

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr