Comment résoudre l'erreur « DockerTimeoutError » dans AWS Batch ?

Date de la dernière mise à jour : 19/07/2019

Les tâches dans mon environnement de calcul AWS Batch échouent en raison de l'erreur suivante : « DockerTimeoutError: Could not transition to created; timed out after waiting 4m0s » (DockerTimeoutError : impossible d'effectuer la transition vers créé ; l'appel expire après 4 m 0 s d'attente). Comment résoudre cette erreur ?

Brève description

Vous recevez cette erreur lorsque les appels docker start (démarrer un docker) et docker create (créer un docker) prennent plus de 4 minutes. Le délai d'expiration par défaut fixé par l'agent de conteneur Amazon Elastic Container Service (Amazon ECS) est de 4 minutes.

L'erreur peut être provoquée par les problèmes suivants :

  • Les volumes de l'instance ECS de l'environnement de calcul AWS Batch peuvent subir une pression d'E/S élevée exercée par tous les autres tâches dans votre file d'attente. Ces tâches, qui sont créées et exécutées sur l'instance ECS, peuvent épuiser le solde de transmission en rafales. Pour résoudre ce problème, suivez les étapes décrites dans la section Résolution des problèmes d'équilibre de compartiments en rafales.
  • Les conteneurs Amazon ECS arrêtés ne sont pas nettoyés suffisamment rapidement pour pouvoir libérer le daemon Docker. Vous pouvez rencontrer des problèmes avec Docker si vous utilisez une AMI personnalisée au lieu de l'AMI fournie par défaut par AWS Batch. L'AMI par défaut pour AWS Batch optimise vos paramètres de nettoyage Amazon ECS. Pour résoudre ce problème, suivez les étapes décrites dans la section Résolution des problèmes de Docker.

Si aucun de ces problèmes n'est à l'origine de l'erreur, essayez ce qui suit :

  • Consultez vos journaux Docker à la recherche de la source de l'erreur.
  • Exécutez le script de collecteur de journaux Amazon ECS sur les instances ECS dans le cluster ECS associé à votre environnement de calcul AWS Batch.

Résolution

Résolution des problèmes de solde de transmission en rafales

Pour vérifier l'équilibre de vos compartiments en rafales de votre instance ECS :

1.    Ouvrez la console Amazon ECS.

2.    Dans le volet de navigation, sélectionnez Clusters, puis sélectionnez le cluster qui contient votre tâche.

Remarque : le nom du cluster commence par le nom de l'environnement de calcul, suivi de _Batch_ et d'un hachage aléatoire de lettres et de chiffres.

3.    Accédez à l'onglet ECS Instances (Instances ECS).

4.    Dans la colonne EC2 Instance (Instance EC2), choisissez votre instance.

Remarque : pour trouver l'ID d'instance de la tâche en échec, exécutez la commande aws batch describe-jobs –jobs awsExampleJobID. L'ID d'instance s'affiche dans la sortie pour containerInstanceArn.

5.    Dans l'onglet Descriptions de la console Amazon EC2, cliquez sur le lien pour votre volume, affiché sous Block devices (Block device).

6.    Dans la fenêtre contextuelle de périphérique de stockage en mode bloc, sous EBS ID (ID d'EBS), choisissez votre volume.

7.    Sélectionnez l'onglet Monitoring, puis choisissez Burst Solde (solde en rafales) pour vérifier vos métriques de solde en rafales.

Remarque : si votre solde en rafales tombe à 0, votre solde de transmission en rafales est épuisé.

Pour créer un modèle de lancement pour votre environnement de calcul géré :

Remarque : si vous modifiez le modèle de lancement, vous devez créer un nouvel environnement de calcul.

1.    Ouvrez la console Amazon EC2, puis sélectionnez Load Balancers (Équilibreurs de charge).

2.    Sélectionnez Create launch template (Créer un modèle de lancement).

3.    Sous AMI ID (ID d'AMI), sélectionnez l'AMI optimisée pour Amazon ECS par défaut.

4.    Dans la section Storage (Volumes) (Stockage (Volumes), choisissez un type de volume dans la colonne Volume type (Type de volume), puis saisissez une valeur entière dans la colonne Size(GiB) (Taille (Gio)).

Remarque : si vous choisissez Provisioned IOPS SSD (io1) (IOPS provisionnés SSD (io1)) pour le type de volume, indiquez une valeur entière qui est autorisée pour les IOPS.

5.    Sélectionnez Create launch template (Créer un modèle de lancement).

6.    Utilisez votre nouveau launch template (modèle de lancement) pour créer un environnement de calcul géré.

Pour créer un environnement de calcul AWS Batch avec votre AMI :

Remarque : si vous modifiez l'AMI, vous devez créer un nouvel environnement de calcul, car le paramètre AMI ID (ID d'AMI) ne peut pas être mis à jour.

1.    Ouvrez la console Amazon EC2.

2.    Sélectionnez Launch instance (Lancer des instances).

3.    Suivez les étapes de l'assistant de configuration pour créer votre instance.

Important : sur la page Add Storage (Ajouter le stockage), modifiez le type de volume ou la taille de votre instance. Plus la taille de volume est élevée, meilleure est la performance de référence, mais cela ralentit également proportionnellement le réapprovisionnement de son solde en rafales. Pour obtenir les meilleures performances pour les charges d'E/S élevées, modifiez le type de volume pour io1.

4.    Créez une ressource de calcul AMI à partir de votre instance.

5.    Créez un environnement de calcul pour AWS Batch qui inclut votre ID d'AMI.

Résolution des problèmes de Docker

Par défaut, l'agent de conteneur Amazon ECS élimine automatiquement les tâches arrêtées et les images Docker qui ne sont pas utilisées par des tâches de vos instances de conteneur. Si plusieurs nouvelles tâches avec de nouvelles images sont exécutées, votre stockage d'instance de conteneur peut se remplir rapidement avec des images Docker que vous n'utilisez plus.

1.    Utilisez SSH pour vous connecter à l'instance de conteneur pour votre environnement de calcul AWS Batch.

2.    Pour inspecter l'agent de conteneur Amazon ECS, exécutez la commande Docker inspect ecs-agent, puis consultez la section env dans la sortie.

Remarque : vous pouvez réduire les valeurs des variables suivantes pour accélérer la tâche et le nettoyage d'image : ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION, ECS_IMAGE_CLEANUP_INTERVAL, ECS_IMAGE_MINIMUM_CLEANUP_AGE, et ECS_NUM_IMAGES_DELETE_PER_CYCLE. De plus, vous pouvez utiliser des paramètres adaptables pour les tâches automatisées et de nettoyage d'image.

3.    Créez une nouvelle AMI avec des valeurs mises à jour, ou créer un modèle de lancement avec les données utilisateur qui incluent vos nouvelles variables d'environnement.

Pour créer une nouvelle AMI :

1.    Définissez vos paramètres de configuration de l'agent dans le fichier /etc/ecs/ecs.config.

2.    Redémarrez votre agent de conteneur.

3.    Créez une ressource de calcul AMI à partir de votre instance.

4.    Créez un environnement de calcul pour AWS Batch qui inclut votre ID d'AMI.

Pour créer un modèle de lancement :

1.    Créez un modèle de lancement à partir de données utilisateur.

Par exemple, les données utilisateur dans le fichier MIME en plusieurs parties suivant remplacent les paramètres de nettoyage d'image Docker par défaut pour une ressource de calcul :

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo ECS_IMAGE_CLEANUP_INTERVAL=60m >> /etc/ecs/ecs.config
echo ECS_IMAGE_MINIMUM_CLEANUP_AGE=60m >> /etc/ecs/ecs.config
--==MYBOUNDARY==--

2.    Utilisez votre nouveau modèle de lancement pour créer un environnement de calcul géré.


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

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?