Levantando uma ASP.NET Web API em AWS ECS
Tags: ledscommunity, tutorial, aws, aspnet
Published: 2024-04-24 17:10:11

## Introdução
Este artigo tem como objetivo ensinar como é possível levantar uma imagem Docker de uma Web API em ASP.NET para AWS ECS utilizando o GitLab Container Registry e o AWS Academy.

## Antes de Começarmos
Para poder utilizar o ECS da AWS, antes deve-se ter um registro de uma imagem Docker do seu projeto. Nesse caso, será utilizado como exemplo um registro no repositório do GitLab, mas também é possível utilizar outros registros como o do próprio Docker (DockerHub) ou o registro do ECR da AWS. Além disso, deve-se ter um cadastro na plataforma da AWS para uso das ferramentas. No caso deste artigo, será utilizado uma conta de estudante com acesso limitado a alguns módulos. Outro ponto a se considerar é a conexão da API com o banco de dados. No exemplo fornecido, a API está conectada a um banco levantado no próprio AWS por RDS, por meio de uma string de conexão no próprio código fonte.

## O Que é o ECS?
De acordo com a [documentação oficial da Amazon](https://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/Welcome.html), o ECS é um serviço totalmente gerenciado de orquestração de contêineres que ajuda a implantar, gerenciar e dimensionar facilmente aplicações conteinerizadas. Sendo assim, esse serviço se encaixa perfeitamente para as necessidades desse artigo.

## Salvando a imagem Docker em um Registry
Para esse exemplo será utilizado o Container Registry do GitLab para salvar e disponibilizar a imagem do Docker contendo o projeto.

1. Crie um repositório com o projeto que deseja dockerizar no GitLab.

2. Ao criar o repositório, vá até **Deploy -> Container Registry** na barra lateral.

![Container Registry](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62npzzw9oxe8udl50cjw.png)

3. Utilize os comandos mostrados na tela principal para realizar a publicação da imagem do Docker:

`docker login registry.gitlab.com`
`docker build -t [url do registro do projeto] .`
`docker push [url do registro do projeto]`

Os comandos de build podem variar contendo outras tags dependendo do projeto, então é importante prestar atenção a esses cuidados.

## Levantando o ECS em AWS

### Iniciando o Lab
Para começar o levantamento do ECS, primeiro deve-se acessar o AWS Lab para ter acesso aos serviços.

![Módulos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u0uyw5pwmeu8vpcs59as.png)

Clique em Start Lab, assim que o símbolo de AWS ficar verde clique nele.

![Start Lab](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/murgpu60o64fp8jvq8ee.png)

### Criando o ECS
Após isso, na aba de pesquisa coloca-se ECS para encontrar o serviço.

![Pesquisa ECS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hm7g6mjwxomi3x7hs9ah.png)

Clicando um ECS a seguinte tela deve aparecer.

![Tela ECS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72malg9bi2rmcvq2ggz3.png)

Crie um cluster para o serviço seguindo os passos, nesse caso será criado um cluster AWS Fargate (Sem servidor):
- Insira um nome para o cluster
- Selecione AWS Fargate

![Config ECS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e75i4rr740mznmavwuwm.png)

### Criando tarefas para rodar no Cluster

- Acesse **Definições da tarefa** na barra lateral.

![Definições da tarefa](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tf2z9r3kq7fs7su42ge4.png)

- Clique em **Criar nova definição de tarefa**.

- Defina um nome para a tarefa.

![Nome para tarefa](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q0naqqd0cn1sa15vo6od.png)

- Configure os requisitos de infraestrutura, nesse caso será mantido o AWS Fargate no tipo de inicialização, o sistema operacional deve ser o sistema no qual o seu Docker irá rodar, o tamanho da tarefa deve ser definido a partir dos requisitos da sua Web API (Para APIs com muita computação é aconselhável alterar os valores).

![Config Infra Tarefa](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s0j20ubwaebfzyavaowu.png)

Em funções da tarefa é interessante que em **Função de execução de tarefas** seja selecionado um perfil com as permissões necessárias para as ações da API, ou no caso de contas de estudante (como a utilizada), seja selecionada uma opção permitida. Nesse caso, será utilizado o perfil LabRole.

![Função de execução de tarefas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/01hfgf30umy3wha1zdxx.png)

- Agora será o momento de configurar o container para que rode no cluster.
  - Comece colocando um nome para o contêiner, o link para a imagem  do Docker no repositório, mantenha a opção de **Contêiner Essencial** como **Sim**, caso as imagens do repositório sejam privadas é necessário a configuração de um Secrets Manager no AWS para autenticação e acesso a imagem no repositório.

![Detalhes do contêiner](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s6wcfspriu5ytip6zy8s.png)

Caso não saiba, para conseguir o link para a imagem no repositório você deve ir em **Deploy -> Container Registry** após ter publicado a imagem e clicar no botão de copiar ao lado do nome da imagem.

![Gitlab docker image link](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vl1siwc92o4q81rmpzfe.png)

- Em mapeamento de porta coloque a porta em que a API estará respondendo, no exemplo será a porta 8080. Caso queira o protocolo da aplicação pode ser alterado também (por exemplo HTTP2 para HTTPS).

![Mapeamento de porta](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0c3buoojd02uhd261h5h.png)

No caso do exemplo o resto das opções podem ser mantidas como padrão.

### Inserindo a tarefa no Cluster
- Acesse o Cluster e clique em Criar na aba de Tarefa.

![Aba de Tarefa](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7thsymo6tzjwpgp0kb1j.png)

- Em **Ambiente** selecione a opção **Tipo de Inicialização** e mantenha em Fargate.

![Ambiente](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x024uujrbz6j9g9f0156.png)

- Em **Configuração de Implantação** selecione **Serviço**. No caso da Web API, selecione a família da tarefa criada para o cluster, atribua um nome, mantenha o tipo de serviço no padrão e coloque quantas tarefas irão ser inicializadas.

![Configuração de Implantação](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nz1u3zu1calysgeqsiv0.png)

Após isso, para esse exemplo pode-se manter o resto em padrão e clicar em Criar.

## Acessar a API Web por IP Público

Depois de criado o serviço no cluster basta acessar o cluster e na aba services selecionar o serviço criado.

Na tela do serviço clique em Tarefas e clique na Tarefa do serviço.

![Tarefa do serviço](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ggs2lcl8852fxhrkc6x.png)

Ao clicar na tarefa, na aba de **Configuração** será possível ver uma aba com o **IP Público**, por meio desse IP será possível acessar a API externamente.

![IP Público](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yrf1af2xbf7dh3to7p49.png)

Lembre-se de colocar a porta que deve ser acessada, assim como os caminhos próprios da API na URL para verificar funcionalidade.

![URL API](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msbuivtl4votomxg8new.png)

## Conclusão

Dessa forma, por meio desse artigo temos ao fim uma ASP.NET Web API Dockerizada rodando em ECS AWS. Essa publicação teve em mente detalhar e exemplificar melhor o processo de criação desse serviço utilizando imagens dos módulos. Por fim, é importante incentivar a leitura da documentação oficial do AWS assim como a busca por outros fóruns capazes de sanar dúvidas e questões relacionadas a passos específicos não elaborados suficientemente aqui.