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