Saltar al contenido

¿Cómo puedo solucionar un "ResourceInitializationError" cuando intento extraer secretos o recuperar la autenticación de Amazon ECR para las tareas de ECS?

11 minutos de lectura
0

Cuando inicio una tarea de Amazon Elastic Container Service (Amazon ECS), se muestra un mensaje ResourceInitializationError.

Descripción corta

Al iniciar una tarea de Amazon ECS en el tipo de inicio de Fargate, es posible que se muestre uno de los siguientes mensajes de error:

  • "ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed"
  • "ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried."
  • "ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr..amazonaws.com/": dial tcp …443: i/o timeout. Please check your task network configuration."
  • "ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 5 time(s): failed to fetch secret arn:aws:secretsmanager…"
  • "ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 1 time(s): failed to fetch secret arn:aws:secretsmanager:<region>:<accountID>:secret:<secretName> from secrets manager: InvalidParameter: 1 validation error(s) found. – (minimum field size of 32/ maximum field size of 64), GetSecretValueInput.VersionId."
  • "ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 1 time(s): failed to fetch secret rn:aws:secretsmanager:<region>:<accountID>:secret:<secretName> from secrets manager: AccessDeniedException: User: arn:aws:sts::<accountID>::assumed-role/<roleName> is not authorized to perform: secretsmanager:GetSecretValue on resource: rn:aws:secretsmanager:<region>:<accountID>:secret:<secretName> because no identity-based policy allows the secretsmanager:GetSecretValue action status code: 400"

La versión 1.4.0 de AWS Fargate utiliza la interfaz de red elástica para tareas con el fin de extraer la imagen y los secretos. Todo el tráfico de red fluye a través de la interfaz de red de Amazon Virtual Private Cloud (Amazon VPC). Puedes usar los registros de flujo de la VPC para ver el tráfico. Sin embargo, la tarea utiliza tu configuración de red porque Fargate coloca las interfaces de red en tu Amazon VPC.

El agente de contenedores de Amazon ECS utiliza el rol de ejecución de tareas de AWS Identity and Access Management (IAM) para obtener información del Almacén de parámetros, una capacidad de AWS Systems Manager y AWS Secrets Manager.

Para los datos que cifras con una clave de AWS Key Management Service (AWS KMS) administrada por el cliente, concede los siguientes permisos al rol de IAM de ejecución de tareas:

  • ssm:GetParameters
  • secretsmanager:GetSecretValue
  • kms:Decrypt

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Uso del runbook TroubleshootECSTaskFailedToStart

Utiliza el runbook AWSSupport-TroubleshootECSTaskFailedToStart para solucionar los problemas de las tareas de Amazon ECS que no se inician.

Importante: Utiliza el runbook en la misma región de AWS en la que se encuentren los recursos del clúster de ECS. Utiliza el identificador de la tarea con error más reciente para que la limpieza del estado de la tarea no interrumpa el análisis. Si la tarea con error forma parte del servicio de Amazon ECS, utiliza la tarea con error más reciente del servicio. La tarea con error debe estar visible en ECS:DescribeTasks cuando ejecutes 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.

Para ejecutar el runbook AWSSupport-TroubleshootECSTaskFailedToStart, sigue estos pasos:

  1. Abre la consola de AWS Systems Manager.
  2. En el panel de navegación, en Administración de cambios, selecciona Automatización.
  3. Elige Ejecutar automatización.
  4. Elige la pestaña Propiedad de Amazon.
  5. En Documento de automatización, introduce TroubleshootECSTaskFailedToStart en la barra de búsqueda.
  6. Selecciona la tarjeta AWSSupport-TroubleshootECSTaskFailedToStart.
    Nota: No selecciones el nombre de la automatización con hipervínculos.
  7. Selecciona Siguiente.
  8. En Ejecutar documento de automatización, elige Ejecución simple.
  9. En la sección Parámetros de entrada, para AutomationAssumeRole, introduce el ARN del rol que permita a Automatización llevar a cabo acciones.
    Nota: Asegúrate de que el rol de servicio o el usuario de IAM tengan los permisos de IAM necesarios para ejecutar el runbook AWSSupport-TroubleshootECSTaskFailedToStart. Si no especificas un rol de IAM, Automatización utilizará los permisos del usuario o rol de IAM que ejecuta el runbook. Para obtener información sobre cómo crear el rol de servicio para Automatización, consulta la Tarea 1: crear un rol de servicio para Automatización.
  10. En ClusterName, introduce el nombre del clúster en el que no se pudo iniciar la tarea.
  11. En TaskId, introduce la identificación de la tarea con error más reciente.
  12. Selecciona Ejecutar.
    Nota: Tras la ejecución, los resultados del análisis se rellenan en la sección Salida global. Sin embargo, debes esperar a que el estado del documento pase a Correcto. Además, consulta la sección Resultados para ver si hay excepciones.

También puedes solucionar el problema manualmente.

Cómo comprobar las rutas desde las subredes a Internet

Si tu tarea de Fargate se encuentra en una subred pública, comprueba que has asignado una dirección IP pública a la tarea. Además, confirma que la tarea tenga una ruta predeterminada (0.0.0.0/0) a una puerta de enlace de Internet. Cuando inicies una nueva tarea o crees un nuevo servicio, activa la opción Asignar una IP pública de forma automática.

Si utilizaste una pila de AWS CloudFormation para crear el servicio de Amazon ECS, modifica la propiedad NetworkConfiguration de AWS::ECS::Service para actualizar el servicio. Para actualizar la configuración de los servicios existentes, utiliza CloudFormation para activar el parámetro AssignPublicIp. O bien, ejecuta el siguiente comando update-service de la AWS CLI:

aws ecs update-service --service serviceName --region regionName "awsvpcConfiguration={subnets=[subnet-123,subnet-456],securityGroups=[sg-123,sg-456],assignPublicIp=ENABLED}"

Nota: Sustituye regionName por tu región.

Si utilizas las siguientes configuraciones, no utilices la puerta de enlace de Internet de la subred pública para acceder a Secrets Manager o Systems Manager:

  • Los puntos de enlace de VPC de Secrets Manager o Systems Manager se encuentran en una subred pública.
  • Has activado AmazonProvidedDNS en la configuración de DHCP de Amazon VPC.

En su lugar, utiliza un punto de enlace de Amazon VPC.

Nota: No puedes activar Asignar una IP pública de forma automática para las tareas existentes. Para volver a configurar los servicios existentes, utiliza la AWS CLI y no la consola de administración de AWS.

Si tu tarea de Fargate se encuentra en una subred privada, comprueba que la tarea tenga una ruta predeterminada (0.0.0.0/0) al origen de conectividad de Internet.

El origen de conectividad de Internet puede ser una puerta de enlace de NAT, AWS PrivateLink o un servidor de dominio de nombres personalizado.

Si usas una puerta de enlace de NAT, colócala en una subred pública. Para obtener más información, consulta Arquitectura con una puerta de enlace de Internet y una puerta de enlace de NAT mediante AWS Network Firewall. Si usas PrivateLink, comprueba que los grupos de seguridad de los puntos de enlace de Amazon VPC permiten el tráfico a las tareas de Fargate. Si utilizas un servidor de dominio de nombres personalizado, confirma la configuración de la consulta de DNS. La consulta debe tener acceso saliente en el puerto 53 y utilizar los protocolos UDP y TCP. La consulta también debe tener acceso HTTPS en el puerto 443.

Cómo comprobar tu ACL de la red y la configuración del grupo de seguridad

Comprueba que la lista de control de acceso de la red (ACL de la red) y los grupos de seguridad no bloqueen el acceso saliente al puerto 443 desde la subred. Para obtener más información, consulta Controlar el tráfico hacia los recursos de AWS mediante grupos de seguridad.

Nota: Las tareas de Fargate deben tener acceso saliente al puerto 443 para permitir el tráfico saliente y acceder a los puntos de enlace de Amazon ECS.

Cómo comprobar los puntos de enlace de Amazon VPC

Si usas PrivateLink, debes crear los siguientes puntos de enlace obligatorios para las versiones 1.4.0 o posteriores de la plataforma Fargate:

  • com.amazonaws.region.ecr.dkr
  • com.amazonaws.region.ecr.api
  • Punto de enlace de puerta de enlace de S3
  • com.amazonaws.region.logs

Para obtener más información, consulta Consideraciones para los puntos de enlace de VPC de Amazon Elastic Container Registry (Amazon ECR).

Nota: Si la definición de la tarea usa Secrets Manager, el Almacén de parámetros o Registros de Amazon CloudWatch, asegúrate de definir los puntos de enlace. Para obtener más información, consulta Uso de un punto de enlace de VPC de AWS Secrets Manager y Creación de puntos de enlace de VPC para Amazon ECS.

Para PrivateLink, comprueba que el grupo de seguridad de Amazon VPC permita el tráfico del grupo de seguridad de tareas de Fargate o del intervalo CIDR de la VPC en el puerto TCP 443.

Para confirmar que la infraestructura de Fargate tenga acceso a los servicios, consulta las políticas de punto de enlace de VPC y las políticas de punto de enlace de la puerta de enlace de Amazon Simple Storage Solution (Amazon S3).

Cómo comprobar los roles y permisos de IAM

El rol de ejecución de tareas otorga los permisos necesarios al contenedor de Amazon ECS y a los agentes de Fargate para hacer llamadas a la API para la tarea.

Fargate requiere el rol de ejecución de tareas cuando realizas las siguientes acciones:

  • Extraer una imagen de contenedor de Amazon ECR.
  • Utilizar el controlador de registros awslogs.
  • Utilizar la autenticación de registros privados.
  • Utilizar los secretos de Secrets Manager o los parámetros del Almacén de parámetros para hacer referencia a datos confidenciales.

En los escenarios anteriores, define los permisos necesarios en tu rol de ejecución de tareas. Cuando accedas a los secretos de Secrets Manager o a los parámetros del Almacén de parámetros para recuperar los datos confidenciales, confirma que tienes los permisos secretsmanager:GetSecretValue o ssm:GetParameters necesarios. Para obtener una lista de los permisos necesarios, consulta Permisos de Secrets Manager o Systems Manager.

Cómo comprobar los datos confidenciales en la definición de tareas de Amazon ECS

Comprueba si los nombres del secreto y del parámetro coinciden con los nombres a los que se hace referencia en la definición de tareas de Amazon ECS. A continuación, comprueba si los valores de la definición del contenedor coinciden con los valores de la definición de tareas de Amazon ECS. Para obtener más información, consulta ¿Cómo puedo transmitir secretos o información confidencial de forma segura a los contenedores de una tarea de Amazon ECS?

Asegúrate de configurar el secreto o el parámetro con el mismo ARN o nombre que se especifica en la definición de la tarea. Si el recurso existe en una región diferente, debes proporcionar el ARN completo.

Utiliza el parámetro VersionId en GetSecretValueInput para especificar la versión del valor del secreto que se recupera. Si no necesitas una versión específica, elimina el campo VersionId. Secrets Manager recupera la versión más reciente de forma predeterminada.

Si el parámetro y la tarea del Almacén de parámetros se encuentran en la misma región, utiliza el ARN completo o el nombre del secreto. Si el parámetro existe en una región diferente, debes especificar el ARN completo.

Para comprobar el nombre del parámetro y el ARN, sigue estos pasos:

  1. Abre la consola de AWS Systems Manager.
  2. En el panel de navegación, selecciona Almacén de parámetros y, a continuación, confirma el nombre del Almacén de parámetros.
  3. Para obtener el ARN del parámetro, ejecuta el siguiente comando get-parameter de la AWS CLI:
    aws ssm get-parameter --name name_of_parameter_store_secret --with-decryption
    Nota: Sustituye name_of_parameter_store_secret por el nombre del secreto del Almacén de parámetros. Los parámetros que hacen referencia a los secretos de Secrets Manager no pueden usar las características de historial o versiones del Almacén de parámetros. Para obtener más información, consulta Restricciones.

Información relacionada

Visualización de los errores de las tareas detenidas de Amazon ECS

Opciones de red de tareas de Amazon ECS para el tipo de inicio de Fargate

Puntos de enlace de VPC de la interfaz de Amazon ECR (AWS PrivateLink)

Uso de Registros de CloudWatch con puntos de enlace de VPC de la interfaz