Comment gérer les avis de résiliation Spot dans les tâches AWS Fargate Spot ?

Lecture de 6 minute(s)
0

Je veux savoir comment gérer les avis de résiliation Spot dans les tâches AWS Fargate Spot.

Brève description

Vous pouvez utiliser Fargate Spot afin d'exécuter des tâches Amazon Elastic Container Service (Amazon ECS) tolérantes aux interruptions. Un avis de résiliation est un avertissement que vous recevez deux minutes avant la résiliation de la tâche Fargate Spot. Cet avertissement vous aide à gérer les interruptions Spot en laissant à vos applications le temps de se préparer à un arrêt progressif. L'avis de résiliation est créé dès que la résiliation de la tâche Fargate Spot est signalée. L'avis indique le moment précis de la résiliation de la tâche Fargate Spot en cours d'exécution. L'avertissement est envoyé en tant qu'événement de modification d'état de tâche à Amazon EventBridge et comme signal SIGTERM à la tâche en cours d'exécution.

Afin de vous assurer que les conteneurs de Fargate Spot quittent avant l'arrêt de la tâche, spécifiez une valeur stopTimeout égale ou inférieure à 120 secondes dans la définition du conteneur utilisée par la tâche. La spécification d'une valeur stopTimeout donne au conteneur le temps de quitter normalement. Une fois cette durée écoulée, le conteneur est forcé de s'arrêter.

Remarque : vous pouvez spécifier une valeur maximale de 120 secondes pour stopTimeout. Si vous ne spécifiez aucune valeur pour ce paramètre, la valeur par défaut de 30 secondes sera utilisée.

Lorsque le signal d'interruption est reçu sur les services Amazon ECS utilisant Fargate Spot, le planificateur de services détermine si une capacité supplémentaire est disponible. Le planificateur de services utilise les valeurs minimumHealthyPercent et maximumPercent pour effectuer cette détermination. Si c'est le cas, le planificateur de service tente de lancer des tâches supplémentaires sur Fargate Spot. Cependant, si le planificateur de service ne parvient pas à trouver de capacité pour les nouvelles tâches, les tâches anciennes sont résiliées une fois la durée stopTimeout écoulée.

Lorsque vous utilisez Fargate Spot avec un équilibreur de charge, veuillez prendre en compte les points suivants :

  • Il est possible que l'enregistrement de tâches exécutées en tant que FARGATE_SPOT du groupe cible d'un équilibreur de charge ne soit pas annulé tant que la tâche n'est pas passée à l'état STOPPED.
  • Avec FARGATE_SPOT, vous n'avez que deux minutes pour annuler l'enregistrement du groupe cible avant que la tâche ne soit arrêtée. Cela signifie que vous devez définir le délai d'annulation de l'enregistrement pour tous les groupes cibles associés à FARGATE_SPOT à une valeur inférieure à deux minutes.

Solution

Lorsque la capacité n'est pas disponible ou que la capacité est reprise pour Fargate Spot, le planificateur de services ECS ne peut pas lancer de nouvelles tâches. Au lieu de cela, le planificateur met fin aux tâches existantes après un préavis de deux minutes. Cependant, ces événements ne sont pas signalés dans la console Amazon ECS.

Les événements d'ECS sont transmis à EventBridge en temps quasi réel. Il est donc recommandé de rédiger des règles simples pour indiquer les événements que vous avez choisis et des actions automatisées lorsqu'un événement correspond à une règle. Cet article traite des règles d'EventBridge pour les cas d'utilisation suivants :

  • Une tâche FARGATE_SPOT est arrêtée en raison d'une interruption Fargate Spot.
  • Une tâche FARGATE_SPOT ne peut pas être placée en raison de l'indisponibilité de capacité Fargate Spot.

Une tâche FARGATE_SPOT est arrêtée en raison d'une interruption Fargate Spot

Voici un extrait d'un événement de modification d'état de tâche affichant la raison et le code d'arrêt d'une interruption Fargate Spot.

{
  "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",
    ...
  }
}

Notez que stopCode est mentionné comme SpotInterruption lorsqu'une tâche est arrêtée en raison d'une interruption Fargate Spot. Vous pouvez créer une règle EventBridge qui envoie une alerte Amazon Simple Notification Service (Amazon SNS) chaque fois qu'une tâche FARGATE_SPOT est arrêtée par SpotInterruption.

Procédez comme suit :

1.    Create an Amazon SNS topic.

2.    Créez une règle EventBridge pour ce cas d'utilisation.

Afin de créer une règle EventBridge pour ce cas d'utilisation, procédez comme suit :

1.    Ouvrez la console Amazon EventBridge.

2.    Dans le volet de navigation, choisissez Rules (Règles).

3.    Choisissez Créer une règle.

4.    Saisissez un nom et une description pour la règle.

5.    Pour Event bus (Bus d'événements), sélectionnez AWS default event bus (Bus d'événements AWS par défaut).

6.    Pour Rule type (Type de règle), sélectionnez Rule with an event pattern (Règle avec un modèle d'événement).

7.    Choisissez Suivant.

8.    Pour Event source (Source d'événement), sélectionnez AWS services (Services AWS).

9.    Pour Event pattern (Modèle d'événement), choisissez Custom patterns (JSON editor) (Modèles personnalisés (éditeur JSON)), puis ajoutez le modèle suivant :

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

10.    Choisissez Suivant.

11.    Pour Target types (Types de cibles), sélectionnez AWS service (Service AWS).

12.    Pour Select a target (Sélectionner une cible), sélectionnez SNS topic (Rubrique SNS).

13.    Pour Topic (Rubrique), sélectionnez la rubrique SNS que vous avez créée.

14.    Choisissez Suivant.

15.    Dans la page configure tags - optional (configurer les identifications – facultatif), choisissez Next (Suivant).

16.    Parmi les options, choisissez Create rule (Créer une règle).

Une tâche FARGATE_SPOT ne peut pas être placée en raison de l'indisponibilité de capacité Fargate Spot

Voici un extrait de l'événement d'échec de placement des tâches de service qui s'est produit dans les conditions suivantes :

  • La tâche tentait d'utiliser le fournisseur de capacité FARGATE_SPOT.
  • Le planificateur de service n'a pas pu obtenir de capacité Fargate Spot.
{
  "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"
  }
}

Lorsqu'une tâche ne peut pas être placée en raison de capacité Fargate Spot indisponible, eventName est mentionné comme SERVICE_TASK_PLACEMENT_FAILURE. Cela signifie que vous pouvez créer une règle EventBridge qui envoie une alerte SNS chaque fois qu'une tâche FARGATE_SPOT ne peut pas être placée.

Procédez comme suit :

1.    Créez une rubrique SNS.

2.    Créez une règle Amazon EventBridge pour ce cas d'utilisation. Pour ce faire, suivez les instructions fournies dans la section Une tâche FARGATE_SPOT est arrêtée en raison d'une interruption Fargate Spot, à l'exception de la modification suivante :

Pour Event pattern (Modèle d'événement), choisissez Custom patterns (JSON editor)(Modèles personnalisés (éditeur JSON)), puis ajoutez le modèle suivant :

{
  "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"
    ]
  }
}

Informations connexes

Gestion des avis de résiliation de Fargate Spot

Création de règles Amazon EventBridge qui réagissent aux événements

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an