¿Cómo puedo resolver el error «CannotPullContainerError: Ha alcanzado su límite de tasa de extracción» en Amazon ECS?

9 minutos de lectura
0

Cuando intento extraer imágenes del Docker Hub, mi tarea de Amazon Elastic Container Service (Amazon ECS) falla y aparece el siguiente error: «CannotPullContainerError: la inspección de la imagen se ha vuelto a intentar 5 veces: httpReaderSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Demasiadas solicitudes: mensaje del servidor: toomanyrequests: Ha alcanzado su límite de tasa de extracción. Puede aumentar el límite mediante la autenticación y la actualización en: https://www.docker.com/increase-rate-limit»

Descripción breve

Este error se produce al intentar extraer una imagen del repositorio público de Docker Hub (en el sitio web de Docker Hub) después de alcanzar el límite de tasa de extracción de Docker (del sitio web de Docker Hub). Si supera el límite de tasa, recibirá un código de estado HTTP de 429. Docker Hub usa direcciones IP para autenticar a los usuarios, y los límites de tasa de extracción se basan en direcciones IP individuales. Para los usuarios anónimos, el límite de tasa se establece en 100 extracciones cada 6 horas por dirección IP. Para los usuarios autenticados con un ID de Docker, la tasa de extracción se establece en 200 extracciones por período de 6 horas. Si su solicitud de extracción de imágenes supera estos límites, Amazon ECS deniega estas solicitudes hasta que haya transcurrido el período de 6 horas. Si ejecuta su carga de trabajo de Amazon ECS o Amazon Elastic Kubernetes Service (Amazon EKS), los datos se extraen a través de una puerta de enlace NAT con una dirección IP fija. En este caso, la solicitud se limita cuando se supera el límite de extracción.

Utilice el runbook AWSSupport-TroubleshootECSTaskFailedToStart para solucionar los errores de las tareas de Amazon ECS que no se inician. Esta automatización revisa las siguientes configuraciones:

  • Conectividad de red al registro de contenedores configurado
  • Falta de permisos de AWS Identity and Access Management (IAM) que requiere el rol de ejecución
  • Conectividad del punto de conexión de la nube privada virtual (VPC)
  • Configuración de reglas de grupos de seguridad
  • Referencias secretas de AWS Secrets Manager
  • Configuración de registro

Resolución

Importante:

  • Utilice el runbook AWSSupport-TroubleshootECSTaskFailedToStart en la misma región de AWS en la que se encuentran los recursos del clúster de ECS.
  • Cuando utilice el runbook, debe utilizar el ID de tarea fallido más reciente. Si la tarea fallida forma parte de Amazon ECS, utilice la tarea fallida más reciente del servicio. La tarea fallida debe estar visible en ECS:DescribeTasks durante la ejecución de la automatización. De forma predeterminada, las tareas de ECS detenidas están visibles durante 1 hora después de entrar en el estado Detenida. El uso del ID de tarea fallido más reciente evita que la limpieza del estado de la tarea interrumpa el análisis durante la automatización.

Nota: Si la salida del runbook no proporciona recomendaciones, utilice uno de los métodos manuales de solución de problemas de la siguiente sección.

Para ejecutar el runbook AWSSupport-TroubleshootECSTaskFailedToStart:

1.    Abra la consola de AWS Systems Manager.

2.    En el panel de navegación, en Administración de cambios, seleccione Automatización.

3.    Elija Ejecutar automatización.

4.    Seleccione la pestaña Propiedad de Amazon.

5.    En Documento de automatización, busque TroubleshootECSTaskFailedToStart.

6.    Seleccione la tarjeta AWSSupport-TroubleshootECSTaskFailedToStart.
Nota: Asegúrese de seleccionar el botón de selección de la tarjeta y no el nombre de la automatización con hipervínculos.

7.    Elija Siguiente.
Nota: Tras la ejecución, los resultados del análisis se rellenan en la sección Salida global. Sin embargo, debe esperar a que el estado del documento pase a Éxito. Además, debe prestar atención a las excepciones de la sección Salida.

8.    En Ejecutar documento de automatización, elija Ejecución simple.

9.    En la sección Parámetros de entrada, para AutomationAssumeRole, introduzca el ARN del rol que permite a la automatización de Systems Manager llevar a cabo acciones.
Nota: Asegúrese de el AutomationAssumeRole o el usuario o rol de IAM tengan los permisos de IAM necesarios para ejecutar el runbook AWSSupport-TroubleshootECSTaskFailedToStart. Si no especifica un rol de IAM, la automatización de Systems Manager utilizará los permisos del usuario o rol de IAM que ejecuta el runbook. Para obtener más información sobre la creación del rol de asumir para la automatización de Systems Manager, consulte Tarea 1: cree un rol de servicio para Automation.

10.    En ClusterName, introduzca el nombre del clúster en el que no se pudo iniciar la tarea.

11.    En TaskId, introduzca la identificación de la tarea que ha fallado más recientemente.

12.    Elija Ejecutar.

Según la salida de la automatización, utilice uno de los siguientes pasos manuales de solución de problemas.

Copie imágenes públicas en un registro privado de Amazon ECR

Cree un repositorio de Amazon Elastic Container Registry (Amazon ECR) y, a continuación, suba la imagen a este nuevo repositorio. Al extraer las imágenes del repositorio de Amazon ECR, puede evitar superar el límite de extracción de Docker Hub.

1.    Ejecute un comando similar al siguiente para extraer la imagen de Docker Hub:

docker pull example-image

2.    Ejecute un comando similar al siguiente para autenticar su cliente de Docker y acceder al registro de 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.    Ejecute un comando similar al siguiente para etiquetar la imagen y subirla a su repositorio:

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

4.    Ejecute un comando similar al siguiente para subir la imagen de Docker a un registro de Amazon ECR:

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

5.    Ejecute un comando similar al siguiente para actualizar el archivo Docker y utilizar la imagen de Amazon ECR que acaba de subir como imagen base:

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

En los comandos anteriores, sustituya los siguientes valores por los suyos:

  • example-image por el nombre de la imagen pública que quiere subir.
  • 1111222233334444 con el ID de su cuenta.
  • myrepository:latest por el nombre de su registro de Amazon ECR.
  • eu-west-1 con la región que prefiera.

Autenticar la extracción de Docker Hub

Si se autentica en Docker Hub, tiene más límites de tasa que se basan en el nombre de usuario de Docker. Guarde su nombre de usuario y contraseña de Docker Hub como secreto en AWS Secrets Manager y, a continuación, utilícelo para autenticarse en Docker Hub.

Crear un secreto de Secrets Manager para las credenciales de Docker Hub

Para crear un secreto para las credenciales de Docker Hub, siga las instrucciones de la sección Para crear un secreto básico en Uso de la autenticación de registros privados.

Actualizar su rol de IAM de ejecución de tareas

Para que la tarea de Amazon ECS tenga acceso al secreto, añada manualmente los permisos necesarios mediante una política insertada al rol de ejecución de tareas.

1.    Abra la consola de IAM.

2.    En el panel de navegación, seleccione Roles.

3.    Busque ecsTaskExecutionRole en la lista de roles y, a continuación, elija el rol para ver las políticas adjuntas.

4.    En la pestaña Permisos, elija Añadir permisos y, a continuación, Cree política insertada.

5.    En la página Crear política, elija JSON y, a continuación, copie y pegue la siguiente política:

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

En la política anterior, sustituya los siguientes valores por los suyos:

  • 1111222233334444 con el ID de su cuenta.
  • eu-west-1 con la región que prefiera
  • mykey por su clave de AWS KMS

Nota: Incluya kms:Decrypt solo si su clave es una clave personalizada de AWS Key Management Service (AWS KMS). Añada el ARN de su clave personalizada como recurso.

6.    Seleccione Revisar la política.

7.    En Nombre, introduzca el nombre de la política (ECSSecrets).

8.    Elija Crear política.

Cree una definición de tareas que utilice el secreto para la autenticación de Docker

Siga las instrucciones de Creación de una definición de tareas mediante la consola clásica para crear su definición de tareas de Amazon ECS. Para el Rol de ejecución de tareas, seleccione el rol de IAM de ejecución de tareas que ha actualizado en la sección anterior.

En la sección Definiciones de contenedores, complete los siguientes pasos:

1.     Elija Agregar contenedor.

2.    En Nombre del contenedor, introduzca el nombre de su contenedor.

3.     En Imagen, introduzca el nombre de la imagen o incluya la ruta a su imagen privada (por ejemplo: repository-url/image.tag).

4.    Elija Autenticación de repositorios privados.

5.    Para ARN de Secrets Manager o nombre, introduzca el ARN del secreto que ha creado.

6.    Seleccione Añadir.

Cree un clúster de Amazon ECS y ejecute la tarea de Amazon ECS

Cree un clúster de Amazon ECS. A continuación, utilice la definición de tarea que ha creado para ejecutarla.

Usar el registro público de Amazon ECR para imágenes públicas de contenedores

Identifique las imágenes públicas que utiliza en el archivo de Docker. Utilice los filtros de búsqueda adecuados para buscar estas imágenes en la Galería pública de Amazon ECR. No tiene que autenticarse para explorar los repositorios públicos y extraer imágenes. Amazon ECR Public contiene imágenes base populares, como sistemas operativos, imágenes publicadas por AWS, complementos de Kubernetes y artefactos. Extraiga imágenes del registro público de Amazon ECR para evitar alcanzar el límite de tasa de Docker Hub.

Utilice estas imágenes como fuente de la imagen del contenedor en la definición de la tarea:

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

También puede optar por utilizar estas imágenes como imagen base en su archivo de Docker:

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

Actualice a Docker Pro o Team

Si necesita más extracciones, puede actualizar a Docker Pro o Team que ofrece 50 000 extracciones en un período de 24 horas. Para obtener más información sobre los planes de precios, consulte Precios y suscripciones (en el sitio web de Docker Hub).

Información relacionada

Precios de Amazon ECR

Cuotas de servicio de Amazon ECR Public

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año