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

Dernière mise à jour : 14/04/2022

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 Amazon ECS services utilisant Fargate Spot, le planificateur de service utilise les valeurs minimumHealthyPercent et maximumPercent afin de déterminer si de la capacité supplémentaire est disponible. 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 aucune capacité n'est disponible ou que la capacité est reprise pour Fargate Spot, le planificateur de service ECS ne peut pas lancer de nouvelles tâches et résilier celles existantes après avoir fourni un avis de deux minutes. Cependant, ces événements ne sont pas signalés dans la console Amazon ECS.

Étant donné que les événements d'ECS sont transmis à EventBridge quasiment en temps réel, il est recommandé d'écrire des règles simples pour indiquer les événements de votre choix et les actions automatisées qui doivent survenir 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": "TerminationNotice",
    "taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
    ...
  }
}

Notez que stopCode est mentionné comme TerminationNotice lorsqu'une tâche est arrêtée en raison d'une interruption Fargate Spot. Cela signifie que 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 en raison du code d'arrêt TerminationNotice.

Procédez comme suit :

  1. Créez une rubrique Amazon SNS.
  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": [
      "TerminationNotice"
    ],
    "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"
    ]
  }
}

Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?