Sabia que é possível executar comandos em seus containers ECS?


Todos sabemos que o serviço Amazon ECS (Elastic Container Service) foi feito para que tenhamos experiência máxima de recursos efêmeros. Porém, existe uma vasta gama de desenvolvedores (principalmente em aplicações muito dinâmicas ou ainda em desenvolvimento) que precisam executar o famoso ‘/bin/bash’ dentro do container para realizar operações de banco, visualizar logs e até mesmo interagir com arquivos de configuração ou variáveis de ambiente.

Para isso, a Amazon liberou no Fargate o “aws ecs execute-command” que te leva imediatamente para o prompt de comando de qualquer container em um cluster ECS.

Nesse breve tutorial, irei demonstrar como é possível habilitar essa função em um cluster existente visto que na documentação da AWS só encontrei exemplos fazendo-se um cluster novo (o que confunde bastante algumas pessoas visto que não dá pra ficar alterando cluster em produção o tempo todo)

Algumas partes desse post, retirei de https://www.ernestchiang.com/en/posts/2021/using-amazon-ecs-exec/. Algumas coisas apenas traduzi, outras copiei o código e outras melhorei um pouco a redação sob o ponto de vista de complexidade.

Vamos lá!

Pré requisitos e preparações

  • AWS CLI + Session Manager plugin 
  • Seu cluster precisa estar rodando Fargate 1.4
  • Só funciona em containers Linux
  • Você precisará fazer update nos services pois não é possível habilitar para tasks existentes
  • Tenha paciência pois como em todo serviço AWS, segurança é uma preocupação constante e isso traz algumas pequenas dificuldades
  • Este tutorial assume que você está executando Fargate (não testei com EC2 Execution mas, segundo post original, não tem tanta diferença assim)

Mão na massa!

1 – Instale o “Session Manager Plugin” e, ao terminar a instalação, execute-o e verifique a saída

[code lang=”bash”]

$ session-manager-plugin

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
[/code]

2 – CRIE uma política nova com o código abaixo que irá permitir o execute-command e ANEXE-A à sua política de execução ECS (aquela que diz o que pode e não pode nos seus services). Dessa forma, um simples update service irá recarregar as políticas. Eu negritei o “crie e anexe” pra que você não cometa um erro comum que é de editar uma política in-line já existente e colar as permissões lá. Isso vai funcionar mas eu acho perigoso

[code]
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
[/code]

3 – Recomendado ativar a caça às bruxas (processos zumbi do session manager)

Modifique sua Task Definition, mais exatamente o valor “initProcessEnabled=True” para esse fim (matar processos zumbi do Session Manager) que não é exatamente necessário mas altamente recomendado pela AWS

[code]
{
"containerDefinitions": [
{
"linuxParameters": {
"initProcessEnabled": true
}
}
],
"family": "ecs-exec-task"
}
[/code]

 

4 – Habilite a execução de comandos (lembre-se de que o ECS nesse momento irá fazer um update da sua task matando containers antigos e subindo novos, logo, cuidado com ambientes de produção)

[code]
aws ecs update-service \
–cluster nome-do-seu-cluster \
–service nome-do-servico \
–task-definition nome-da-task-definition:N \
–force-new-deployment \
–enable-execute-command
[/code]

Depois de habilitar o ECS Exec para a tarefa que você deseja acesso, você pode conferir se está mesmo habilitado verificando o “lastStatus” do “ExecuteCommandAgent” que deve estar RUNNING e o parâmetro “enableExecuteCommand” que deve estar “true”. Se estiver assim, tudo está pronto. Veja abaixo o código para conferir e a saída do mesmo

[code]
aws ecs describe-tasks \
–cluster nome-do-seu-cluster \
–tasks id-da-task

Saída esperada

{
"tasks": [
{

"containers": [
{

"managedAgents": [
{
"lastStartedAt": "2021-03-18T112:13:14.151600+08:00",
"name": "ExecuteCommandAgent",
"lastStatus": "RUNNING"
}
]
}
],

"enableExecuteCommand": true,

}
]
}
[/code]

AGORA SIM, VAMOS PRA DENTRO DO CONTAINER!!!

[code]
aws ecs execute-command –cluster nome-do-seu-cluster \
–task your-task-id \
–container nome-do-container \
–interactive \
–command "/bin/bash"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-0936520b5bac0473e
root@2342df28bd83:/var/www/html#
[/code]