# Como fazer um acesso SSH no AWS Fargate

## Introdução

Se você utiliza o AWS Fargate como carga de trabalho para as suas aplicações, mais cedo ou mais tarde sentirá a necessidade de realizar um acesso SSH nos conteiners do Fargate para solucionar algum problema, fazer alguma depuração ou simplesmente testar algumas conexões e verificar alguns arquivos de configuração.

Se você usa o Lightsail Container, infelizmente descobrirá que não é possível fazer um acesso SSH nele, e por um tempo no Fargate também não era, porém agora é possível e vou descrever o passo a passo de como fiz isso.

Então se você está nessa situação e chegou até este artigo, ele é feito para você.

---

## Etapa 1 - Instalar o AWS CLI

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text"><strong>Se você já possui o AWS CLI instalado e configurado, pode ignorar essa etapa!</strong></div>
</div>

O primeiro passo é você instalar e configurar o `AWS CLI V2` em sua máquina, se você estiver usando o `Linux x86` por exemplo, pode instalar com o comando:

```bash
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

Se houver dúvidas sobre essa instalação e configuração, você pode consultar nosso outro artigo que explica por completo como fazer isso:

* 👉 [AWS CLI - Instalação e Configuração](https://simplescloud.io/aws-cli-instalacao-e-configuracao)
    

Ou ainda pode verificar diretamente na documentação da AWS se estiver usando um Sistema Operacional diferente:

* 👉 [AWS CLI - Documentação Oficial](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions)
    

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Uma vez que isso esteja pronto, podemos seguir para a próxima etapa.</div>
</div>

---

## Etapa 2 - Instalar o **Session Manager Plugin**

Se você estiver usando o `Linux x86` por exemplo, execute este comando:

```bash
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
sudo yum install -y session-manager-plugin.rpm
```

Se houver dúvidas ou se estiver usando um outro Sistema Operacional, verifique a documentação oficial da AWS:

* 👉 [Session Manager plugin para AWS CLI](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)
    

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Uma vez que isso esteja pronto, podemos seguir para a próxima etapa</div>
</div>

---

## Etapa 3 - Configure as Permissões

### Crie uma Política IAM

1- Acesse o console **AWS → IAM → Policies → Create Policy** e defina o nome como por exemplo **ECSFargateAllowExecuteCommand** → insira o código `json` em sua política:

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

---

### Anexe a Role Adequada

1- Ainda no console **AWS → IAM** alterne de **Policies** para **Roles** e pesquise por **ecsTaskExecutionRole** → ao final, você deve obter uma tela parecida com:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1706305163616/54e141ce-fd7d-4c72-966f-4cf331ba1a9f.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1706302201827/3a9dc971-eef2-423d-b29c-f0ea3f0002f6.png align="center")

---

## Etapa 4 - Colete Informações para o Acesso

O comando AWS CLI `ecs execute-command` requer 3 parâmetros:

* O nome do cluster do ECS
    
* O ID da tarefa do ECS
    
* O nome do container
    

Então acesse o console **AWS → ECS** e anote as informações, por exemplo:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1706302717405/bff92c78-a3d5-4acb-9459-e3a14eee5a5f.png align="center")

---

## Etapa 5 - Faça o Acesso SSH no Container do Fargate

1- Execute o comando:

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Lembre-se de alterar os valores de <code>region</code>, <code>cluster name</code>, <code>task id</code> e <code>container name</code> para os valores reais que você está usando</div>
</div>

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Se a imagem do seu container for baseado em <code>debian</code>, utilize <code>/bin/bash</code>. Se a imagem do seu container for baseado em <code>alpine</code>, utilize <code>/bin/sh</code></div>
</div>

```bash
aws ecs execute-command \
--region <your-region> \
--cluster <your-ecs-cluster-name> \
--task <your-task-id> \
--container <your-container-name> \
--command "/bin/bash" \
--interactive
```

![](https://miro.medium.com/v2/resize:fit:700/0*WGZ4-m83b837AA-W.png align="left")

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Pronto! Você já conseguiu acessar o container do Fargate através do SSH!</div>
</div>

---

## Etapa 6 (Opcional) - Bônus

### Habilite o Serviço do Fargate para Acesso SSH

Se você estiver tentando acessar por SSH um ID de tarefa que está sendo gerenciada por um serviço do Fargate, poderá receber a seguinte mensagem de erro:

<div data-node-type="callout">
<div data-node-type="callout-emoji">❌</div>
<div data-node-type="callout-text"><code>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</code></div>
</div>

Isso acontece porque antes precisamos habilitar o serviço do Fargate para que suas tasks permitam o acesso SSH, então digite o comando:

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Lembre-se de alterar <code>cluster name</code>, <code>service name</code> e <code>region</code> para os valores reais que você está usando</div>
</div>

```bash
aws ecs update-service \
--cluster <your-ecs-cluster-name> \
--service <your-ecs-service-name> \
--region <your-region> \
--enable-execute-command \
--force-new-deployment
```

Após isso é só repetir o mesmo comando da `Etapa 5` e realizar o acesso SSH.

---

## Conclusão

Vimos passo a passo como acessar através de SSH uma task do AWS Fargate, isso pode ser muito útil para soluções de problemas, por exemplo você pode querer testar a conexão da task do Fargate com o banco de dados RDS para garantir que não há problemas de conexão:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1706303610584/2dce5b6a-36f3-4a66-92a0-848ce1354702.png align="center")

Ou imagine ainda que o deploy de um aplicativo construído em `.Net Core` nos containers do Fargate são realizados através de um pipeline CI/CD, e que o arquivo `appsettings.json` possui variáveis de ambiente por questões de segurança e muda os valores de acordo com o ambiente que está sendo implantado como `production`, `qa`, etc. Então você quer verificar se esses valores foram alterados corretamente:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1706303899360/890aa092-3059-4a67-9bd1-7c3cf19dca0c.png align="center")

Por fim, isso pode ser muito útil no seu dia a dia.

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Lembre-se de excluir todos os recursos ao final para não obter cobranças indesejadas e manter sua conta AWS limpa e organizada.</div>
</div>

<div data-node-type="callout">
<div data-node-type="callout-emoji">✅</div>
<div data-node-type="callout-text">Espero que as informações tenham sido úteis para você.</div>
</div>
