Wie behebe ich den Fehler „CannotPullContainerError: You have reached your pull rate limit“ in Amazon ECS?

Letzte Aktualisierung: 25.03.2022

Wenn ich versuche, Images aus dem Docker Hub abzurufen, kann meine Aufgabe im Amazon Elastic Container Service (Amazon ECS) nicht ausgeführt werden, und es wird folgende Fehlermeldung ausgegeben:

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. Durch Authentifizierung und Upgrade können Sie das Limit erhöhen: https://www.docker.com/increase-rate-limit

Kurzbeschreibung

Dieser Fehler tritt auf, wenn Sie versuchen, ein Image aus dem öffentlichen Docker-Hub-Repository abzurufen, nachdem Sie Ihr Docker-Pull-Rate-Limit erreicht haben. Es 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 Zeitraum von 6 Stunden festgelegt. Wenn Ihre Anforderungen zum Abrufen von Images diese Grenzwerte überschreiten, werden diese Anforderungen abgelehnt, bis das Sechs-Stunden-Fenster verstrichen ist. Wenn Sie Ihre Workload in Amazon ECS/Amazon EKS ausführen, werden die meisten Daten über ein NAT-Gateway mit einer festen IP-Adresse abgerufen. In diesem Fall wird die Anforderung gedrosselt, wenn Sie das Pull-Limit überschreiten.

Auflösung

Mit einer der folgenden Umgehungslösungen können Sie dieses Problem beheben.

Öffentliche Images in eine private Amazon ECR-Registrierung kopieren

Erstellen Sie ein Repository im Amazon Elastic Container Registry (Amazon ECR) und übertragen Sie das Image dann in dieses neue Repository. Mit dieser Vorgehensweise können Sie das Überschreiten des Pull-Limits für den Docker Hub möglicherweise dadurch vermeiden, dass die Images aus dem Amazon ECR-Repository abgerufen werden.

1.    Führen Sie einen Befehl ähnlich dem folgenden aus, um das Image aus dem 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-Registrierung 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 Image zu markieren, 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-Image in eine Amazon ECR-Registrierung 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 Dockerdatei zu aktualisieren und das neu übertragene Amazon ECR-Image als Basisimage zu verwenden:

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

Ersetzen Sie unbedingt Folgendes in den vorhergehenden Befehlen:

  • example-image durch den Namen des öffentlichen Images, das Sie übertragen möchten
  • 1111222233334444 durch Ihre Konto-ID
  • myrepository:latest durch den Namen Ihrer Amazon ECR-Registrierung
  • eu-west-1 durch die Region Ihrer Wahl

Docker-Hub-Pull authentifzieren

Wenn Sie sich bei Docker Hub authentifizieren, haben Sie als authentifizierter Benutzer höhere Rate-Limits und die Rate-Limits basieren auf dem Docker-Benutzernamen. Sie können Ihren Docker-Hub-Benutzernamen und Ihr Passwort als Secret im AWS Secrets Manager speichern und dieses Secret dann zur Authentifzierung bei Docker Hub verwenden.

Ein Secret im Secrets Manager für Docker-Hub-Anmeldeinformationen erstellen

Gehen Sie zum Erstellen eines Secrets für Ihre Docker-Hub-Anmeldeinformationen nach den Anweisungen im Abschnitt Erstellen eines Basic Secrets unter Aktivieren der privaten Registrierungsauthentifikation vor.

Aktualisieren Sie Ihre AWS Identity and Access Management-Rolle (AWS IAM) für die Aufgabenausführung

Um der Amazon ECS-Aufgabe den Zugriff auf das von Ihnen erstellte Secret zu gewähren, müssen Sie die erforderlichen Berechtigungen manuell als Inline-Richtlinie zur Aufgabenausführungsrolle hinzufügen.

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 die Rolle aus, um die zugeordneten 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 und fügen Sie dann die folgende Richtlinie 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 Richtlinie unbedingt Folgendes:

  • 1111222233334444 durch Ihre Konto-ID
  • eu-west-1 durch die Region Ihrer Wahl
  • mykey durch Ihren AWS-KMS-Schlüssel

Hinweis: Setzen Sie kms:Decrypt nur ein, wenn Ihr Schlüssel nicht den Standardschlüssel, sondern einen benutzerdefinierten Schlüssel aus dem AWS Key Management Service (AWS KMS) 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.

Eine Aufgabendefinition erstellen, die das Secret für die Docker-Authentifizierung verwendet

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

Gehen Sie im Abschnitt Containerdefinitionen wie folgt vor:

  1. Wählen Sie Container hinzufügen.
  2. Geben Sie für Containername den Namen Ihres Containers ein.
  3. Geben Sie für Image den Namen des Images ein oder geben Sie den Pfad zu Ihrem privaten Image an (Beispiel: repository-url/image.tag).
  4. Wählen Private Repository-Authentifizierung.
  5. Geben Sie für Secrets Manager ARN oder Name den ARN des von Ihnen erstellten Secrets ein.
  6. Wählen Sie Hinzufügen.

Einen Amazon ECS-Clusters erstellen und die Amazon ECS-Aufgabe ausführen

Erstellen Sie einen Amazon ECS-Cluster. Führen Sie dann mit der Aufgabendefinition, die Sie im vorherigen Abschnitt erstellt haben, die Aufgabe aus.

Öffentliche Amazon ECR-Registrierung für öffentliche Container-Images verwenden

Identifizieren Sie die öffentlichen Images, die Sie in der Docker-Datei verwenden. Suchen Sie in der öffentlichen Amazon ECR-Galerie mit entsprechenden Suchfiltern nach diesen Images. Sie müssen sich nicht authentifizieren, um die öffentlichen Repositories zu durchsuchen und Images abzurufen. Die öffentliche Amazon ECR-Registrierung enthält beliebte Basisimages, darunter Betriebssysteme, von AWS veröffentlichte Images, Kubernetes-Add-Ons und Artefakte. Sie können das Erreichen des Pull-Limits für den Docker Hub dadurch vermeiden, dass Sie Images aus der öffentlichen Amazon ECR-Registrierung abrufen.

Sie können diese Images als Quelle für das Container-Image in Ihrer Aufgabendefinition verwenden:

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

Sie können diese Images auch als Basisimage in Ihrer Docker-Datei verwenden:

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

Upgrade auf ein Docker-Pro- oder Team-Abonnement

Sie können Ihr Paket auf ein Docker-Pro- oder Team-Abonnement upgraden, das 50.000 Pulls innerhalb von 24 Stunden bietet. Weitere Informationen zu Preispaketen finden Sie unter Docker Hub – Preise.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?