Comment résoudre l'erreur « CannotPullContainerError: You have reached your pull rate limit » (Impossible d'extraire le conteneur Vous avez atteint votre limite de taux d'extraction) dans Amazon ECS ?

Dernière mise à jour : 25/03/2022

Lorsque j'essaie d'extraire des images depuis Docker Hub, ma tâche Amazon Elastic Container Service (Amazon ECS) échoue avec l'erreur suivante :

CannotPullContainerError: inspect image has been retried 5 time(s): httpReaderSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. (Impossible d'extraire le conteneur : l'inspection de l'image a été relancée 5 fois : httpReaderSeeker : ouverture ratée : code de statut inattendu https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Trop de demandes – Message du serveur : toomanyrequests : Vous avez atteint votre limite de 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 s'affiche lorsque vous essayez d'extraire une image du référentiel Docker Hub public une fois que vous avez atteint votre limite de taux d'extraction Docker, et qu'un code d'état http 429 est renvoyé. Docker Hub utilise des adresses IP pour authentifier les utilisateurs, et 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, ces demandes sont refusées jusqu'à ce que la fenêtre de six heures soit écoulée. Si vous exécutez votre charge de travail Amazon ECS/Amazon EKS la plupart des données sont extraites via une passerelle NAT dotée d'une adresse IP fixe. Dans ce cas, la demande est limitée lorsque vous dépassez la limite d'extraction.

Solution

Utilisez l'une des solutions de contournement suivantes pour résoudre ce problème.

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. Avec cette approche, vous pouvez éviter de dépasser la limite d'extraction de Docker Hub en extrayant les images du référentiel Amazon ECR.

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 d'accéder 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 étiqueter l'image à envoyer à votre dépôt :

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

Assurez-vous de remplacer ce qui suit dans les commandes précédentes :

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

Authentifier l'extraction Docker Hub

Si vous vous authentifiez auprès de Docker Hub, vous avez plus de limites de débit en tant qu'utilisateur authentifié et le débit est limité en fonction du nom d'utilisateur Docker. Vous pouvez stocker votre nom d'utilisateur et votre mot de passe Docker Hub en tant que secret dans AWS Secrets Manager, puis utiliser ce secret pour vous authentifier auprès de Docker Hub.

Créer 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 Pour créer un secret de base dans Activation de l'authentification du registre privé.

Mettez à jour votre rôle d'exécution des tâches AWS Identity and Access Management (AWS IAM)

Pour accorder l'accès à la tâche Amazon ECS au secret que vous avez créé, vous devez ajouter manuellement les autorisations requises en tant que politique en ligne au rôle d'exécution des tâches.

1.    Ouvrez la console IAM.

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

3.    Recherchez ecsTaskExecutionRole dans la liste des rôles et choisissez le rôle pour afficher les politiques attachées.

4.    Dans l'onglet Permissions (Autorisations), choisissez Add permissions (Ahjouter des autorisations), puis Create inline policy (Créer une politique en ligne).

5.    Dans la page Create policy (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"
  ]
 }]
}

Assurez-vous de remplacer ce qui suit dans la politique :

  • 1111222233334444 par l'ID de votre compte
  • us-east-1 par la Région de votre choix
  • mykey par votre clé AWS KMS

Remarque : n'incluez KMS:Decrypt que si votre clé n'utilise pas la clé par défaut et utilise une clé AWS Key Management Service (AWS KMS) personnalisée. Ajoutez l'ARN de votre clé personnalisée en tant que ressource.

6.    Sélectionnez Review policy (Examiner une politique).

7.    Pour Name (Nom), saisissez le nom de la politique (ECSSecrets).

8.    Choisissez Create policy (Créer une politique).

Créer 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. Pour Rôle d'exécution des tâches, veillez à sélectionner le rôle IAM d'exécution des tâches que vous avez mis à jour dans la section précédente.

Dans la section Container definitions (Définitions du conteneur), procédez comme suit :

  1. Choisissez Add container (Ajouter un conteneur).
  2. Pour Container name (Nom du conteneur), saisissez le nom de votre conteneur.
  3. Pour Image, saisissez le nom de l'image ou indiquez le chemin d'accès à votre image privée (exemple : url-repository-url/image.tag).
  4. Sélectionnez Private repository authentication (Authentification du référentiel privé).
  5. Pour Secrets Manager ARN or name (ARN ou le nom de Secrets Manager), saisissez l'ARN du secret que vous avez créé.
  6. Choisissez Add (Ajouter).

Créer un cluster Amazon ECS et exécuter la tâche Amazon ECS

Créez un cluster Amazon ECS. Ensuite, exécutez la tâche à l'aide de la définition de tâche que vous avez créée dans la section précédente.

Utiliser le registre public Amazon ECR pour les images de conteneurs publics

Identifiez les images publiques que vous utilisez dans le fichier Docker. Recherchez ces images dans la galerie publique Amazon ECR à l'aide des filtres de recherche appropriés. Vous n'avez pas besoin de vous authentifier pour parcourir les référentiels publics et extraire des images. Le registre public Amazon ECR 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. Vous pouvez éviter d'atteindre la limite de débit du Docker Hub en extrayant des images du registre public Amazon ECR.

Vous pouvez utiliser ces images comme source de l'image de conteneur dans votre définition de tâche :

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

Vous pouvez également choisir d'utiliser ces images comme image de base dans votre fichier Docker :

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

Passer à un abonnement Docker Pro ou Team

Vous pouvez mettre à niveau votre plan vers un abonnement Docker Pro ou Team qui offre 50 000 extractions par période de 24 heures. Pour plus d'informations sur les plans tarifaires, consultez la page Tarification Docker Hub.


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


Avez-vous besoin d'aide pour une question technique ou de facturation ?