Comment résoudre l'erreur « CannotPullContainerError : Vous avez atteint la limite du taux d'extraction » dans Amazon ECS ?

Lecture de 9 minute(s)
0

Lorsque j'essaie d'extraire des images depuis Docker Hub, ma tâche Amazon Elastic Container Service (Amazon ECS) affiche l'erreur suivante : « CannotPullContainerError : l'image d'inspection a été réessayée 5 fois : HttpReaderSeeker : échec de l'ouverture : code d'état inattendu https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Trop de demandes - Message du serveur : toomanyrequests : Vous avez atteint la limite du taux d'extraction. Vous pouvez augmenter la limite en vous authentifiant et en effectuant une mise à niveau : https://www.docker.com/increase-rate-limit »

Brève description

Cette erreur se produit lorsque vous essayez d'extraire une image du référentiel Docker Hub public (sur le site Web de Docker Hub) après avoir atteint votre limite de taux d'extraction Docker (à partir du site web de Docker Hub). Le dépassement de votre limite de débit renvoie le code d'état HTTP 429. Docker Hub utilise les adresses IP pour authentifier les utilisateurs ; les limites de taux d'extraction sont basées sur les adresses IP individuelles. Pour les utilisateurs anonymes, la limite de débit est fixée à 100 extractions par période de 6 heures par adresse IP. Pour les utilisateurs authentifiés avec un ID Docker, le taux d'appel est défini sur 200 extractions par période de 6 heures. Si votre demande d'extraction d'image dépasse ces limites, Amazon ECS la refuse jusqu'à l'expiration du délai de 6 heures. Si vous exécutez votre charge de travail Amazon ECS ou Amazon Elastic Kubernetes Service (Amazon EKS), les données sont extraites via une passerelle NAT avec une adresse IP fixe. Dans ce cas, la demande est limitée lorsque vous dépassez la limite d'extraction.

Utilisez le runbook AWSSupport-TroubleshootECSTaskFailedToStart pour résoudre les erreurs liées aux tâches Amazon ECS qui ne démarrent pas. Cette automatisation passe en revue les configurations suivantes :

  • Connexion réseau au registre de conteneurs configuré
  • Autorisations AWS Identity and Access Management (IAM) manquantes pour le rôle d'exécution
  • Connexion des points de terminaison du cloud privé virtuel (VPC)
  • Configuration des règles du groupe de sécurité
  • Références relatives à AWS Secrets Manager
  • Configuration de la journalisation

Résolution

Important :

  • Utilisez le runbook AWSSupport-TroubleshootECSTaskFailedToStart dans la même région AWS où se trouvent les ressources de votre cluster ECS.
  • Lorsque vous utilisez le runbook, vous devez utiliser le dernier ID de tâche ayant échoué. En cas d'échec de la tâche dans le cadre d'Amazon ECS, utilisez la dernière tâche ayant échoué dans le service. La tâche ayant échoué doit être visible dans ECS:DescribeTasks lors de l'exécution de l'automatisation. Par défaut, les tâches ECS arrêtées sont visibles pendant 1 heure après le passage à l'état Arrêté. L'utilisation de l'ID de la dernière tâche ayant échoué permet d'éviter que le nettoyage de l'état de la tâche n'interrompe l'analyse pendant l'automatisation.

**Remarque :**Si le résultat du runbook ne fournit pas de recommandations, utilisez l'une des méthodes de résolution manuelle des problèmes décrites dans la section suivante.

Pour exécuter le runbook AWSSupport-TroubleshootECSTaskFailedToStart :

1.Ouvrez la console AWS Systems Manager.

2.Dans le volet de navigation, sous Gestion des modifications, choisissez** Automatisation.**

3.Choisissez Exécuter l'automatisation.

4.Choisissez l'onglet Appartenant à Amazon.

5.Sous Document d'automatisation, recherchez** TroubleshootECSTaskFailedToStart**.

6.Sélectionnez la carte AWSSupport-TroubleshootECSTaskFailedToStart.
Remarque : assurez-vous de sélectionner le bouton radio de la carte et non le nom de l'automatisation en lien hypertexte.

7.Choisissez Suivant.
Remarque : Après l'exécution, les résultats de l'analyse sont renseignés dans la section Sortie globale. Attendez toutefois que le statut du document passe à ** Succès**. Surveillez également les éventuelles exceptions dans la section Sortie.

8.Pour Exécuter le document d’automatisation, choisissez Exécution simple.

9.Dans la section Paramètres d'entrée, pour AutomationAssumeRole, entrez l'ARN du rôle qui permet à Systems Manager Automation d'effectuer des actions.
**Remarque :**Assurez-vous que l’AutomationAssumeRole ou l'utilisateur ou le rôle IAM dispose des autorisations IAM requises pour exécuter le runbook AWSSupport-TroubleshootECSTaskFailedToStart. Si vous ne spécifiez pas de rôle IAM, alors Systems Manager Automation utilise les autorisations de l'utilisateur ou du rôle IAM qui exécute le runbook. Pour plus d'informations sur la création du rôle d'utilisateur pour Systems Manager Automation, consultez Tâche 1 : Créer une fonction du service pour Automation.

10.Pour ClusterName, entrez le nom du cluster dans lequel la tâche n'a pas pu démarrer.

11.Pour TaskId, entrez l'identification de la tâche qui a récemment échoué.

12.Choisissez Exécuter.

En fonction des résultats de l'automatisation, utilisez l'une des étapes de résolution manuelle des problèmes suivantes.

Copiez des images publiques dans un registre privé Amazon ECR

Créez un référentiel Amazon Elastic Container Registry (Amazon ECR), puis transférez l'image dans ce nouveau référentiel. Lorsque vous extrayez les images du référentiel Amazon ECR, vous pouvez éviter de dépasser la limite d'extraction de Docker Hub.

1.Exécutez une commande similaire à la suivante pour extraire l'image de Docker Hub :

docker pull example-image

2.Exécutez une commande similaire à la suivante pour authentifier votre client Docker afin qu'il accède au registre Amazon ECR :

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.Exécutez une commande similaire à la suivante pour baliser l'image à transférer vers votre référentiel :

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.Exécutez une commande similaire à la suivante pour transférer l'image Docker vers un registre Amazon ECR :

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.Exécutez une commande similaire à la suivante pour mettre à jour le fichier Docker afin d'utiliser l'image Amazon ECR récemment transférée comme image de base :

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

Dans les commandes précédentes, remplacez les valeurs suivantes par les vôtres :

  • exemple-image avec le nom de l'image publique que vous souhaitez transférer
  • 1111222233334444 par l’identifiant de votre compte
  • myrepository:latest par le nom de votre registre Amazon ECR
  • us-east-1 par la région de votre choix

Authentifier le tirage de Docker Hub

Lorsque vous vous authentifiez auprès de Docker Hub, vous êtes soumis à des limites de débit plus élevées en tant qu'utilisateur authentifié et vous êtes limité en fonction du nom d'utilisateur Docker. Enregistrez votre nom d'utilisateur et votre mot de passe Docker Hub comme secret dans AWS Secrets Manager, puis utilisez ce secret pour vous authentifier auprès de Docker Hub.

**Création d'un secret dans Secrets Manager pour les informations d'identification Docker Hub **

Pour créer un secret pour vos informations d'identification Docker Hub, suivez les instructions de la section Créer un secret de base dans Activer l'authentification du registre privé.

**Mettez à jour votre rôle IAM d'exécution de tâches **

Pour accorder à la tâche Amazon ECS l'accès au secret, ajoutez manuellement les autorisations requises en tant que politique intégrée au rôle d'exécution de la tâche.

1.Ouvrez la console IAM.

2.Dans le volet de navigation, choisissez Rôles.

3.Recherchez ecsTaskExecutionRole dans la liste des rôles, puis choisissez le rôle pour afficher les politiques associées.

4.Dans l’onglet Autorisations, choisissez Ajouter des autorisations, puis choisissez Créer une politique intégrée.

5.Sur la page Créer une politique, choisissez JSON, puis copiez et collez la politique suivante :

{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": [
			"secretsmanager:GetSecretValue",
			"kms:Decrypt"
		],
		"Resource": [
			"arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
			"arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
		]
	}]
}

Dans la politique précédente, remplacez les valeurs suivantes par les vôtres :

  • 1111222233334444 par l’identifiant de votre compte
  • eu-west-1 par la région de votre choix
  • mykey par votre Clé AWS KMS

**Remarque :**N'incluez kms:Decrypt que si votre clé utilise une clé AWS Key Management Service (AWS KMS) personnalisée. Ajoutez l'ARN de votre clé personnalisée en tant que ressource.

6.Choisissez Réviser la politique.

7.Dans le champ Nom, entrez le nom de la politique (ECSSecrets).

8.Choisissez Créer une politique.

Créez une définition de tâche qui utilise le secret pour l'authentification Docker

Suivez les instructions de la section Création d'une définition de tâche à l'aide de la console classique pour créer votre définition de tâche Amazon ECS. Dans le champ Rôle d'exécution de tâches, sélectionnez le rôle IAM d'exécution de tâches que vous avez mis à jour dans la section précédente.

Dans la section Définitions des conteneurs, procédez comme suit :

1.Choisissez Ajouter un conteneur.

2.Dans le champ Nom du conteneur, entrez le nom de votre conteneur.

3.Dans le champ Image, entrez le nom de l'image ou incluez le chemin d'accès à votre image privée (exemple : repository-url/image.tag).

4.Choisissez Authentification du référentiel privé.

5.Dans le champ ARN ou nom de Secrets Manager, entrez l'ARN du secret que vous avez créé.

6.Choisissez Ajouter.

Créez un cluster Amazon ECS et exécutez la tâche Amazon ECS

Créez un cluster Amazon ECS. Utilisez ensuite la définition de tâche que vous avez créée pour exécuter la tâche.

Utilisez le registre public Amazon ECR pour les images de conteneurs publics.

Décrivez les images publiques que vous utilisez dans le fichier Docker. Utilisez les filtres de recherche appropriés pour rechercher ces images dans la galerie publique Amazon ECR. Vous n'avez pas besoin de vous authentifier pour parcourir les référentiels publics et extraire des images. Amazon ECR Public contient des images de base populaires, notamment des systèmes d'exploitation, des images publiées par AWS, des modules complémentaires Kubernetes et des artefacts. Extrayez des images du registre public Amazon ECR pour éviter d'atteindre la limite de débit Docker Hub.

Utilisez ces images comme source pour l'image du conteneur dans la définition de votre tâche :

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

Vous pouvez également choisir d'utiliser ces images en tant qu’image de base dans votre fichier Docker :

Docker File  
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

Passez à un abonnement Docker Pro ou Team

Si vous avez besoin de plus d'extractions, rehaussez votre forfait pour un abonnement Docker Pro ou Team qui offre 50 000 extractions sur une période de 24 heures. Pour plus d'informations sur les plans tarifaires, consultez la section Tarification et abonnements (sur le site Web de Docker Hub).

Informations connexes

Tarification d'Amazon ECR

Service Quotas Amazon ECR Public

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