Lorsque je déploie un nouveau service dans mon cluster Amazon Elastic Container Service (Amazon ECS), les tâches sont déployées ou interrompues de manière incorrecte.
Résolution
Vérifiez que vous utilisez un conteneur doté d’une capacité de ressources suffisante
Si les nouveaux déploiements échouent régulièrement aux vérifications de l’état de l'équilibreur de charge, vérifiez les métriques Amazon ECS Container Insights CpuUtilized, CpuReserved et MemoryUtilized. Si vous utilisez un Application Load Balancer, vérifiez également TargetResponseTime.
En outre, configurez la propriété HealthCheckGracePeriodSeconds avec une valeur plus longue que le temps de démarrage de votre application. Les réponses différées aux vérifications de l’état peuvent provoquer des échecs et inciter Amazon ECS à effectuer des tâches de manière cyclique.
Vérifiez l'état du conteneur et les codes de sortie
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.
Pour les tâches qui se terminent de manière inattendue, exécutez la commande describe-tasks suivante pour vérifier les codes de sortie du conteneur :
aws ecs describe-tasks --cluster ECS_CLUSTER --tasks TASK_ARN -- region REGION
Remarque : Remplacez ECS_CLUSTER par le nom de votre cluster, TASK_ARN par l'ARN de la tâche et REGION par votre région AWS.
Si la sortie de la commande précédente est 0, la tâche a été lancée avec succès. Si la sortie est égale à 1, cela signifie qu'une erreur d'application est survenue et vous devez vérifier vos journaux d’application. Si la sortie est 137, le conteneur a reçu un signal SIGKILL, généralement dû à un problème de mémoire insuffisante. Pour résoudre ce problème, consultez les sections Comment puis-je résoudre les erreurs OutOfMemory dans Amazon ECS ? et Pourquoi ma tâche Amazon ECS est-elle interrompue ?
Examinez la configuration de la définition de tâche
Assurez-vous que toutes les configurations de définition de tâche sont valides, en particulier après avoir modifié ou créé de nouvelles définitions de tâche. Pour vérifier vos configurations de définition de tâche, exécutez une tâche autonome.
Configurer les paramètres de votre équilibreur de charge
Configurez deregistration_delay.timeout_seconds dans l'équilibreur de charge en fonction de vos besoins. Pour les requêtes de longue durée, utilisez une valeur supérieure. Pour les instances Amazon Elastic Compute Cloud (Amazon EC2) Spot, cette valeur doit être inférieure à 120 secondes.
Pour modifier deregistration_delay.timeout_seconds, exécutez la commande modify-target-group-attributes suivante :
aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120
Remarque : Remplacez EXAMPLE_ARN par l'ARN de votre équilibreur de charge et 120 par le délai d’annulation d’enregistrement en secondes.
Aussi, optimisez les paramètres de vérification de l'état de l'équilibreur de charge. Si les paramètres sont trop stricts pour votre application, l'équilibreur de charge peut fréquemment indiquer que la cible est non saine.
Configurer l'heure d'arrêt progressive de votre application
Par défaut, ECS_CONTAINER_STOP_TIMEOUT est défini à 30 secondes. Lorsque vous accédez à votre application pendant la phase de drainage des tâches précédentes dans un nouveau déploiement Amazon ECS, vous pouvez recevoir une erreur 5xx. Si vous rencontrez des problèmes lorsque vous accédez à votre application, augmentez la valeur de ECS_CONTAINER_STOP_TIMEOUT en fonction des besoins d'arrêt progressif de votre application. Il est recommandé de tester la valeur mise à jour dans un environnement de test avant de la déployer.
Pour mettre à jour la valeur, ajoutez un code similaire à l'exemple suivant à votre définition de tâche :
{
"containerDefinitions": [
{
"name": "your-container",
"image": "your-image",
"stopTimeout": 120
}
]
}
Remarque : Remplacez 120 par votre valeur de ECS_CONTAINER_STOP_TIMEOUT.
Pour configurer l'arrêt progressif, ajoutez un gestionnaire SIGTERM dans votre application. Pour un AWS Fargate Spot, configurez la configuration pour appeler DeregisterTargets pendant l’exécution du gestionnaire SIGTERM. Cela permet de vous assurer qu'Amazon ECS annule l’enregistrement des tâches FARGATE_SPOT du groupe cible de l'équilibreur de charge.
Informations connexes
Optimiser les paramètres de drainage des connexions de l'équilibreur de charge pour Amazon ECS