Como soluciono erros que recebo quando uso o ECS Exec em minhas tarefas do Fargate?

7 minuto de leitura
0

Quero solucionar os erros que recebo ao usar o Amazon Elastic Container Service (Amazon ECS) Exec em minhas tarefas do AWS Fargate.

Breve descrição

Ao usar o ECS Exec em tarefas do Fargate, você pode receber uma das seguintes mensagens de erro:

  • “Ocorreu um erro (InvalidParameterException) ao chamar a operação ExecuteCommand: O comando de execução falhou porque o comando de execução não estava ativado quando a tarefa foi executada ou o atendente de comando de execução não está em execução. Aguarde e tente novamente ou execute uma nova tarefa com o comando de execução ativado e tente novamente.”
  • “Ocorreu um erro (TargetNotConnectedException) ao chamar a operação ExecuteCommand: O comando de execução falhou devido a um erro interno. Tente novamente mais tarde.”

Resolução

Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Para resolver erros comuns que ocorrem quando você usa o ECS Exec em tarefas do Fargate, é uma prática recomendada usar o AWS CloudShell. O CloudShell vem pré-instalado com o AWS Systems Manager Session Manager Agent (SSM Agent) e a AWS CLI.

Erro InvalidParameterException

Se a opção ExecuteCommand da tarefa do Fargate estiver desativada, você receberá o erro InvalidParameterException.

Para solucionar esse problema, realize as etapas a seguir:

  1. Execute o comando describe-tasks para verificar se o parâmetro enableExecuteCommand está definido como true ou false:
    aws ecs describe-tasks --cluster example-cluster-name --tasks example-task-id| grep enableExecuteCommand
    Observação: substitua example-cluster-name pelo cluster e example-task-id pelo ID da tarefa.
  2. Se o parâmetro enableExecuteCommand for false, execute o seguinte comando update-service para atualizar o parâmetro para true:
    aws ecs update-service --cluster example-cluster-name --service example-service --region example-region --enable-execute-command --force-new-deployment
    Observação: substitua example-cluster-name pelo seu cluster, example-service pelo seu serviço e example-region pela sua região AWS. A opção force-new-deployment cria uma nova implantação que inicia novas tarefas e interrompe tarefas anteriores com base na configuração de implantação do serviço. Se seus serviços usam implantação azul/verde por meio do AWS CodeDeploy, em vez de force-new-deployment, inicie uma implantação CODE_DEPLOY. Não é possível usar force-new-deployment para implantação azul/verde porque essa opção inicia uma atualização contínua.
  3. Execute o seguinte comando describe-tasks para verificar o status de ExecuteCommandAgent:
    aws ecs describe-tasks --cluster example-cluster-name --tasks example-task-id | grep -A 6 managedAgents
    Observação: substitua example-cluster-name pelo cluster e example-task-id pelo ID da tarefa.
  4. Verifique a saída do comando para verificar o estado do atendente ExecuteCommand. Se lastStatus de ExecuteCommandAgent não estiver EM EXECUÇÃO, verifique os logs do atendente ExecuteCommandAgent para identificar a causa-raiz. Vá até as etapas de resolução de problemas Gerar logs do ECS Exec para identificar problemas para gerar os logs do ExecuteCommandAgent.
    Se ExecuteCommandAgent não conseguir recuperar as credenciais porque você configurou um proxy no contêiner, adicione a seguinte opção NO_PROXY aos arquivos de configuração da instância de contêiner:
    env no_proxy=169.254.169.254,169.254.170.2

TargetNotConnectedExceptionerror

Para resolver o erro TargetNotConnectionException, prossiga com as seguintes medidas.

Adicione as permissões necessárias e confirme se a configuração de rede está correta

Conclua as seguintes etapas:

  1. Adicione as permissões necessárias ao seu perfil do AWS Identity and Access Management (IAM) da tarefa do Amazon ECS. Se o perfil do IAM da tarefa já tiver as permissões necessárias, verifique se alguma política de controle de serviço (SCPs) bloqueia a conexão da tarefa com o SSM Agent.
  2. Se você usa endpoints de interface do Amazon Virtual Private Cloud (Amazon VPC) com o Amazon ECS, crie os seguintes endpoints:
    ec2messages.region.amazonaws.com
    ssm.region.amazonaws.com
    ssmmessages.region.amazonaws.com
    Observação: substitua region pela sua região.
  3. Para confirmar que seu ambiente da AWS CLI e o cluster ou tarefa do Amazon ECS estão prontos para o Amazon ECS Exec, execute o script check-ecs-exec.sh. Para informações sobre pré-requisitos e uso, consulte Amazon ECS Exec Checker no site do GitHub.
    A saída do script check-ecs-exec.sh mostra o que você deve resolver antes de usar o ECS Exec. Exemplo de saída:
    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
    A saída anterior mostra que o ECS Exec está desativado na tarefa e que o perfil da tarefa não tem as permissões necessárias do Systems Manager. Observação: você deve definir o parâmetro ReadonlyRootFilesystem como false na definição da tarefa para executar o ECS Exec. Se ReadonlyRootFileSystem for true, o SSM Agent não poderá criar os diretórios necessários.

Verifique se você configurou as credenciais de usuário do IAM no nível do contêiner, como uma chave de acesso ou uma chave de acesso secreta. O SSM Agent usa o AWS SDK para Java ao verificar a autenticação. Se você configurar a chave de acesso ou a chave de acesso secreta na instância de contêiner como variáveis de ambiente, substituirá as permissões no nível da tarefa. Para usar o ECS Exec, as credenciais do IAM no nível do contêiner devem fornecer permissões para o SSM Agent.

Usar o ECS Exec para entrar no contêiner com o shell correto

Imagens de base diferentes podem ter camadas diferentes dentro delas. Se você usar o shell incorreto, receberá erros. Verifique se você está usando o shell correto com base na imagem da sua aplicação.

Para usar o ECS Exec para entrar no contêiner, execute o comando execute-command:

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

Observação: substitua example-region pela sua região, example-cluster pelo nome do cluster, example-container pelo nome da instância de contêiner e example-task pelo nome da tarefa.

Gerar logs para que o ECS Exec identifique problemas

Para determinar por que o ECS Exec não está funcionando, execute o seguinte comando na seção de ambiente da definição do contêiner para gerar logs do SSM Agent:

Console:

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"

Observação: Aplicações diferentes têm diferentes shells e editores. Modifique os parâmetros de comando anteriores de acordo com os requisitos da sua aplicação.

Se você usa o driver de log awslogs, os comandos anteriores geram registros do SSM Agent e os transferem para o grupo de logs do Amazon CloudWatch. Se você usa outros drivers de log ou endpoints de registro, os logs do SSM Agent são transferidos para esses locais.

Exemplo de JSON:

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

Informações relacionadas

Usar o ECS Exec

AWS OFICIAL
AWS OFICIALAtualizada há 3 meses