Acessando Containers do Amazon ECS Fargate pelo AWS Cli
Tags: fargate, ecs, aws, container
Published: 2024-02-16 21:00:30

<div style='text-align: justify;'>
A utilização de containers, especialmente no ambiente da nuvem, revolucionou a maneira como desenvolvemos, implantamos e escalamos aplicações. No ambiente AWS, o AWS Fargate proporciona um mecanismo de computação sem servidor para execução de containers, permitindo maior agilidade e eficiência. Contudo, mesmo em ambientes altamente automatizados, a necessidade de debugar e realizar troubleshooting pode surgir, e é aí que o AWS Exec se torna uma ferramenta crucial.

O AWS Exec é uma ferramenta poderosa que simplifica o processo de acesso a containeres em execução no AWS Fargate. Essa funcionalidade proporciona aos desenvolvedores a capacidade de interagir diretamente com os containeres, permitindo diagnósticos mais precisos e a resolução eficiente de problemas.

Existem diversas razões pelas quais o AWS Exec se destaca na importância do processo de debug e troubleshooting em ambientes AWS Fargate. Uma delas é a capacidade de se conectar diretamente aos containeres em execução, possibilitando a execução de comandos interativos. Isso significa que os desenvolvedores podem inspecionar o estado interno do container, analisar logs em tempo real e até mesmo realizar alterações na configuração para testes pontuais.

## Pré-requisito:
Um Cluster ECS com uma task em execução.
</div>

## Etapa 01 - Configurando a permissão necessária na Task Role do Cluster ECS
Para acessarmos o Container, precisamos adicionar uma policy com permissão de SSM.

Acesse a console AWS e procure pelo serviço "Elastic Cotainer Service".

No menu lateral a esquerda, clique em "Clusters".

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

Clique no "Cluster" onde possui o container que você quer acessar.

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

Altere para a aba "Tasks".

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

Clique no ID da "Task".

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

Altere para a aba "Networking".

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

Clique no nome da "Task role", você será redirecionado para o "IAM" onde poderá editar a Role.

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

Clique em "Add permissions" e em seguida clique em "Create inline policy".

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

Altere o "Policy editor" para o modo "JSON".

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

Adicione o seguinte JSON e clique em "Next".

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:CreateControlChannel"
            ],
            "Resource": "*"
        }
    ]
}
```

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

Defina um nome para a Policy e clique em "Create policy".

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

Pronto, permissões necessárias adicionadas ao "Task role" do nosso cluster.

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

## Etapa 02 - Criando uma Access key
Acesse a console AWS e procure pelo serviço "IAM".

No menu lateral a esquerda, clique em "Users".

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

Clique em "Create user".

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

Defina um nome para o "User name" e clique em "Next".

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

Marque a opção "Attach policies directly", pesquise pela policy "AmazonECS_FullAccess" (policy gerenciada pela AWS) e selecione ela, em seguida clique em "Next".

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

Revise as informações e clique em "Create user".

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

Clique no "User name" que acabamos de criar.

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

Clique em "Create access key".

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

Selecione "Command Line Interface (CLI)", marque a opção "I understand the above recommendation and want to proceed to create an access key.", em seguida clique em "Next".

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

Clique em "Create access key".

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

Anote a "Access key" e a "Secret access key" gerada, em seguida clique em "Done".

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

Pronto, access key criada com sucesso.

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

## Etapa 03 - Instalando e configurando o AWS Cli e o SSM Plugin
Na máquina que você irá utilizar para acessar o container, execute os seguintes comandos para realizar a instalação do AWS Cli e do SSM Plugin. Em seguida realize a configuração de um profile com a "Access key" e a "Secret access key" que geramos anteriormente.

Para ambiente Ubuntu Server (22.04):

Instalando o AWS Cli.

```bash
cd /tmp
apt-get update
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
```

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

Instalando o SSM Plugin.

```bash
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
sudo dpkg -i session-manager-plugin.deb
session-manager-plugin
```

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

Configurando o profile no AWS Cli.

```bash
aws configure --profile Site-Alfredo
AKIAR3YIWCET6PRJOIMI
GNL5NDMFKMqsA5umnIPBLiPLODchQl5wjhnYFDex
us-east-1

```

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

Pronto, instalamos o AWS Cli e o SSM Plugin e configuramos um profile com a Access key gerada na etapa anterior.

## Etapa 04 - Habilitando o ECS Exec e acessando o container
Acesse a console AWS e procure pelo serviço "Elastic Container Service".

No menu lateral a esquerda, clique em "Clusters".

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

Clique no "Cluster".

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpi2zpkzlp1kf04ery0f.png)
>Obs: Anote o "Cluster name" iremos utilizar para o próximo comando. Nesse exemplo o nome é "cluster-site-alfredo".

Clique na aba "Services".

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mrpl1hgl6kpprswotfe1.png)
>Obs: Anote o "Service name" e a "Task definition" iremos utilizar para o próximo comando. Nesse exemplo o nome do service é "service-site-alfredo" e a task definition é "task-site-alfredo:3".

Com as seguintes informações anotadas:

* Cluster Name: cluster-site-alfredo
* Service Name: service-site-alfredo
* Task Definition: task-site-alfredo:3

Execute o comando abaixo.

```bash
aws ecs update-service \
  --cluster ECS_CLUSTER_NAME  \
  --service ECS_SERVICE_NAME \
  --task-definition ECS_TASK-DEFINITION_NAME \
  --force-new-deployment \
  --enable-execute-command \
  --profile CLI_PROFILE
```

Exemplo:

```bash
aws ecs update-service \
  --cluster cluster-site-alfredo  \
  --service service-site-alfredo \
  --task-definition task-site-alfredo:3 \
  --force-new-deployment \
  --enable-execute-command \
  --profile Site-Alfredo
```
>Obs: Lembre-se de adicionar o --profile com o nome do profile que você configurou em seu AWS Cli.


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

Altere para a aba de "Tasks", no exemplo abaixo podemos ver que o ECS está com duas "Tasks". Aguarde por alguns minutos, o ECS irá provisionar a "Task" com o AWS Exec habilitado.

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

Após aguardar por alguns minutos, acesse novamente a aba de "Tasks", no exemplo abaixo podemos ver que o ECS agora possui apenas uma "Task". Clique na "Task ID".

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxva3x80isdunygtkpd3.png)
>Obs: Anote o "Task ID" iremos utilizar para o próximo comando. Nesse exemplo o ID da task é "3e63a718518c485fb64a749a3cc2a5ce".

Clique na aba "Configuration".

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

Desça até o campo "Containers".

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kyrkffmdvinjotquxf50.png)
>Obs: Anote o "Container name" iremos utilizar para o próximo comando. Nesse exemplo o nome do container é container-site-alfredo".

Com as seguintes informações anotadas:

* Cluster Name: cluster-site-alfredo
* Service Name: service-site-alfredo
* Task Definition: task-site-alfredo:3
* Task ID: 3e63a718518c485fb64a749a3cc2a5ce
* Container Name: container-site-alfredo

Execute o comando abaixo.

```bash
aws ecs execute-command \
  --region us-east-1 \
  --cluster ECS_CLUSTER_NAME \
  --task ECS_TASK_ID \
  --container CONTAINER_NAME \
  --command "/bin/sh" \
  --interactive \
  --profile CLI_PROFILE
```

Exemplo:

```bash
aws ecs execute-command \
  --region us-east-1 \
  --cluster cluster-site-alfredo \
  --task 3e63a718518c485fb64a749a3cc2a5ce \
  --container container-site-alfredo \
  --command "/bin/sh" \
  --interactive \
  --profile Site-Alfredo
```
>Obs: Lembre-se de adicionar o --profile com o nome do profile que você configurou em seu AWS Cli e da região onde está o seu ECS, no nosso exemplo estamos utilizando N. Virginia "us-east-1".


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

Pronto, se tudo ocorrer conforme o esperado você terá como retorno o shell do container Fargate e poderá executar comandos dentro do container.

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

## Extra - Troubleshooting
Ao tentarmos acessar o container apresenta o seguinte erro "ERROR: Unable to start command: Failed to start pty: fork/exec /bin/bash: no such file or directory".

O erro ocorre pois não foi possível encontrar o executável /bin/bash, altere o shell no exemplo que utilizamos usamos o shell /bin/sh.

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

Ao tentarmos acessar o container apresenta o seguinte erro "An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn't running. Wait and try again or run a new task with execute command enabled and try again.".

O erro ocorre porque não está habilitado o AWS Exec na "Task", execute os procedimentos da Etapa 04, caso já tenha executado pode ser que o ECS ainda não atualizou a "Task", aguarde alguns minutos até que ele atualize.

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

Espero tê-lo ajudado! Se houver alguma dúvida, não hesite em entrar em contato.

https://alfredocastro.com.br/