🚀 ECSGO o como hacer troubleshooting ⚙️ en ECS rapidamente
Tags: aws, devops, ecs, docker
Published: 2024-01-26 12:07:01

Todos los que hemos usado [ECS](https://aws.amazon.com/ecs/) (Elastic Container Service) estamos acostumbrados a visitar Cloudwatch regularmente para ver los logs y a partir de ahí depurar ciertos errores. 

Hay veces que unicamente viendo las trazas de los logs no es suficiente. Nos gustaría poder estar dentro del contenedor y poder ejecutar ciertos comandos para realizar un examen más exhaustivo de lo que está pasando. Por ejemplo: depuración de networking... 

Vamos, el típico **docker exec -it [container-id]** de toda la vida. 

Para este caso existe la herramienta [ECSGO](https://github.com/tedsmitt/ecsgo) que nos facilita mucho la vida. 

Y en este post os voy a enseñar como configurarla y usarla!



> Hay que recordar que, ejecutar comandos dentro de un container únicamente está aconsejado para tareas de troubleshooting. Si realizamos cambios en el contenedor, una vez este se termine, estos cambios se perderán. Los cambios siempre en Dockerfile!

---

##📍**Qué es ECSGO?**
ECSGO es una herramienta que facilita la conexion a contenedores que estan corriendo en ECS (ya sea en EC2 o Fargate). También se puede usar para hacer port-forwarding de un container a tu local. 

Esta herramienta está inspirada en [gossm](https://github.com/gjbae1212/gossm)(Lo mismo pero para instancias EC2). 

##📍**Cómo funciona ECSGO?**
ECSGO utiliza la funcionalidad de [ECS ExecuteCommand API ](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) . 

Anteriormente a ECS ExecuteCommand, la única manera de conectarnos a un contenedor en ejecución era:

1. Localizar la Instancia EC2 especifica en el cluster dónde la task a la que te quieres conectar esta corriendo
2. Conectarte por SSH o SSM a la instancia
3. Ejecutar docker exec al contenedor

(En el caso de que la task fuera serverless con FARGATE, ya podías olvidarte de poder conectar)

##📍**Pre-requisitos**

Para poder usarlo, hay que configurar previamente ciertas cosas...

1.El servicio de ECS debe tener activado el flag execute-command
 
 ```
 resource "aws_ecs_service" "service" {
   ...
   enable_execute_command = true
   ...
 }
 ```
 
 
2.El IAM role usado por la task debe tener ciertos permisos
 
 ```
 data "aws_iam_policy_document" "ecs-ssm" {
   statement {
 
     actions = [
       "ssmmessages:CreateControlChannel",
       "ssmmessages:CreateDataChannel",
       "ssmmessages:OpenControlChannel",
       "ssmmessages:OpenDataChannel"
     ]
 
     resources = ["*"]
   }
 }
 ```
3.Tener instalado [session-manager-plugin](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html) en tu portatil.

Usa [ecs-exec-checker](https://github.com/aws-containers/amazon-ecs-exec-checker) para comprobar los pre-requisitos antes de user ECS Exec.

Además deberemos tener configurada la AWS-CLI y disponer de un usuario IAM con permisos suficientes.


##📍**Vamos a probarlo!**

Para instalar ECSGO vamos [https://github.com/tedsmitt/ecsgo/releases](https://github.com/tedsmitt/ecsgo/releases) y nos descargamos el tar.gz con el binario para nuestro sistema.

Ejecutamos ecsgo y nos aparecen los clusters ECS.
Seleccionamos el cluster del container al que queremos conectarnos

![Lista de los ECS clusters](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3isuil6h02e6h6pzt1ps.png)

Después de escoger el cluster ECS, nos muestra una lista con los servicios que estan corriendo dentro del cluster seleccionado previamente. Seleccionamos el servicio del container al que queremos conectarnos.

![Lista de los servicios ECS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0qznt628il7p2y3jwfz.png)

Finalmente nos aparecen las tareas dentro del servicio, es decir, los containers. Seleccionamos el container al que queremos conectarnos.

![Lista de las Tasks](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4to2e1b8go12jpux8gw.png)

Ya estamos dentro!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dxv32nkr9xn983u9ize7.png)

A partir de aqui, pues ya podemos ejecutar comandos básicos de troubleshooting...

Hasta el próximo post!