Acessando Containers do Amazon ECS Fargate pelo AWS Cli
Tabela de conteúdos
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.
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”.
Clique no “Cluster” onde possui o container que você quer acessar.
Altere para a aba “Tasks”.
Clique no ID da “Task”.
Altere para a aba “Networking”.
Clique no nome da “Task role”, você será redirecionado para o “IAM” onde poderá editar a Role.
Clique em “Add permissions” e em seguida clique em “Create inline policy”.
Altere o “Policy editor” para o modo “JSON”.
Adicione o seguinte JSON e clique em “Next”.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:CreateControlChannel"
],
"Resource": "*"
}
]
}
Defina um nome para a Policy e clique em “Create policy”.
Pronto, permissões necessárias adicionadas ao “Task role” do nosso cluster.
Etapa 02 - Criando uma Access key #
Acesse a console AWS e procure pelo serviço “IAM”.
No menu lateral a esquerda, clique em “Users”.
Clique em “Create user”.
Defina um nome para o “User name” e clique em “Next”.
Marque a opção “Attach policies directly”, pesquise pela policy “AmazonECS_FullAccess” (policy gerenciada pela AWS) e selecione ela, em seguida clique em “Next”.
Revise as informações e clique em “Create user”.
Clique no “User name” que acabamos de criar.
Clique em “Create access key”.
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”.
Clique em “Create access key”.
Anote a “Access key” e a “Secret access key” gerada, em seguida clique em “Done”.
Pronto, access key criada com sucesso.
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.
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
Instalando o SSM Plugin.
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
Configurando o profile no AWS Cli.
aws configure --profile Site-Alfredo
AKIAR3YIWCET6PRJOIMI
GNL5NDMFKMqsA5umnIPBLiPLODchQl5wjhnYFDex
us-east-1
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”.
Clique no “Cluster”.
Obs: Anote o “Cluster name” iremos utilizar para o próximo comando. Nesse exemplo o nome é “cluster-site-alfredo”.
Clique na aba “Services”.
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.
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:
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.
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.
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”.
Obs: Anote o “Task ID” iremos utilizar para o próximo comando. Nesse exemplo o ID da task é “3e63a718518c485fb64a749a3cc2a5ce”.
Clique na aba “Configuration”.
Desça até o campo “Containers”.
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.
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:
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”.
Pronto, se tudo ocorrer conforme o esperado você terá como retorno o shell do container Fargate e poderá executar comandos dentro do container.
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.
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.
Espero tê-lo ajudado! Se houver alguma dúvida, não hesite em entrar em contato.