Wie behebe ich den Fehler „CannotPullContainerError: You have reached your pull rate limit“ in Amazon ECS?
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: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit“
Kurzbeschreibung
Dieser Fehler tritt auf, wenn du versuchst, ein Bild aus dem öffentlichen Docker Hub-Repository (auf der Docker Hub-Website) abzurufen, nachdem du dein Docker-Pull-Rate-Limit (von der Docker Hub-Website) erreicht hast. Wenn du dein Rate-Limit überschreitest, 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 Rate-Limit 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 deine Image-Pull-Anfrage diese Grenzwerte überschreitet, lehnt Amazon ECS diese Anfragen ab, bis das 6-Stunden-Fenster abgelaufen ist. Wenn du deine Amazon ECS- oder Amazon Elastic Kubernetes Service (Amazon EKS)-Workload ausführst, werden die Daten über ein NAT-Gateway mit einer festen IP-Adresse abgerufen. In diesem Fall wird die Anfrage gedrosselt, wenn du das Pull-Limit überschreitest.
Verwende 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
Lösung
Wichtig:
- Verwende das AWSSupport-TroubleshootECSTaskFailedToStart-Runbook in derselben AWS-Region, in der sich auch deine ECS-Cluster-Ressourcen befinden.
- Wenn du das Runbook verwendest, musst du die Task-ID verwenden, die zuletzt ausgefallen ist. Wenn die fehlgeschlagene Aufgabe Teil von Amazon ECS ist, verwende 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 den Status Stopped (Gestoppt) erreicht haben. Durch die Verwendung der letzten fehlgeschlagenen Aufgaben-ID wird verhindert, dass die Aufgabenstatusbereinigung die Analyse während der Automatisierung unterbricht.
Hinweis: Wenn die Ausgabe des Runbooks keine Empfehlungen enthält, verwende einen der manuellen Ansätze zur Fehlerbehebung im folgenden Abschnitt.
So führst du das Runbook AWSSupport-TroubleshootECSTaskFailedToStart aus:
- Öffne die AWS Systems Manager-Konsole.
- Wähle im Navigationsbereich unter Change Management (Änderungsmanagement) die Option Automation (Automatisierung).
- Wähle Execute automation (Automatisierung ausführen).
- Wähle die Registerkarte Owned by Amazon (Eigentum von Amazon).
- Suche unter Automation document (Automatisierungsdokument) nach TroubleshootECSTaskFailedToStart.
- Wähle die Karte AWSSupport-TroubleshootECSTaskFailedToStart aus.
Hinweis: Stelle sicher, dass du den Auswahlknopf auf der Karte und nicht den mit einem Hyperlink versehenen Automatisierungsnamen auswählst. - Wähle Next (Weiter) aus.
Hinweis: Nach der Ausführung werden die Analyseergebnisse in den Abschnitt Global output (Globale Ausgabe) eingetragen. Warte jedoch, bis der Status des Dokuments auf Success (Erfolgreich) wechselt. Achte außerdem auf Ausnahmen im Abschnitt Output (Ausgabe). - Wähle für Execute automation document (Automatisierungsdokument ausführen) Simple execution (Einfache Ausführung).
- Gib im Abschnitt Input parameters (Eingabeparameter) für AutomationAssumeRole den ARN der Rolle ein, die es der Systems Manager-Automatisierung ermöglicht, Aktionen durchzuführen.
Hinweis: Stelle sicher, dass entweder die AutomationAssumeRole oder der IAM-Benutzer oder die IAM-Rolle über die erforderlichen IAM-Berechtigungen zum Ausführen des AWSSupport-TroubleshootECSTaskFailedToStart-Runbooks verfügt. Wenn du keine IAM-Rolle angibst, verwendet Systems Manager Automation die Berechtigungen des IAM-Benutzers oder der IAM-Rolle, die das Runbook ausführt. Weitere Informationen zum Erstellen der Assume Role für die Systems Manager-Automatisierung findest du unter Task 1: Create a service role for Automation (Aufgabe 1: Erstelle eine Servicerolle für Automation). - Gib für ClusterName den Cluster-Namen ein, auf dem die Aufgabe nicht gestartet werden konnte.
- Gib für TaskId, die Kennung für die Aufgabe ein, die zuletzt fehlgeschlagen ist.
- Wähle Execute (Ausführen).
Verwende auf der Grundlage der Ergebnisse der Automatisierung einen der folgenden manuellen Schritte zur Fehlerbehebung.
Öffentliche Images in eine private Amazon ECR-Registry kopieren
Erstelle ein Amazon Elastic Container Registry (Amazon ECR)-Repository und übertrage das Image dann in dieses neue Repository. Wenn du die Images aus dem Amazon ECR-Repository abrufst, vermeidest du möglicherweise, das Docker Hub-Pull-Limit zu überschreiten.
-
Führe einen ähnlichen Befehl wie den folgenden aus, um das Image von Docker Hub abzurufen:
docker pull example-image -
Führe einen Befehl ähnlich dem folgenden aus, um deinen 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 123456789012.dkr.ecr.eu-west-1.amazonaws.com -
Führe einen Befehl ähnlich dem folgenden aus, um das Image zu taggen, damit es in dein Repository übertragen wird:
docker tag myrepository:latest 123456789012.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest -
Führe einen Befehl ähnlich dem folgenden aus, um das Docker-Image in eine Amazon ECR-Registry zu übertragen:
docker push 123456789012.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest -
Führe einen Befehl ähnlich dem folgenden aus, um die Docker-Datei so zu aktualisieren, dass das neu übertragene Amazon ECR-Image als Basis-Image verwendet wird:
FROM 123456789012.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag
Ersetze in den vorherigen Befehlen die folgenden Werte durch deine Werte:
- example-image durch den Namen des öffentlichen Images, das du veröffentlichen möchtest
- 123456789012 durch deine Konto-ID
- myrepository:latest durch den Namen deiner Amazon ECR-Registry
- eu-west-1 durch die Region deiner Wahl
Authentifizieren des Docker Hub-Pulls
Wenn du dich bei Docker Hub authentifizierst, hast du als authentifizierter Benutzer höhere Ratenlimits und die Rate ist auf der Grundlage des Docker-Benutzernamens begrenzt. Speichere deinen Docker Hub-Benutzernamen und dein Passwort als Geheimnis im AWS Secrets Manager und verwende dieses Geheimnis dann zur Authentifizierung bei Docker Hub.
Erstellen eines Secrets Manager-Geheimnisses für Docker Hub-Anmeldeinformationen
Um ein Geheimnis für deine Docker Hub-Anmeldeinformationen zu erstellen, befolge die Anweisungen im Abschnitt To create a basic secret (So erstellst du ein grundlegendes Geheimnis) in Turning on private registry authentication (Private Registry-Authentifizierung aktivieren).
Aktualisieren deiner IAM-Rolle zur Aufgabenausführung
Um der Amazon ECS-Aufgabe Zugriff auf das Geheimnis zu gewähren, füge die erforderlichen Berechtigungen manuell als Inline-Richtlinie zur Rolle der Aufgabenausführung hinzu.
- Öffne die IAM-Konsole.
- Wähle im Navigationsbereich Roles (Rollen) aus.
- Durchsuche die Liste der Rollen nach ecsTaskExecutionRole und wähle dann die Rolle aus, um die angefügten Richtlinien anzuzeigen.
- Wähle auf der Registerkarte Permissions (Berechtigungen) Add permissions (Berechtigungen hinzufügen) und dann Create inline policy (Inline-Richtlinie erstellen).
- Wähle auf der Seite Create policy (Richtlinie erstellen) JSON aus und kopiere die folgende Richtlinie und füge sie ein:
Ersetze in der vorherigen Richtlinie die folgenden Werte durch deine Werte:{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:eu-west-1:123456789012:secret:dockerhub-0knT", "arn:aws:kms:eu-west-1:123456789012:key/mykey" ] }] }
123456789012 durch deine Konto-ID
eu-west-1 durch die Region deiner Wahl
mykey durch deinen AWS-KMS-Schlüssel
Hinweis: Füge kms:Decrypt nur hinzu, wenn dein Schlüssel einen benutzerdefinierten AWS Key Management Service (AWS KMS)-Schlüssel verwendet. Füge den ARN für deinen benutzerdefinierten Schlüssel als Ressource hinzu. - Wähle Review policy (Richtlinie überprüfen).
- Gib für Name den Namen der Richtlinie (ECSSecrets) ein.
- Wähle Create policy (Richtlinie erstellen).
Erstellen einer Aufgabendefinition, die das Geheimnis für die Docker-Authentifizierung verwendet
Befolge die Anweisungen unter Creating a task definition using the classic console (Erstellen einer Aufgabendefinition mithilfe der klassischen Konsole), um deine Amazon ECS-Aufgabendefinition zu erstellen. Wähle für Task execution role (Aufgabenausführungsrolle) die IAM-Rolle zur Aufgabenausführung aus, die du im vorherigen Abschnitt aktualisiert hast.
- Führe im Abschnitt Container definitions (Container-Definitionen) die folgenden Schritte aus:
- Wähle Add container (Container hinzufügen).
- Gib für Container name (Containername) den Namen deines Containers ein.
- Gib für Image den Namen des Images ein oder gib den Pfad zu deinem privaten Image an (Beispiel: repository-url/image.tag).
- Wähle Private repository authentication (Authentifizierung des privaten Repositorys).
- Gib für Secrets Manager ARN or name (ARN oder Name des Secrets Manager) den ARN des Geheimnisses ein, das du erstellt hast.
- Wähle Add (Hinzufügen) aus.
Erstellen eines Amazon ECS-Clusters und Ausführen der Amazon ECS-Aufgabe
Erstelle einen Amazon ECS-Cluster. Verwende dann die Aufgabendefinition, die du erstellt hast, um die Aufgabe auszuführen.
Verwenden der öffentliche Amazon ECR-Registry für öffentliche Container-Images
Identifiziere die öffentlichen Images, die du in der Docker-Datei verwendest. Verwende die entsprechenden Suchfilter, um nach diesen Images in der Amazon ECR Public Gallery zu suchen. Du musst dich nicht authentifizieren, um die öffentlichen Repositorys zu durchsuchen und Images abzurufen. Amazon ECR Public enthält beliebte Basis-Images, darunter Betriebssysteme, von AWS veröffentlichte Images, Kubernetes-Add-ons und Artefakte. Rufe Images aus der öffentlichen Amazon ECR-Registry ab, um zu vermeiden, dass das Ratenlimit des Docker Hubs erreicht wird.
Verwende diese Images als Quelle für das Container-Image in deiner Aufgabendefinition:
ContainerDefinitions: [ { ... Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest' ... } ]
Du kannst diese Images auch als Basis-Image in deiner Docker-Datei verwenden:
Docker File FROM public.ecr.aws/amazonlinux/amazonlinux:latest
Upgrade auf ein Docker Pro- oder Team-Abonnement
Wenn du mehr Pulls benötigst, aktualisiere deinen Plan auf ein Docker Pro- oder Team-Abonnement, das 50.000 Pulls innerhalb von 24 Stunden bietet. Weitere Informationen zu Preisplänen findest du unter Pricing and subscriptions (Preise und Abonnements) (auf der Docker Hub-Website).
Ähnliche Informationen
Amazon-Elastic-Container-Registry – Preise
Amazon ECR Public service quotas (Öffentliche Amazon ECR Service Quotas)
- Themen
- Containers
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 2 Jahren