¿Cómo puedo solucionar los errores que recibo cuando uso ECS Exec en mis tareas de Fargate?

7 minutos de lectura
0

Quiero solucionar los errores que recibo al usar Amazon Elastic Container Service (Amazon ECS) Exec en mis tareas de AWS Fargate.

Descripción corta

Cuando usa ECS Exec en las tareas de Fargate, es posible que reciba uno de los siguientes mensajes de error:

  • «Se produjo un error (InvalidParameterException) al llamar a la operación ExecuteCommand: El comando de ejecución falló porque no estaba activado cuando se ejecutó la tarea o el agente de comandos de ejecución no se estaba ejecutando. Espere e inténtelo de nuevo o ejecute una nueva tarea con el comando de ejecución activado e inténtelo de nuevo».
  • «An error occurred (TargetNotConnectedException) when calling the ExecuteCommand operation: The execute command failed due to an internal error. Try again later».

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.

Para resolver los errores comunes que se producen al usar ECS Exec en las tareas de Fargate, se recomienda usar AWS CloudShell. CloudShell viene preinstalado con el agente del Administrador de sesiones de AWS Systems Manager (SSM Agent) y la AWS CLI.

Error InvalidParameterException

Si la opción ExecuteCommand para su tarea de Fargate está desactivada, recibirá el error InvalidParameterException.

Para resolver este problema, siga estos pasos:

  1. Ejecute el comando describe-tasks para comprobar si el parámetro enableExecuteCommand está establecido en true o false:
    aws ecs describe-tasks --cluster example-cluster-name --tasks example-task-id| grep enableExecuteCommand
    Nota: Sustituya example-cluster-name por su clúster y example-task-id por su ID de tarea.
  2. Si el parámetro enableExecuteCommand es false, ejecute el siguiente comando update-service para actualizar el parámetro a true:
    aws ecs update-service --cluster example-cluster-name --service example-service --region example-region --enable-execute-command --force-new-deployment
    Nota: Sustituya example-cluster-name por su clúster, example-service por su servicio y example-region por su región de AWS. La opción force-new-deployment crea un nuevo despliegue que inicia nuevas tareas y detiene las tareas antiguas en función de la configuración de despliegue del servicio. Si sus servicios utilizan un despliegue azul-verde a través de AWS CodeDeploy, en lugar de force-new-deployment, inicie un despliegue de CODE_DEPLOY. No puede usar force-new-deployment para el despliegue azul-verde porque esta opción inicia una actualización continua.
  3. Ejecute el siguiente comando describe-tasks para comprobar el estado de ExecuteCommandAgent:
    aws ecs describe-tasks --cluster example-cluster-name --tasks example-task-id | grep -A 6 managedAgents
    Nota: Sustituya example-cluster-name por su clúster y example-task-id por su ID de tarea.
  4. Compruebe el resultado del comando para comprobar el estado del agente ExecuteCommand. Si lastStatus de ExecuteCommandAgent no está EN EJECUCIÓN, compruebe los registros del agente de ExecuteCommandAgent para identificar la causa raíz. Continúe con Generar registros para ECS Exec para identificar los pasos de solución de problemas para generar los registros de ExecuteCommandAgent.
    Si ExecuteCommandAgent no puede recuperar las credenciales porque ha configurado un proxy en el contenedor, agregue la siguiente opción NO_PROXY a los archivos de configuración de la instancia de contenedor:
    env no_proxy=169.254.169.254,169.254.170.2

TargetNotConnectedExceptionerror

Para resolver un error de TargetNotConnectionException, tome las siguientes medidas.

Agregue los permisos necesarios y confirme que la configuración de red es correcta

Siga estos pasos:

  1. Agregue los permisos necesarios al rol de AWS Identity and Access Management (IAM) de la tarea de Amazon ECS. Si el rol de IAM de la tarea ya tiene los permisos necesarios, compruebe si alguna política de control de servicios (SCP) bloquea la conexión de la tarea con SSM Agent.
  2. Si utiliza puntos de enlace de la interfaz de Amazon Virtual Private Cloud (Amazon VPC) con Amazon ECS, cree los siguientes puntos de enlace:
    ec2messages.region.amazonaws.com
    ssm.region.amazonaws.com
    ssmmessages.region.amazonaws.com
    Nota: Sustituya region por su región.
  3. Para confirmar que el entorno de AWS CLI y el clúster o la tarea de Amazon ECS están preparados para ECS Exec, ejecute el script check-ecs-exec.sh. Para obtener información sobre los requisitos previos y el uso, consulte Comprobador de Amazon ECS Exec en el sitio web de GitHub.
    El resultado del script check-ecs-exec.sh muestra lo que debe resolver antes de usar ECS Exec. Resultado de ejemplo:
    Prerequisites for check-ecs-exec.sh v0.7-------------------------------------------------------------  jq      | OK (/usr/bin/jq)
      AWS CLI | OK (/usr/local/bin/aws)
    
    -------------------------------------------------------------
    Prerequisites for the AWS CLI to use ECS Exec
    -------------------------------------------------------------
      AWS CLI Version        | OK (aws-cli/2.11.0 Python/3.11.2 Linux/4.14.255-291-231.527.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off)
      Session Manager Plugin | OK (1.2.398.0)
    
    -------------------------------------------------------------
    Checks on ECS task and other resources
    -------------------------------------------------------------
    Region : us-east-1
    Cluster: Fargate-Testing
    Task   : ca27e41ea3f54fd1804ca00feffa178d
    -------------------------------------------------------------
      Cluster Configuration  | Audit Logging Not Configured
      Can I ExecuteCommand?  | arn:aws:iam::12345678:role/Admin
         ecs:ExecuteCommand: allowed
         ssm:StartSession denied?: allowed
      Task Status            | RUNNING
      Launch Type            | Fargate
      Platform Version       | 1.4.0
      Exec Enabled for Task  | NO
      Container-Level Checks |
        ----------
          Managed Agent Status - SKIPPED
        ----------
        ----------
          Init Process Enabled (Exec-check:2)
        ----------
             1. Disabled - "nginx"
        ----------
          Read-Only Root Filesystem (Exec-check:2)
        ----------
             1. Disabled - "nginx"
      Task Role Permissions  | arn:aws:iam::12345678:role/L3-session
         ssmmessages:CreateControlChannel: implicitDeny
         ssmmessages:CreateDataChannel: implicitDeny
         ssmmessages:OpenControlChannel: implicitDeny
         ssmmessages:OpenDataChannel: implicitDeny
      VPC Endpoints          | SKIPPED (vpc-abcd - No additional VPC endpoints required)
      Environment Variables  | (Exec-check:2)
           1. container "nginx"
           - AWS_ACCESS_KEY: not defined
           - AWS_ACCESS_KEY_ID: not defined
           - AWS_SECRET_ACCESS_KEY: not defined
    El resultado anterior muestra que ECS Exec está desactivado para la tarea y que el rol de la tarea no tiene los permisos de Systems Manager necesarios. Nota: Debe establecer el parámetro ReadonlyRootFilesystem en false en la definición de la tarea para ejecutar ECS Exec. Si ReadonlyRootFileSystem es true, SSM Agent no puede crear los directorios necesarios.

Compruebe si ha configurado las credenciales de usuario de IAM a nivel de contenedor, por ejemplo, una clave de acceso o una clave de acceso secreta. SSM Agent usa el AWS SDK para Java cuando comprueba la autenticación. Si configura la clave de acceso o la clave de acceso secreta en la instancia de contenedor como variables de entorno, anula los permisos a nivel de tarea. Para usar ECS Exec, las credenciales de IAM a nivel de contenedor deben proporcionar permisos para SSM Agent.

Use ECS Exec para entrar en el contenedor con el shell correcto

Las diferentes imágenes base pueden tener diferentes shells en su interior. Si utiliza el shell incorrecto, se producirán errores. Asegúrese de utilizar el shell correcto según la imagen de la aplicación.

Para usar ECS Exec para entrar en el contenedor, ejecute el comando execute-command:

aws ecs execute-command --region example-region --cluster example-cluster --container example-container --task example-task --command "example_shell" --interactive

Nota: Sustituya example-region por su región, example-cluster por el nombre de su clúster, example-container por el nombre de su instancia de contenedor y example-task por el nombre de su tarea.

Genere registros para que ECS Exec identifique problemas

Para determinar por qué ECS Exec no funciona, ejecute el siguiente comando en la sección del entorno de la definición del contenedor para generar los registros de SSM Agent:

Consola:

bin/bash,-c,sleep 2m && cat /var/log/amazon/ssm/amazon-ssm-agent.log

JSON:

"/bin/bash","-c","sleep 2m && cat /var/log/amazon/ssm/amazon-ssm-agent.log"

Nota: Las diferentes aplicaciones tienen diferentes shells y editores. Modifique los parámetros del comando anterior para adaptarlos a los requisitos de su aplicación.

Si utiliza el controlador de registro awslogs, los comandos anteriores generan los registros de SSM Agent y los transfieren al grupo de registros de Amazon CloudWatch. Si utiliza otros controladores de registro o puntos de enlace de registro, los registros de SSM Agent se transfieren a esas ubicaciones.

Ejemplo de JSON:

"entryPoint": [],      "portMappings": [],      "command": [
        "bin/bash",
        "-c",
        "sleep 2m && cat /var/log/amazon/ssm/amazon-ssm-agent.log"
      ],

Información relacionada

Uso de ECS Exec

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 4 meses