Comment puis-je résoudre les tâches Amazon ECS qui ne parviennent pas à extraire des images d'Amazon ECR ?

Lecture de 5 minute(s)
0

Je ne parviens pas à extraire des images d'Amazon Elastic Container Registry (Amazon ECR) dans le cadre d'une tâche Amazon Elastic Container Service (Amazon ECS). Ou bien le message « CannotPullContainerError: API error » s’affiche.

Brève description

Vous pouvez recevoir l'erreur CannotPullContainerError pour les raisons suivantes :

  • Vous utilisez un sous-réseau privé sans route vers Internet, de sorte que votre type de lancement n'a pas accès au point de terminaison Amazon ECR.
  • Votre politique de référentiel Amazon ECR restreint l’accès aux images du référentiel.
  • Votre rôle d'exécution de tâche ou d'instance Amazon ECS ne dispose pas des autorisations appropriées pour extraire des images.
  • L'URI d'image demandée n'existe pas.
  • L’espace sur votre disque est insuffisant pour l'image.
  • Vous avez dépassé le quota de taux d’extraction.
  • Un chemin réseau est manquant entre votre tâche et le point de terminaison Amazon ECR.
  • Vos informations d'identification Docker sont obsolètes.

Résolution

Déterminer la cause du problème

Utilisez le dossier d’exploitation AWSSupport-TroubleshootECSTaskFailedToStart pour déterminer le problème. Vous devez exécuter le dossier d'exploitation de la même région AWS où sont situées vos ressources de cluster ECS. Utilisez également l'ID de tâche ayant échoué le plus récemment. Si la tâche ayant échoué fait partie du service Amazon ECS, utilisez la dernière tâche ayant échoué dans le service. La tâche ayant échoué doit être visible dans ECS:DescribeTasks pendant l’automatisation. Par défaut, les tâches ECS arrêtées restent visibles pendant 1 heure après être passées à l'état Arrêté.

En fonction des résultats de l'automatisation, utilisez l'une des mesures de dépannage manuel suivantes.

Vérifier que votre sous-réseau privé inclut une route vers une passerelle NAT ou utiliser PrivateLink

Vous pouvez utiliser un sous-réseau privé pour exécuter une tâche avec un type de lancement Amazon Elastic Compute Cloud (Amazon EC2) ou AWS Fargate. Pour les deux types de lancement, assurez-vous que le sous-réseau privé inclut une route vers une passerelle NAT dans la table de routage. Configurez la passerelle NAT de votre VPC pour acheminer les requêtes vers Internet.

Vous pouvez également utiliser AWS PrivateLink avec les points de terminaison du cloud privé virtuel (VPC) Amazon ECR et les points de terminaison de passerelle Amazon Simple Storage Service (Amazon S3).

Le groupe de sécurité des points de terminaison de VPC doit autoriser les connexions entrantes sur le port 443 depuis le sous-réseau privé ou le VPC de tâche Amazon ECS.

Remarque : La valeur de ECS_IMAGE_PULL_INACTIVITY_TIMEOUT dans Windows est définie par défaut sur 3 minutes. Si vous extrayez une image de grande taille, il est possible que l'extraction de l'image ne soit pas effectuée dans les 3 minutes et que la requête expire.

Vérifier votre politique de référentiel Amazon ECR

Si votre politique de référentiel Amazon ECR restreint l'accès aux images du référentiel, le message d'erreur 403 Forbidden s'affiche. Vérifiez votre politique de référentiel Amazon ECR pour vérifier l’absence de restrictions sur les images du référentiel. Pour des exemples de politiques d'accès, consultez la section Exemples de politiques de référentiel privé dans Amazon ECR.

Vérifier les autorisations associées à l'exécution de votre tâche ou au rôle IAM de votre instance de conteneur

Si vous utilisez le type de lancement Amazon EC2, assurez-vous que le rôle AWS Identity and Access Management (IAM) de l'instance de conteneur est autorisé à accéder au référentiel Amazon ECR. La politique AmazonEC2ContainerRegistryReadOnly fournit les autorisations minimales requises pour extraire des images.

Si vous utilisez le type de lancement Fargate, assurez-vous que AmazonECSTaskExecutionRolePolicy est associé au rôle d'exécution de la tâche pour extraire une image.

S’assurer d’utiliser l’URI d’image approprié

Pour confirmer que vous utilisez le nom de l’image approprié dans l’URI, vérifiez le paramètre d’image dans la section des définitions de conteneur de votre définition de tâche.

Remarque : Pour effectuer une extraction par identification, utilisez le format de nom d’image registry/repository[:tag]. Pour effectuer une extraction par résumé, utilisez le format registry/repository[@digest] que vous pouvez copier directement depuis le référentiel Amazon ECR.

Vérifier votre espace disque

Si l'espace disque pour stocker l'image que vous extrayez est insuffisant, le message d'erreur « CannotPullContainerError: no space left on device » s'affiche. Pour résoudre ce problème, consultez la section write /var/lib/docker/tmp/GetImageBlob111111111: no space left on device.

Vérifier si vous avez dépassé le quota de taux d'extraction

Si vous utilisez Docker Hub pour extraire l'image et que vous dépassez le quota d'extraction d'image, le message d’erreur « CannotPullContainerError: toomanyrequests: You have reached your pull rate limit » s’affiche. Pour plus d'informations sur les quotas de taux d'extraction, consultez la section Limite de taux d'extraction sur le site Web de Docker Docs. Pour résoudre ce problème, consultez la section ERROR: toomanyrequests: Too Many Requests ou You have reached your pull rate limit.

Vérifier votre configuration réseau

Si un chemin réseau entre votre tâche et le point de terminaison Amazon ECR est manquant, vous recevez une erreur similaire aux exemples suivants :

« Cannotpullcontainererror: error response from daemon »

-ou-

« Client.Timeout exceeded while awaiting headers »

Pour résoudre ce problème, vérifiez si votre tâche a accès au référentiel Amazon ECR via une passerelle NAT ou PrivateLink.

Lorsque vous créez un service Amazon ECS, configurez les paramètres suivants sous Mise en réseau :

  • Pour les tâches dans les sous-réseaux publics, dans Adresse IP publique, activez l'option Attribuer automatiquement une adresse IP publique.
  • Pour les tâches dans des sous-réseaux privés, désactivez l’option Attribution automatique d'une adresse IP publique, puis configurez une passerelle NAT ou PrivateLink.

Mettre à jour vos informations d’identification de connexion Docker

Si vos informations d'identification Docker sont obsolètes, le message d'erreur « repository does not exist or may require 'docker login' » s'affiche. Pour mettre à jour vos informations de connexion Docker pour l'authentification de référentiel privé, consultez la section Utilisation d'un jeton d'autorisation.

Informations connexes

Erreurs de tâche CannotPullContainer dans Amazon ECS