Come posso risolvere l'errore "CannotPullContainerError: Hai raggiunto il "limite di pull rate" in Amazon ECS?

8 minuti di lettura
0

Quando provo a estrarre immagini da Docker Hub, la mia attività Amazon Elastic Container Service (Amazon ECS) fallisce e viene visualizzato il seguente errore: "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: Hai raggiunto il limite di pull rate. Puoi aumentare il limite eseguendo l'autenticazione e l'aggiornamento: https://www.docker.com/increase-rate-limit"

Breve descrizione

Questo errore si verifica quando si tenta di estrarre un'immagine dal repository di Docker Hub pubblico (sul sito web di Docker Hub) dopo aver raggiunto il limite di pull rate di Docker (dal sito web di Docker Hub). Il superamento del limite di frequenza restituisce un codice di stato HTTP di 429. Docker Hub utilizza gli indirizzi IP per autenticare gli utenti e i limiti di pull rate si basano sui singoli indirizzi IP. Per gli utenti anonimi, il limite di frequenza è impostato a 100 pull ogni 6 ore per indirizzo IP. Per gli utenti autenticati con un Docker ID, la frequenza di pull è impostata su 200 pull per periodo di 6 ore. Se la richiesta di estrazione delle immagini supera questi limiti, Amazon ECS respinge tali richieste fino allo scadere della finestra di 6 ore. Se stai eseguendo il tuo carico di lavoro Amazon ECS o Amazon Elastic Kubernetes Service (Amazon EKS), i dati vengono prelevati attraverso un gateway NAT con un indirizzo IP fisso. In questo caso, la richiesta viene limitata quando si supera il limite di pull.

Usa il runbook AWSSupport-TroubleshootECSTaskFailedToStart per risolvere gli errori relativi alle attività Amazon ECS che non vengono avviate. Questa automazione esamina le seguenti configurazioni:

  • Connettività di rete al registro dei container configurato
  • Autorizzazioni AWS Identity and Access Management (IAM) mancanti richieste dal ruolo di esecuzione
  • Connettività degli endpoint del cloud privato virtuale (VPC)
  • Configurazione delle regole del gruppo di sicurezza
  • Riferimenti segreti di AWS Secrets Manager
  • Configurazione della registrazione

Soluzione

Importante:

  • usa il runbook AWSSupport-TroubleshootECSTaskFailedToStart nella stessa regione AWS in cui si trovano le risorse del tuo cluster ECS.
  • Quando si utilizza il runbook, è necessario utilizzare l'ultimo Task ID fallito. Se l'operazione non riuscita fa parte di Amazon ECS, utilizza l'ultima operazione fallita nel servizio. L'attività non riuscita deve essere visibile in ECS:DescribeTasks durante l'esecuzione dell'automazione. Per impostazione predefinita, le attività ECS interrotte sono visibili per 1 ora dopo l'immissione nello stato Interrotto. L'utilizzo dell'ID attività fallito più recente impedisce che la pulizia dello stato dell'attività interrompa l'analisi durante l'automazione.

Nota: se l'output del runbook non fornisce consigli, utilizza uno degli approcci manuali per la risoluzione dei problemi descritti nella sezione seguente.

Per eseguire il runbook AWSSupport-TroubleshootECSTaskFailedToStart:

1.    Apri la console AWS Systems Manager.

2.    Nel riquadro di navigazione, in Gestione delle modifiche, scegli Automazione.

3.    Scegli Esegui automazione.

4.    Seleziona la scheda Di proprietà di Amazon.

5.    Nel documento Automation, cerca TroubleshootECSTaskFailedToStart.

6.    Seleziona la scheda AWSSupport-TroubleshootECSTaskFailedToStart.
Nota: assicurati di selezionare il pulsante di opzione e non il nome dell'automazione con collegamento ipertestuale.

7.    Scegli Avanti.
Nota: dopo l'esecuzione, i risultati dell'analisi vengono inseriti nella sezione Output globale. Ad ogni modo, attendi che lo stato del documento passi a Operazione riuscita. Inoltre, controlla eventuali eccezioni nella sezione Output.

8.    In Esegui documento di automazione, seleziona Esecuzione semplice.

9.    Nella sezione Parametri di input, per AutomationAssumeRole, inserisci l'ARN del ruolo che consente a Systems Manager Automation di eseguire azioni.
Nota: assicurati che AutomationAssumeRole o l'utente o il ruolo IAM dispongano delle autorizzazioni IAM necessarie per eseguire il runbook AWSSupport-TroubleshootECSTaskFailedToStart. Se non specifichi un ruolo IAM, Systems Manager Automation utilizza le autorizzazioni dell'utente o del ruolo IAM che esegue il runbook. Per ulteriori informazioni sulla creazione del ruolo di assunzione per Systems Manager Automation, consulta Attività 1: Crea un ruolo di servizio per l'automazione.

10.    In ClusterName, inserisci il nome del cluster in cui l'attività non è stata avviata.

11.    Per TaskId, inserisci l'identificazione dell'operazione più recente non riuscita.

12.    Scegli Esegui.

In base all'output dell'automazione, utilizza una delle seguenti procedure manuali per la risoluzione dei problemi.

Copia immagini pubbliche in un registro privato Amazon ECR

Crea un repository Amazon Elastic Container Registry (Amazon ECR), quindi inserisci l'immagine in questo nuovo repository. Quando estrai le immagini dal repository Amazon ECR, potresti evitare di superare il limite di pull di Docker Hub.

1.    Esegui un comando simile al seguente per estrarre l'immagine da Docker Hub:

docker pull example-image

2.    Esegui un comando simile al seguente per autenticare il tuo client Docker per accedere al registro 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.    Esegui un comando simile al seguente per taggare l'immagine da inviare al tuo repository:

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

4.    Esegui un comando simile al seguente per inviare l'immagine Docker a un registro Amazon ECR:

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

5.    Esegui un comando simile al seguente per aggiornare il file Docker e utilizzare l'immagine Amazon ECR appena inviata come immagine di base:

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

Nei comandi precedenti, sostituisci i seguenti valori con i tuoi valori:

  • example-image con il nome dell'immagine pubblica che vuoi inviare
  • 1111222233334444 con l'ID del tuo account
  • myrepository:latest con il nome del tuo registro Amazon ECR
  • eu-west-1 con la regione di tua scelta

Autentica il pull di Docker Hub

Quando ti autentichi con Docker Hub, hai più limiti tariffari come utente autenticato e la tariffa è limitata in base al nome utente Docker. Memorizza il nome utente e la password di Docker Hub come segreti in AWS Secrets Manager, quindi utilizza questo segreto per autenticarti su Docker Hub.

Crea un segreto di Secrets Manager per le credenziali di Docker Hub

Per creare un segreto per le tue credenziali di Docker Hub, utilizza le istruzioni nella sezione Per creare un segreto di base in Abilitazione dell'autenticazione del registro privato.

Aggiorna il tuo ruolo IAM per l'esecuzione delle attività

Per concedere all'attività Amazon ECS l'accesso al segreto, aggiungi manualmente le autorizzazioni richieste come policy in linea al ruolo di esecuzione dell'attività.

1.    Apri la console IAM.

2.    Nel riquadro di navigazione, selezionaRuoli.

3.    Cerca nell'elenco dei ruoli ecsTaskExecutionRole, quindi scegli il ruolo per visualizzare le policy allegate.

4.    Nella scheda Autorizzazioni, scegli Aggiungi autorizzazioni, quindi seleziona Crea policy in linea.

5.    Nella pagina Crea policy, scegli JSON, quindi copia e incolla la seguente policy:

{
	"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"
		]
	}]
}

Nella policy precedente, sostituisci i seguenti valori con i tuoi valori:

  • 1111222233334444 con l'ID del tuo account
  • eu-west-1 con la regione di tua scelta
  • mykey con la tua chiave AWS KMS

Nota: includi kms:Decrypt solo se la tua chiave utilizza una chiave AWS Key Management Service (AWS KMS) personalizzata. Aggiungi l'ARN per la tua chiave personalizzata come risorsa.

6.    Scegli Verifica policy.

7.    In Nome, inserisci il nome della policy (ECSSecrets).

8.    Scegli Crea policy.

Crea una definizione di attività che utilizzi il segreto per l'autenticazione Docker

Segui le istruzioni in Creazione di una definizione di attività utilizzando la console classica per creare la definizione delle attività Amazon ECS. Per il ruolo di esecuzione delle attività, seleziona il ruolo IAM di esecuzione delle attività che hai aggiornato nella sezione precedente.

Nella sezione Definizioni dei container, completa i seguenti passaggi:

1.     Scegli Aggiungi container.

2.    In Nome container, inserisci il nome del container.

3.     In Immagine, inserisci il nome dell'immagine o includi il percorso della tua immagine privata (esempio: repository-url/image.tag).

4.    Scegli Autenticazione dell'archivio privato.

5.    In ARN o nome di Secrets Manager, inserisci l'ARN del segreto che hai creato.

6.    Scegli Aggiungi.

Crea un cluster Amazon ECS ed esegui l'attività Amazon ECS

Crea un cluster Amazon ECS. Quindi, utilizza la definizione dell'attività creata per eseguire l'attività.

Usa il registro pubblico di Amazon ECR per le immagini dei container pubblici

Identifica le immagini pubbliche che stai utilizzando nel file Docker. Utilizza i filtri di ricerca appropriati per cercare queste immagini nella Amazon ECR Public Gallery. Non è necessario autenticarsi per sfogliare gli archivi pubblici ed estrarre immagini. Amazon ECR Public contiene le immagini di base più diffuse, tra cui sistemi operativi, immagini pubblicate da AWS, componenti aggiuntivi Kubernetes e artefatti. Estrai immagini dal registro pubblico di Amazon ECR per evitare di raggiungere il limite di velocità di Docker Hub.

Usa queste immagini come fonte per l'immagine del container nella definizione dell'attività:

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

Puoi anche scegliere di utilizzare queste immagini come immagine di base nel tuo file Docker:

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

Esegui l'upgrade a un abbonamento Docker Pro o Team

Se hai bisogno di più pull, aggiorna il tuo piano a un abbonamento Docker Pro o Team che offre 50.000 pull in un periodo di 24 ore. Per ulteriori informazioni sui piani tariffari, consulta Prezzi e abbonamenti (dal sito web di Docker Hub).

Informazioni correlate

Prezzi Amazon ECR

Quote di servizio pubblico Amazon ECR

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa