Wie behebe ich den Fehler „CannotPullContainerError: Sie haben Ihr Pull-Rate-Limit erreicht“ in Amazon ECS?

Lesedauer: 8 Minute
0

Wenn ich versuche, Images von Docker Hub abzurufen, schlägt meine Amazon Elastic Container Service (Amazon ECS)-Aufgabe mit dem folgenden Fehler fehl: „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: Sie haben Ihr Pull-Rate-Limit erreicht. Sie können das Limit erhöhen, indem Sie sich authentifizieren und ein Upgrade durchführen: https://www.docker.com/increase-rate-limit“

Kurzbeschreibung

Dieser Fehler tritt auf, wenn Sie versuchen, ein Bild aus dem öffentlichen Docker Hub-Repository (auf der Docker Hub-Website) abzurufen, nachdem Sie Ihr Docker-Pull-Rate-Limit (von der Docker Hub-Website) erreicht haben. Wenn Sie Ihr Ratenlimit überschreiten, wird der HTTP-Statuscode 429 zurückgegeben. Docker Hub verwendet IP-Adressen zur Authentifizierung der Benutzer, und die Pull-Rate-Limits basieren auf einzelnen IP-Adressen. Für anonyme Benutzer ist das Ratenlimit auf 100 Pulls pro 6 Stunden pro IP-Adresse festgelegt. Für authentifizierte Benutzer mit einer Docker-ID ist die Pull-Rate auf 200 Pulls pro 6 Stunden festgelegt. Wenn Ihre Image-Pull-Anfrage diese Grenzwerte überschreitet, lehnt Amazon ECS diese Anfragen ab, bis das 6-Stunden-Fenster abgelaufen ist. Wenn Sie Ihre Amazon ECS- oder Amazon Elastic Kubernetes Service (Amazon EKS)-Workload ausführen, werden die Daten über ein NAT-Gateway mit einer festen IP-Adresse abgerufen. In diesem Fall wird die Anfrage gedrosselt, wenn Sie das Pull-Limit überschreiten.

Verwenden Sie das Runbook AWSSupport-TroubleshootECSTaskFailedToStart, um Fehler für Amazon ECS-Aufgaben zu beheben, die nicht gestartet werden können. Diese Automatisierung überprüft die folgenden Konfigurationen:

  • Netzwerkkonnektivität zur konfigurierten Container-Registry
  • Fehlende AWS Identity and Access Management (IAM)-Berechtigungen, die für die Ausführungsrolle erforderlich sind
  • Endpunktkonnektivität für Virtual Private Cloud (VPC)
  • Konfiguration von Sicherheitsgruppenregeln
  • Referenzen zu Geheimnissen von AWS Secrets Manager
  • Konfiguration protokollieren

Behebung

Wichtig:

  • Verwenden Sie das Runbook AWSSupport-TroubleshootECSTaskFailedToStart in derselben AWS-Region, in der sich Ihre ECS-Cluster-Ressourcen befinden.
  • Wenn Sie das Runbook verwenden, müssen Sie die Task-ID verwenden, die zuletzt ausgefallen ist. Wenn die fehlgeschlagene Aufgabe Teil von Amazon ECS ist, verwenden Sie die zuletzt fehlgeschlagene Aufgabe im Service. Die fehlgeschlagene Aufgabe muss während der Ausführung der Automatisierung in ECS:DescribeTasks sichtbar sein. Standardmäßig sind gestoppte ECS-Aufgaben 1 Stunde lang sichtbar, nachdem sie in den Status Gestoppt gewechselt sind. Die Verwendung der ID der zuletzt fehlgeschlagenen Aufgabe verhindert, dass die Bereinigung des Aufgabenstatus die Analyse während der Automatisierung unterbricht.

**Hinweis:**Wenn die Ausgabe des Runbooks keine Empfehlungen enthält, verwenden Sie die einen der manuellen Ansätze zur Fehlerbehebung im folgenden Abschnitt.

So führen Sie das Runbook AWSSupport-TroubleshootECSTaskFailedToStart aus:

1.Öffnen Sie die AWS Systems Manager-Konsole.

2.Wählen Sie im Navigationsbereich unter Management ändern die Option Automatisierung aus.

3.Wählen Sie Automatisierung ausführen aus.

4.Wählen Sie die Registerkarte Owned by Amazon aus.

5.Suchen Sie unter Automatisierungsdokument nach TroubleshootECSTaskFailedToStart.

6.Wählen Sie die Karte AWSSupport-TroubleshootECSTaskFailedToStart aus.
**Hinweis:**Stellen Sie sicher, dass Sie das Optionsfeld auf der Karte und nicht den mit einem Hyperlink versehenen Automatisierungsnamen auswählen.

7.Wählen Sie Weiter aus.
Hinweis: Nach der Ausführung werden die Analyseergebnisse in den Abschnitt Globale Ausgabe eingetragen. Warten Sie jedoch, bis der Status des Dokuments auf Erfolgreich wechselt. Achten Sie außerdem auf Ausnahmen im Abschnitt Ausgabe.

8.Wählen Sie bei Automatisierungsdokument ausführen die Option Einfache Ausführung.

9.Geben Sie im Abschnitt Eingabeparameter für AutomationAssumeRole den ARN der Rolle ein, die Systems Manager Automation das Ausführen von Aktionen ermöglicht.
**Hinweis:**Stellen Sie sicher, dass entweder der AutomationAssumeRole- oder der IAM-Benutzer oder die IAM-Rolle über die erforderlichen IAM-Berechtigungen verfügt, um das Runbook „AWSSupport-TroubleshootECSTaskFailedToStart“ auszuführen. Wenn Sie keine IAM-Rolle angeben, verwendet Systems Manager Automation die Berechtigungen des IAM-Benutzers oder der IAM-Rolle, die das Runbook ausführt. Weitere Informationen zum Erstellen der zu übernehmenden Rolle für Systems Manager Automation finden Sie unter Aufgabe 1: Erstellen einer Servicerolle für Automation.

10.Geben Sie für ClusterName den Namen des Clusters ein, in dem die Aufgabe nicht gestartet werden konnte.

11.Geben Sie für TaskId die Identifikation der zuletzt fehlgeschlagenen Aufgabe ein.

12.Wählen Sie Ausführen aus.

Verwenden Sie basierend auf der Ausgabe der Automatisierung einen der folgenden manuellen Schritte zur Fehlerbehebung.

Öffentliche Bilder in eine private Amazon ECR-Registry kopieren

Erstellen Sie ein Amazon Elastic Container Registry (Amazon ECR)-Repository und übertragen Sie das Bild dann in dieses neue Repository. Wenn Sie die Bilder aus dem Amazon ECR-Repository abrufen, vermeiden Sie möglicherweise, das Docker Hub-Pull-Limit zu überschreiten.

1.Führen Sie einen Befehl wie den folgenden aus, um das Bild vom Docker Hub abzurufen:

docker pull example-image

2.Führen Sie einen Befehl ähnlich dem folgenden aus, um Ihren Docker-Client für den Zugriff auf die Amazon ECR-Registry zu authentifizieren:

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

3.Führen Sie einen Befehl ähnlich dem folgenden aus, um das Bild zu kennzeichnen, das in Ihr Repository übertragen werden soll:

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

4.Führen Sie einen Befehl ähnlich dem folgenden aus, um das Docker-Bild in eine Amazon ECR-Registry zu übertragen:

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

5.Führen Sie einen Befehl ähnlich dem folgenden aus, um die Docker-Datei zu aktualisieren und das neu gepushte Amazon ECR-Bild als Basis-Bild zu verwenden:

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

Ersetzen Sie in den vorherigen Befehlen die folgenden Werte durch Ihre Werte:

  • example-image mit dem Namen des öffentlichen Bildes, das Sie veröffentlichen möchten
  • 1111222233334444 mit Ihrer Konto-ID
  • myrepository:latest mit dem Namen Ihrer Amazon ECR-Registry
  • eu-west-1 mit der Region Ihrer Wahl

Authentifizieren des Docker Hub-Pulls

Wenn Sie sich mit Docker Hub authentifizieren, haben Sie als authentifizierter Benutzer mehr Ratenbegrenzungen und die Rate ist auf der Grundlage des Docker-Benutzernamens begrenzt. Speichern Sie Ihren Docker Hub-Benutzernamen und Ihr Passwort als Geheimnis im AWS Secrets Manager und verwenden Sie dieses Geheimnis dann zur Authentifizierung bei Docker Hub.

Erstellen eines Secrets Manager-Geheimnisses für Docker Hub-Anmeldeinformationen

Um ein Geheimnis für Ihre Docker Hub-Anmeldeinformationen zu erstellen, befolgen Sie die Anweisungen im Abschnitt So erstellen Sie ein grundlegendes Geheimnis in Private Registry-Authentifizierung aktivieren.

Aktualisieren Ihrer IAM-Rolle zur Aufgabenausführung

Um der Amazon ECS-Aufgabe Zugriff auf das Geheimnis zu gewähren, fügen Sie die erforderlichen Berechtigungen manuell als Inline-Richtlinie zur Rolle der Aufgabenausführung hinzu.

1.Öffnen Sie die IAM-Konsole.

2.Wählen Sie im Navigationsbereich Rollen aus.

3.Durchsuchen Sie die Liste der Rollen nach ecsTaskExecutionRole und wählen Sie dann die Rolle aus, um die angehängten Richtlinien anzuzeigen.

4.Wählen Sie auf der Registerkarte Berechtigungen die Option Berechtigungen hinzufügen und dann Inline-Richtlinie erstellen aus.

5.    Wählen Sie auf der Seite Richtlinie erstellen die Option JSON aus, kopieren Sie dann die folgende Richtlinie und fügen Sie sie ein:

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

Ersetzen Sie in der vorherigen Richtlinie die folgenden Werte durch Ihre Werte:

  • 1111222233334444 mit Ihrer Konto-ID
  • eu-west-1 mit der Region Ihrer Wahl
  • mykey mit Ihrem AWS-KMS-Schlüssel

Hinweis: Fügen Sie kms:Decrypt nur ein, wenn Ihr Schlüssel einen benutzerdefinierten AWS Key Management Service (AWS KMS)-Schlüssel verwendet. Fügen Sie den ARN für Ihren benutzerdefinierten Schlüssel als Ressource hinzu.

6.Wählen Sie Richtlinie überprüfen aus.

7.Geben Sie für Name den Namen der Richtlinie ein (ECSSecrets).

8.Wählen Sie Richtlinie erstellen aus.

Erstellen einer Aufgabendefinition, die das Geheimnis für die Docker-Authentifizierung verwendet

Folgen Sie den Anweisungen unter Erstellen einer Aufgabendefinition mithilfe der klassischen Konsole, um Ihre Amazon ECS-Aufgabendefinition zu erstellen. Wählen Sie für Rolle zur Aufgabenausführung die IAM-Rolle zur Aufgabenausführung aus, die Sie im vorherigen Abschnitt aktualisiert haben.

Führen Sie im Abschnitt Container-Definitionen die folgenden Schritte aus:

1.Wählen Sie Container hinzufügen aus.

2.Geben Sie als Container-Name den Namen Ihres Containers ein.

3.Geben Sie für Bild den Namen des Bildes ein oder geben Sie den Pfad zu Ihrem privaten Bild an (Beispiel: repository-url/image.tag).

4.Wählen Sie Private Repository-Authentifizierung aus.

5.Geben Sie für Secrets Manager ARN oder Name den ARN des von Ihnen erstellten Geheimnisses ein.

6.Wählen Sie Hinzufügen aus.

Erstellen eines Amazon ECS-Clusters und Ausführen der Amazon ECS-Aufgabe

Erstellen Sie einen Amazon ECS-Cluster. Verwenden Sie dann die Aufgabendefinition, die Sie erstellt haben, um die Aufgabe auszuführen.

Verwenden der öffentliche Amazon ECR-Registry für öffentliche Container-Bilder

Identifizieren Sie die öffentlichen Bilder, die Sie in der Docker-Datei verwenden. Verwenden Sie die entsprechenden Suchfilter, um in der Amazon ECR Public Gallery nach diesen Bildern zu suchen. Sie müssen sich nicht authentifizieren, um die öffentlichen Repositorys zu durchsuchen und Bilder abzurufen. Amazon ECR Public enthält beliebte Basis-Bilder, darunter Betriebssysteme, von AWS veröffentlichte Bilder, Kubernetes-Add-ons und Artefakte. Rufen Sie Bilder aus der öffentlichen Amazon ECR-Registry ab, um zu vermeiden, dass das Ratenlimit des Docker Hubs erreicht wird.

Verwenden Sie diese Bilder als Quelle für das Container-Bild in Ihrer Aufgabendefinition:

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

Sie können diese Bilder auch als Basis-Bild in Ihrer Docker-Datei verwenden:

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

Upgrade auf ein Docker Pro- oder Team-Abonnement

Wenn Sie mehr Pulls benötigen, aktualisieren Sie Ihren Plan auf ein Docker Pro- oder Team-Abonnement, das 50.000 Pulls in einem Zeitraum von 24 Stunden bietet. Weitere Informationen zu Preisplänen finden Sie unter Preise und Abonnements (auf der Docker Hub-Website).

Verwandte Informationen

Amazon ECR-Preise

Öffentliche Amazon ECR Service Quotas

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr