¿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: no se pueden extraer los secretos ni la autenticación del registro: error al extraer el comando: señal: detenido»
  • «ResourceInitializationError: no se pueden extraer los secretos ni la autenticación del registro: error al recuperar el recurso de ejecución: no se pueden recuperar los secretos de asm: se ha vuelto a intentar llamar al servicio».
  • «ResourceInitializationError: no se pueden extraer los secretos ni la autenticación del registro: error al recuperar el recurso de ejecución: no se puede recuperar la autenticación del registro de ecr: se ha vuelto a intentar llamar al servicio 3 veces: RequestError: error al enviar la solicitud debido a: publicación "https://api.ecr..amazonaws.com/": marcado tcp …443: se ha agotado el tiempo de espera de e/s. Compruebe la configuración de la red de tareas».
  • «ResourceInitializationError: no se pueden extraer los secretos ni la autenticación del registro: error al recuperar el recurso de ejecución: no se puede recuperar el secreto de asm: se ha vuelto a intentar llamar al servicio 5 veces: no se pudo obtener el secreto arn:aws:secretsmanager…»
  • «ResourceInitializationError: no se pueden extraer los secretos ni la autenticación del registro: error al recuperar el recurso de ejecución: no se puede recuperar el secreto de asm: se ha vuelto a intentar llamar al servicio 1 vez: no se pudo obtener el secreto arn:aws:secretsmanager:<region>:<accountID>:secreto:<secretName> de secrets manager: InvalidParameter: Se encontró 1 error de validación. — (tamaño mínimo de campo de 32/ tamaño máximo de campo de 64), GetSecretValueInput.VersionId».
  • «ResourceInitializationError: no se pueden extraer los secretos ni la autenticación del registro: error al recuperar el recurso de ejecución: no se puede recuperar el secreto de asm: se ha vuelto a intentar llamar al servicio 1 vez: no se pudo obtener el secreto rn:aws:secretsmanager:<region>:<accountID>:secreto:<secretName> de secrets manager: AccessDeniedException: Usuario: arn:aws:sts::<accountID>::assumed-role/<roleName> no tiene autorización para ejecutar: secretsmanager:GetSecretValue en el recurso: rn:aws:secretsmanager:<region>:<accountID>:secreto:<secretName> porque ninguna política basada en la identidad permite el código de estado de la acción secretsmanager:GetSecretValue: 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). Puede usar los registros de flujo de la VPC para ver el tráfico. Sin embargo, la tarea utiliza su configuración de red porque Fargate coloca las interfaces de red en su 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 cifra con una clave de AWS Key Management Service (AWS KMS) administrada por el cliente, conceda 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), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Uso del runbook TroubleshootECSTaskFailedToStart

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

Importante: Utilice el runbook en la misma región de AWS en la que se encuentren los recursos del clúster de ECS. Utilice 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, utilice la tarea con error más reciente del servicio. La tarea con error debe estar visible en ECS:DescribeTasks cuando ejecute 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, siga estos pasos:

  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. Elija la pestaña Propiedad de Amazon.
  5. En Documento de automatización, introduzca TroubleshootECSTaskFailedToStart en la barra de búsqueda.
  6. Seleccione la tarjeta AWSSupport-TroubleshootECSTaskFailedToStart.
    Nota: No seleccione el nombre de la automatización con hipervínculos.
  7. Seleccione Siguiente.
  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 permita a Automation llevar a cabo acciones.
    Nota: Asegúrese 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 especifica un rol de IAM, Automation 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 Automation, consulte la Tarea 1: crear 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 con error más reciente.
  12. Seleccione Ejecutar.
    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 Correcto. Además, consulte la sección Resultados para ver si hay excepciones.

También puede solucionar el problema manualmente.

Cómo comprobar las rutas desde las subredes a Internet

Si su tarea de Fargate se encuentra en una subred pública, compruebe que ha asignado una dirección IP pública a la tarea. Además, confirme que la tarea tenga una ruta predeterminada (0.0.0.0/0) a una puerta de enlace de Internet. Cuando inicie una nueva tarea o cree un nuevo servicio, active la opción Asignar una IP pública de forma automática.

Si utilizó una pila de AWS CloudFormation para crear el servicio de Amazon ECS, modifique la propiedad NetworkConfiguration de AWS::ECS::Service para actualizar el servicio. Para actualizar la configuración de los servicios existentes, utilice CloudFormation para activar el parámetro AssignPublicIp. O bien, ejecute 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: Sustituya regionName por su región.

Si utiliza las siguientes configuraciones, no utilice 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.
  • Ha activado AmazonProvidedDNS en la configuración de DHCP de Amazon VPC.

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

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

Si su tarea de Fargate se encuentra en una subred privada, compruebe 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 usa una puerta de enlace de NAT, colóquela en una subred pública. Para obtener más información, consulte Arquitectura con una puerta de enlace de Internet y una puerta de enlace de NAT mediante AWS Network Firewall. Si usa PrivateLink, compruebe que los grupos de seguridad de los puntos de enlace de Amazon VPC permiten el tráfico a las tareas de Fargate. Si utiliza un servidor de dominio de nombres personalizado, confirme 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 su ACL de la red y la configuración del grupo de seguridad

Compruebe 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, consulte 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 conexión de Amazon ECS.

Cómo comprobar los puntos de enlace de Amazon VPC

Si usa PrivateLink, debe 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 conexión de puerta de enlace de S3
  • com.amazonaws.region.logs

Para obtener más información, consulte Considerations for Amazon Elastic Container Registry (Amazon ECR) VPC endpoints.

Nota: Si la definición de la tarea usa Secrets Manager, el Almacén de parámetros o Registros de Amazon CloudWatch, asegúrese de definir los puntos de enlace. Para obtener más información, consulte 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, compruebe 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, consulte 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 realiza 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, defina los permisos necesarios en su rol de ejecución de tareas. Cuando acceda a los secretos de Secrets Manager o a los parámetros del Almacén de parámetros para recuperar los datos confidenciales, confirme que tiene los permisos secretsmanager:GetSecretValue o ssm:GetParameters necesarios. Para obtener una lista de los permisos necesarios, consulte Permisos de Secrets Manager o Systems Manager.

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

Compruebe 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, compruebe 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, consulte ¿Cómo puedo transmitir secretos o información confidencial de forma segura a los contenedores de una tarea de Amazon ECS?

Asegúrese 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, debe proporcionar el ARN completo.

Utilice el parámetro VersionId en GetSecretValueInput para especificar la versión del valor del secreto que se recupera. Si no necesita una versión específica, elimine 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, utilice el ARN completo o el nombre del secreto. Si el parámetro existe en una región diferente, debe especificar el ARN completo.

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

  1. Abra la consola de AWS Systems Manager.
  2. En el panel de navegación, seleccione Almacén de parámetros y, a continuación, confirme el nombre del Almacén de parámetros.
  3. Para obtener el ARN del parámetro, ejecute el siguiente comando get-parameter de la AWS CLI:
    aws ssm get-parameter --name name_of_parameter_store_secret --with-decryption
    Nota: Sustituya 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, consulte Restricciones.

Información relacionada

Visualización de errores de 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