AWS NodeJS App 08 – Publicação da aplicação no AWS Elastic Container Service (ECS)

” O Amazon Elastic Container Service (Amazon ECS) é um serviço altamente escalável e de alta performance para a orquestração de contêineres que é compatível com contêineres do Docker e permite executar e escalar facilmente aplicativos conteinerizados na AWS. O Amazon ECS elimina a necessidade de instalar e operar o seu próprio software de orquestração de contêineres, gerenciar e escalar um cluster de máquinas virtuais ou programar contêineres nessas máquinas virtuais. “

Fonte: https://aws.amazon.com/pt/ecs/

O primeiro passo é verificar se temos do docker instalado dentro da nossa instância Cloud9, para isso abra o terminal e digite:

docker --version

Apenas caso o sistema responda que o comando não foi encontrado, utilize o seguinte comando para instalar o docker: sudo yum install -y docker

O primeiro passo é criar um arquivo chamado Dockerfile (na raiz do projeto), neste arquivo vamos inserir os comandos necessários para a partir da imagem docker node:10, copiar nosso código fonte da aplicação, instalar as dependências e quando o container for instanciado, executar o comando npm start para iniciar a aplicação.

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]

Em seguida vamos criar mais um arquivo o .dockerignore esse arquivo indicará para docker build quais pastas e arquivos não devem ser copiados para a imagem.

node_modules
npm-debug.log

Agora que tudo esta pronto, podemos iniciar o processo de build do container docker para isso execute o comando dentro da pasta do projeto.

docker build -t shoppingawsfaeg:latest .

No final do processo, o docker irá apresentar a mensagem indicando que o build foi realizado com sucesso e a imagem com o nome shoppingawsfaeg:latest foi criada.

Podemos instanciar o container docker utilizando o comando

sudo docker run -d -it --expose 8080 -p 0.0.0.0:8080:3000 shoppingawsfaeg:latest

Observe que se logo em seguida executarmos o comando docker ps, o container esta em execução.

Agora podemos encerrar sua execução com o comando:

docker stop <CONTAINER ID>
docker rm <CONTAINER ID>

Container Registry

Agora que a imagem esta pronta, precisamos enviá-la para o container registry. A AWS possui o ECR que faz esse processo, mas vamos utilizando o Docker Hub por ser gratuito, para isso, acesse hub.docker.com e crie uma conta.

Agora que já temos uma conta no Docker Hub, precisamos autenticar nosso docker cli nesta conta, para isso execute o comando, e informe as credenciais.

docker login

Em seguida devemos modificar a tag da nossa imagem docker para iniciar com o nome do nosso usuário no Docker Hub.

docker tag shoppingawsfaeg:latest <SEUUSUARIODOCKERHUB>/shoppingawsfaeg:latest

Observe que se em seguida executarmos o comando docker images, a imagem aparece duas vezes com nomes diferentes.

Agora vamos enviar nossa imagem para o Docker Hub utilizando o comando:

docker push <SEUUSUARIO>/shoppingawsfaeg:latest

Após concluir o processo, a imagem estará disponível publicamente no Docker Hub

Elastic Container Service (ECS)

Chegou a hora de colocar a aplicação no ar, para isso vamos acessar o console da AWS e ir para a ferramenta ECS.

O primeiro passo é a criação do CLUSTER, para isso acesse no menu lateral a opção Cluster e clique no botão Create Cluster.

Vamos utilizar a opção Fargate, onde a AWS ficará responsável por provisionar as instâncias EC2 necessárias para executar nossa aplicação. Clique no botão next step no final da página.

Na próxima tela informe o nome do cluster e clique no botão create.

A mensagem de sucesso será apresentada em seguida.

Retornando ao menu principal, clique na opção Task Definitions.

Em seguida clique no botão create new task definition.

Selecione a opção Fargate e clique em next step.

Na primeira etapa informe o nome da task e selecione a task role que é apresentada na lista.

Em seguida na opção Task Size, informe a quantidade de memória e de CPU.

Agora clique no botão azul Add Container. Na próxima tela informe um nome para o container e no campo image o nome da imagem no Docker Hub.

Seguindo com o processo na mesma tela mais a baixo, no campo port mapping informe o valor 3000. E conclua clicando no botão Add.

Certifique que as opções Enable App Mesh Integration e Enable Proxy configuration estejam desmarcadas e clique no botão create.

Agora que temos o Cluster criado e a Task definition criada, é hora de unir os dois e colocar a aplicação no ar. Para isso, retorne a tela inicial do ECS e clique no menu lateral Clusters e depois no clusterfaegaws.

Clique no botão create da aba Services.

Na tela seguinte, selecione o tipo FARGATE, selecione a task definition, informe o nome do serviço e insira o valor de tasks igual a um.

Mantenha a opção de Deployments como Rolling update e clique em next step.

Na tela seguinte escolha a VPC padrão e as subnets de acordo com as zonas de disponibilidade da sua região.

Mais a baixo na opção auto-assign public IP selecione ENABLED e na opção Load Balancer selecione NONE.

Em seguida, mais a baixo ainda na mesma tela, desmarque a opção Enable Service Discovery Integration e clique em next step.

Na próxima tela, mantenha a opção do Auto Scaling desabilitado e clique em next step.

E no último passo confirme os dados clicando no botão create service.

A tela a seguir apresentará a criação do serviço dentro do cluster com base na task definition. Clique no botão View Service.

Aguarde até o status da task aparecer como RUNNING, então clique no ID da task que esta na primeira coluna desta grid.

No início da tela, será apresentado o IP público para acessar a aplicação. Mas antes de acessá-la precisamos modificar a role vinculada a essa task ECS para dar permissão a aplicação para acessar o S3 e o DynamoDB.

Vamos acessar o IAM, e buscar pela ROLE que foi apresentada no processo de criação do serviço.

E em seguida alterar a ROLE para vincular a policy do S3 e do DynamoDB para dar permissão de acesso a esses recursos: IMPORTANTE nunca utilize a policy do tipo FULL ACCESS.

Por fim precisamos liberar a porta 3000 no Security Group do serviço, para isso acesse o cluster e clique no nome do serviço na grid. No final da tela será apresentado o Security Group vinculado a ela. Clique no link.

Edite as regras de inbound para criar um novo item liberando a porta 3000.

Utilize o IP público para acessar a aplicação na porta 3000