Pourquoi ma tâche Amazon ECS est-elle bloquée dans l'état EN ATTENTE ?

Lecture de 7 minute(s)
0

Ma tâche Amazon Elastic Container Service (Amazon ECS) est bloquée dans l'état EN ATTENTE.

Brève description

Les scénarios suivants entraînent généralement le blocage des tâches Amazon ECS dans l'état EN ATTENTE :

  • Le démon Docker ne répond pas.
  • L'image Docker est grande.
  • L'agent de conteneur Amazon ECS a perdu la connectivité avec le service Amazon ECS en plein lancement d'une tâche.
  • L'agent de conteneur Amazon ECS met beaucoup de temps pour arrêter une tâche existante.
  • Votre routage Amazon Virtual Private Cloud (Amazon VPC) n'est pas configuré correctement.
  • Un conteneur essentiel dépend de conteneurs non essentiels qui ne sont pas SAINS.

Résolution

Pour savoir pourquoi votre tâche est bloquée dans l'état EN ATTENTE, suivez les étapes de résolution des problèmes suivantes.

Remarque : Si vous recevez des erreurs lors de l'exécution des commandes de l'Interface de la ligne de commande AWS (AWS CLI), assurez-vous que vous utilisez bien la dernière version de cet outil.

Le démon Docker ne répond pas

Pour les problèmes liés au processeur, procédez comme suit :

1.    Utilisez les métriques Amazon CloudWatch pour voir si votre instance de conteneur a dépassé la capacité maximale du processeur.

2.    Augmentez la taille de votre instance de conteneur selon vos besoins.

Pour les problèmes de mémoire, procédez comme suit :

1.    Exécutez la commande free pour connaître la quantité de mémoire disponible pour votre système.

2.    Augmentez la taille de votre instance de conteneur selon vos besoins.

Pour les problèmes d'E/S, procédez comme suit :

1.    Exécutez la commande iotop.

2.    Découvrez quelles tâches utilisent le plus d'IOPS, et dans quels services. Puis utilisez des contraintes et stratégies de placement des tâches pour répartir ces tâches sur des instances de conteneur distinctes.

-ou-

Utilisez CloudWatch pour créer une alarme pour vos métriques BurstBalance dans le service Amazon Elastic Block Store (Amazon EBS). Utilisez ensuite une fonction AWS Lambda ou votre logique personnalisée pour équilibrer les tâches.

L'image Docker est grande

Le téléchargement d'images plus grandes prend plus de temps et augmente la durée de l’état EN ATTENTE de la tâche.

Pour accélérer le temps de transition, réglez le paramètre ECS_IMAGE_PULL_BEHAVIOR pour tirer parti de la mise en cache des images.

Remarque : Par exemple, réglez le paramètre ECS_IMAGE_PULL_BEHAVIOR sur prefer-cached dans le fichier /etc/ecs/ecs.config. Si le paramètre prefer-cached est spécifié, l'image sera extraite à distance en l’absence d’images mises en cache. Dans le cas contraire, c’est l'image mise en cache sur l'instance qui sera utilisée.

L'agent de conteneur Amazon ECS a perdu la connectivité avec le service Amazon ECS au milieu d'un lancement

1.    Pour vérifier l'état et la connectivité de l'agent de conteneur Amazon ECS, exécutez l'une des commandes suivantes sur votre instance de conteneur.

Exécutez la commande suivante pour Amazon Linux 1 :

$ sudo status ecs
$ sudo docker ps -f name=ecs-agent

Exécutez la commande suivante pour Amazon Linux 2 :

$ sudo systemctl status ecs
$ sudo docker ps -f name=ecs-agent

**Remarque :**Vous voyez actif/en cours d’exécution dans le résultat.

2.    Pour afficher les métadonnées relatives aux tâches en cours d'exécution dans votre instance de conteneur ECS, exécutez les commandes suivantes sur votre instance de conteneur :

$ curl http://localhost:51678/v1/metadata

Vous recevez le résultat suivant :

{
  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

3.    Pour afficher des informations sur les tâches en cours d'exécution, exécutez la commande suivante sur votre instance de conteneur :

$ curl http://localhost:51678/v1/tasks

Vous recevez le résultat suivant :

{
  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

4.    Si le problème est lié à un agent déconnecté, redémarrez votre agent de conteneur à l'aide d'une des commandes suivantes.

Exécutez la commande suivante pour Amazon Linux 1 :

$ sudo stop ecs
$ sudo start ecs

Exécutez la commande suivante pour Amazon Linux 2 :

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

Vous recevez un résultat similaire à l'exemple suivant :

ecs start/running, process xxxx

5.    Pour déterminer la connectivité de l’agent, consultez les journaux suivants pendant la période concernée pour y rechercher des mots clés comme error, warn ou agent transition state :

Consultez le journal de l'agent de conteneur Amazon ECS dans le fichier /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh.
Consultez le journal init Amazon ECS dans le fichier /var/log/ecs/ecs-init.log.
Consultez les journaux Docker dans le fichier /var/log/docker.

**Remarque :**Vous pouvez également utiliser le collecteur de journaux Amazon ECS pour collecter les journaux généraux du système d'exploitation, les journaux Docker et les journaux de l’agent de conteneur Amazon ECS.

L'agent de conteneur Amazon ECS met beaucoup de temps pour arrêter une tâche existante

Lorsque votre agent de conteneur reçoit de nouvelles tâches à démarrer depuis Amazon ECS (de EN ATTENTE à EN COURS D’EXÉCUTION), il est possible qu'il doive arrêter d'anciennes tâches. Dans ce cas, l'agent ne démarre pas ces nouvelles tâches tant que les anciennes ne sont pas arrêtées.

Pour contrôler les délais d'arrêt et de démarrage du conteneur au niveau de son instance, définissez les deux paramètres suivants :

1.    Dans le fichier /etc/ecs/ecs.config, ajustez la valeur du paramètre ECS_CONTAINER_STOP_TIMEOUT. Ce paramètre définit le temps qui s'écoule avant qu’Amazon ECS n’arrête de force vos conteneurs s'ils ne sortent pas normalement d'eux-mêmes.

**Remarque :**La valeur par défaut pour Linux et Windows est de 30 s.

2.    Dans le fichier ** /etc/ecs/ecs.config**, ajustez la valeur du paramètre ECS_CONTAINER_START_TIMEOUT. Ce paramètre définit le temps qui s'écoule avant que l'agent de conteneur Amazon ECS arrête d'essayer de démarrer le conteneur.

**Remarque :**La valeur par défaut est de 3 min pour Linux et de 8 min pour Windows.

Si la version de votre agent est la 1.26.0 ou ultérieure, vous pouvez définir les paramètres de délai d'arrêt et de démarrage précédents pour chaque tâche. Cela peut faire passer la tâche à l'état ARRÊTÉ. Supposons, par exemple, que ContainerA dépende du fait que ContainerB atteigne l’état COMPLET, RÉUSSI ou SAIN. Si vous ne spécifiez aucune valeur StartTimeout pour ContainerB et que ContainerB n'atteint pas l'état souhaité dans ce délai, ContainerA ne démarre pas.

Pour un exemple de dépendance entre conteneurs, voir Example: Container dependency sur AWS GitHub.

Votre routage Amazon VPC n'est pas configuré correctement

Vérifiez la configuration du sous-réseau VPC dans lequel vos tâches Amazon ECS ou Fargate s'exécutent. Si le sous-réseau n'est pas configuré correctement, il n'aura pas accès à Amazon ECS ou Amazon ECR. Pour résoudre ce problème, assurez-vous que la table de routage de votre sous-réseau possède une passerelle Internet ou une passerelle NAT. Si vous lancez une tâche dans un sous-réseau qui ne possède pas de route de sortie vers Internet, utilisez AWS PrivateLink. Cela vous permet d'accéder en toute confidentialité aux API Amazon ECS avec des adresses IP privées.

Un conteneur essentiel dépend de conteneurs non essentiels qui ne sont pas SAINS

Si vos conteneurs non essentiels ne sont pas SAINS et qu'un conteneur essentiel en dépend, votre tâche sera bloquée EN ATTENTE. Dans ce cas, le message suivant s'affichera :

"stoppedReason":"Service ABCXYZ: task last status remained in PENDING too long."

Pour résoudre ce problème, assurez-vous que vos conteneurs dépendants (non essentiels) fonctionnent comme prévu. Si vous ne parvenez pas à résoudre le problème sous-jacent, rendez ces conteneurs essentiels pour éviter que la tâche ne reste bloquée trop longtemps EN ATTENTE.

Informations connexes

Dépendance du conteneur

Amazon ECS Container Agent (AWS GitHub)

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