¿Cómo puedo resolver las tareas de Amazon ECS que no pueden extraer imágenes de Amazon ECR?

6 minutos de lectura
0

No puedo extraer imágenes de Amazon Elastic Container Registry (Amazon ECR) en una tarea de Amazon Elastic Container Service (Amazon ECS). O se muestra el mensaje «CannotPullContainerError: error de API".

Descripción corta

Es posible que se muestre el error CannotPullContainerError por los siguientes motivos:

  • Utiliza una subred privada sin ruta a Internet, por lo que su tipo de inicio no tiene acceso al punto de enlace de Amazon ECR.
  • Su política de repositorios de Amazon ECR restringe el acceso a las imágenes del repositorio.
  • Su rol de instancia o ejecución de tareas de Amazon ECS no tiene los permisos correctos para extraer imágenes.
  • La URI de la imagen solicitada no existe.
  • No hay suficiente espacio en el disco para la imagen.
  • Ha superado la cuota de tasa de extracción.
  • Falta una ruta de red entre la tarea y el punto de enlace de Amazon ECR.
  • Sus credenciales de Docker están desactualizadas.

Resolución

Determinación de la causa del problema

Para determinar el problema, utilice el runbook AWSSupport-TroubleshootECSTaskFailedToStart. Debe utilizar el runbook en la misma región de AWS en la que se encuentren los recursos del clúster de Amazon ECS. Además, use el identificador de la tarea fallida más reciente. Si la tarea fallida forma parte de un servicio de Amazon ECS, use la tarea fallida más reciente del servicio. La tarea fallida debe estar visible en ECS:DescribeTasks durante la automatización. De forma predeterminada, las tareas de ECS detenidas están visibles durante 1 hora después de entrar en el estado Detenido.

En función de la salida de la automatización, use uno de los siguientes pasos manuales de solución de problemas.

Asegúrese de que la subred privada tenga una ruta a una puerta de enlace de NAT o utilice PrivateLink

Puede usar una subred privada para ejecutar una tarea con un tipo de inicio de Amazon Elastic Compute Cloud (Amazon EC2) o AWS Fargate. Para ambos tipos de inicio, asegúrese de que la subred privada tenga una ruta a una puerta de enlace de NAT en la tabla de enrutamiento. Configure la puerta de enlace de NAT en su VPC para enrutar las solicitudes a Internet.

También puede utilizar AWS PrivateLink con los puntos de enlace de la nube virtual privada (VPC) de Amazon ECR y los puntos de enlace de la puerta de enlace de Amazon Simple Storage Service (Amazon S3).

El grupo de seguridad de puntos de enlace de VPC debe permitir las conexiones entrantes en el puerto 443 desde la subred privada o la VPC de tareas de Amazon ECS.

Nota: El valor ECS_IMAGE_PULL_INACTIVITY_TIMEOUT en Windows está establecido en un valor predeterminado de 3 minutos. Si va a extraer una imagen grande, es posible que la extracción de la imagen no se complete en el período de 3 minutos y que se agote el tiempo de espera de la solicitud.

Comprobación de la política de repositorios de Amazon ECR

Si su política de repositorios de Amazon ECR restringe el acceso a las imágenes del repositorio, se mostrará el error 403 Forbidden. Consulte la política de repositorios de Amazon ECR para asegurarte de que no hay restricciones en las imágenes del repositorio. Para ver ejemplos de políticas de acceso, consulte Ejemplos de políticas de repositorios privados en Amazon ECR.

Comprobación de los permisos del rol de IAM de ejecución de tareas o instancia de contenedor

Si utiliza el tipo de inicio de Amazon EC2, asegúrese de que el rol de AWS Identity and Access Management (IAM) de la instancia de contenedor tenga permiso para acceder al repositorio de Amazon ECR. La políticaAmazonEC2ContainerRegistryReadOnly proporciona los permisos mínimos necesarios para extraer imágenes.

Si utiliza el tipo de inicio de Fargate, asegúrese de que AmazonECSTaskExecutionRolePolicy esté asociada al rol de ejecución de tareas para extraer una imagen.

Asegúrese de utilizar el URI de imagen correcto

Para confirmar que está usando el nombre correcto de la imagen en el URI, compruebe el parámetro de imagen en la sección de definiciones de contenedores de su definición de tarea.

Nota: Para extraer por etiqueta, use el formato de nombre de imagen registry/repository[:tag]. Para extraer por resumen, utilice el formato registry/repository[@digest] que puede copiar directamente del repositorio de Amazon ECR.

Comprobación del espacio en disco

Si no hay suficiente espacio en disco para almacenar la imagen que extrae, se mostrará el mensaje de error «CannotPullContainerError: no queda espacio en el dispositivo». Para resolver este problema, consulte escribir /var/lib/docker/tmp/GetImageBlob111111111: no queda espacio en el dispositivo.

Comprobar si se ha superado la cuota de tasa de extracción

Si utiliza Docker Hub para extraer la imagen y supera la cuota de extracción de imágenes, se mostrará el mensaje de error «CannotPullContainerError: toomanyrequests: Ha alcanzado su límite de tasa de extracción». Para obtener información sobre las cuotas de tasa de extracción, consulte Límite de tasa de extracción en el sitio web de Docker Docs. Para resolver este problema, consulte ERROR: toomanyrequests: Demasiadas solicitudes o Ha alcanzado su límite de tasa de extracción.

Comprobación de la configuración de red

Si falta una ruta de red entre la tarea y el punto de enlace de Amazon ECR, se mostrará un error similar al de los siguientes ejemplos:

«Cannotpullcontainererror: respuesta de error del daemon»

Alternativa:

«Se ha superado el tiempo de espera del cliente mientras esperaba los encabezados»

Para resolver este problema, compruebe si su tarea tiene acceso al repositorio de Amazon ECR a través de una puerta de enlace de NAT o PrivateLink.

Al crear un servicio de Amazon ECS, configure los siguientes ajustes en Redes:

  • Para tareas en subredes públicas, en IP pública, active la asignación automática de IP pública.
  • Para las tareas en subredes privadas, desactive la asignación automática de IP pública y, a continuación, configure una puerta de enlace de NAT o PrivateLink.

Actualización de las credenciales de inicio de sesión de Docker

Si sus credenciales de Docker están desactualizadas, se mostrará el mensaje de error «el repositorio no existe o puede requerir 'inicio de sesión en Docker'». Para actualizar sus credenciales de inicio de sesión de Docker para la autenticación de repositorios privados, consulte Uso de un token de autorización.

Información relacionada

Errores de tareas de CannotPullContainer en Amazon ECS