¿Cómo se gestionan los avisos de terminación de Spot en las tareas de AWS Fargate Spot?

Última actualización: 14/04/2022

Me gustaría saber cómo gestionar los avisos de terminación de Spot en las tareas de AWS Fargate Spot.

Descripción corta

Puede utilizar Fargate Spot para ejecutar tareas de Amazon Elastic Container Service (Amazon ECS) tolerantes a interrupciones. Un aviso de terminación es una advertencia de dos minutos que el usuario recibe antes de que la tarea de Fargate Spot se deba terminar. Esta advertencia le ayuda a administrar las interrupciones de Spot dándole a las aplicaciones el tiempo necesario para prepararse para el cierre. La notificación de terminación se crea tan pronto como la tarea Fargate Spot se marca para la terminación. El aviso indica el momento en que la tarea de Fargate Spot que se está ejecutando terminará. La advertencia se envía como un evento de cambio de estado de la tarea a Amazon EventBridge y como una señal SIGTERM a la tarea en ejecución.

Para asegurarse de que los contenedores en Fargate Spot salgan antes de que la tarea se detenga, especifique un valor stopTimeout de 120 segundos o menos en la definición de contenedor utilizado por la tarea. Al especificar un valor de stopTimeout se le da al contenedor el tiempo necesario para salir con normalidad. Una vez transcurrido este tiempo, el contenedor se detiene forzosamente.

Nota: Puede especificar un valor máximo de 120 segundos para stopTimeout. Si no especifica ningún valor para este parámetro, el valor predeterminado será de 30 segundos.

Cuando se recibe la señal de interrupción en los servicios Amazon ECS que utilizan Fargate Spot, el programador de servicios utiliza los valores minimumHealthyPercent y maximumPercent para determinar si hay capacidad adicional disponible. Si hay capacidad disponible, el programador de servicios intenta lanzar tareas adicionales en Fargate Spot. Sin embargo, si el programador de servicios no encuentra la capacidad para las nuevas tareas, las tareas antiguas se terminan después de que transcurra la duración de stopTimeout.

Tenga en cuenta lo siguiente al utilizar Fargate Spot con un equilibrador de carga:

  • Es posible que las tareas que se ejecutan como FARGATE_SPOT no anulen el registro del grupo de destino de un equilibrador de carga hasta que la tarea pase al estado STOPPED.
  • Con FARGATE_SPOT, solo tiene dos minutos para anular el registro del grupo de destino antes de que se cierre la tarea. Esto significa que debe establecer la demora por anulación de registro para cualquier grupo de destino asociado con FARGATE_SPOT a un valor inferior a dos minutos.

Resolución

Cuando la capacidad no está disponible o se recupera la capacidad para Fargate Spot, el programador de servicios de ECS no puede lanzar nuevas tareas y termina las existentes tras un aviso de dos minutos. Sin embargo, estos eventos no se informan en la consola de Amazon ECS.

Dado que los eventos de ECS se entregan a EventBridge casi en tiempo real, es una práctica recomendada escribir reglas simples para indicar los eventos de su elección y las acciones automatizadas que se deben tomar cuando un evento coincide con una regla. Este artículo describe las reglas de EventBridge para los siguientes casos de uso:

  • Una tarea FARGATE_SPOT se cierra debido a una interrupción de Fargate Spot.
  • No se puede realizar una tarea FARGATE_SPOT debido a la falta de disponibilidad de la capacidad de Fargate Spot.

Una tarea FARGATE_SPOT se cierra debido a una interrupción de Fargate Spot

A continuación se muestra un fragmento de un evento de cambio de estado de tarea que muestra el motivo y código de la detención de una interrupción de 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",
    ...
  }
}

Tenga en cuenta que stopCode se indica como TerminationNotice cuando una tarea se detiene debido a una interrupción de Fargate Spot. Esto significa que puede crear una regla de EventBridge que envíe una alerta de Amazon Simple Notification Service (Amazon SNS) cada vez que una tarea FARGATE_SPOT se detenga debido al código de detención TerminationNotice.

Haga lo siguiente:

  1. Cree un tema de Amazon SNS.
  2. Cree una regla de EventBridge para este caso de uso.

Para crear una regla de EventBridge para este caso de uso, haga lo siguiente:

1.    Abra la consola de Amazon EventBridge.

2.    En el panel de navegación, elija Rules (Reglas).

3.    Elija Create rule (Crear regla).

4.    Ingrese un nombre y descripción para la regla.

5.    En Event bus (Bus de eventos), seleccione AWS default event bus (Bus de eventos predeterminado de AWS).

6.    En Rule type (Tipo de regla), seleccione Rule with an event pattern (Regla con un patrón de eventos).

7.    Seleccione Siguiente.

8.    En Event source (Origen del evento), seleccione AWS services (Servicios de AWS).

9.    En Event pattern (Patrón de eventos), elija Custom patterns (JSON editor) (Patrones personalizados [editor JSON]) y agregue el siguiente patrón:

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

10.    Elija Next (Siguiente).

11.    En Target types (Tipos de destino), seleccione AWS service (Servicio de AWS).

12.    En Select a target (Seleccionar un destino), seleccione SNS topic (Tema de SNS).

13.    En Topic (Tema), seleccione el tema de SNS que ha creado.

14.    Elija Next (Siguiente).

15.    En la página configure tags - optional (configuración etiquetas:opcional), elija Next (Siguiente).

16.    Revise las opciones y elija Create rule (Crear regla).

No se puede realizar una tarea FARGATE_SPOT debido a la falta de disponibilidad de la capacidad de Fargate Spot

A continuación se muestra un fragmento del evento de error de ubicación de la tarea de servicio que se ha producido bajo estas condiciones:

  • La tarea intentaba utilizar el proveedor de capacidad FARGATE_SPOT.
  • El programador de servicios no ha podido adquirir ninguna capacidad de 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"
  }
}

Cuando no se puede realizar una tarea debido a que la capacidad de Fargate Spot no está disponible, el eventName se menciona como SERVICE_TASK_PLACEMENT_FAILURE. Esto significa que puede crear una regla de EventBridge que envíe una alerta SNS cada vez que no se pueda realizar una tarea FARGATE_SPOT.

Haga lo siguiente:

1.    Cree un tema de SNS.

2.    Cree una regla de Amazon EventBridge para este caso de uso. Para ello, siga las instrucciones proporcionadas en la secciónA FARGATE_SPOT task is shut down due to Fargate Spot interruption (Una tarea de FARGATE_SPOT se cierra debido a una interrupción de Fargate Spot), excepto por el siguiente cambio:

En Event pattern (Patrón de eventos), elija Custom patterns (JSON editor) (Patrones personalizados [editor JSON]) y agregue el siguiente patrón:

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

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?