Skip to content

06 ‐ Deploy

Iago Souza edited this page Dec 3, 2024 · 6 revisions

6.1 - Motivações

Para o deploy do projeto, a escolha de tecnologias como AWS, Linux, Django e Docker é estratégica, garantindo escalabilidade, segurança e eficiência, especialmente considerando que o cliente já possui familiaridade com Linux. Vamos aos pontos principais:

6.1.1 - AWS (Amazon Web Services)

A AWS é uma plataforma em nuvem líder no mercado, oferecendo uma infraestrutura robusta e escalável. Com ela, podemos facilmente aumentar ou reduzir recursos de acordo com a demanda do projeto, pagando apenas pelo que for utilizado. Além disso, a AWS oferece uma ampla gama de serviços, como gerenciamento de banco de dados e redes virtuais, que podem ser integrados para aprimorar o desempenho e a segurança do sistema.

6.1.2 - Linux

Como o cliente já utiliza Linux, a escolha desse sistema operacional como base no servidor traz vantagens claras. O Linux é conhecido por sua estabilidade, segurança e flexibilidade, permitindo total controle do ambiente de desenvolvimento e produção. Além disso, a compatibilidade com diversas ferramentas de código aberto, como Docker e Django, é um benefício que facilita a manutenção e a configuração da aplicação.

6.1.3 - Django

O Django é um framework web de alto nível para Python, ideal para desenvolver aplicações rapidamente, com foco em segurança e escalabilidade. Ele vem com várias funcionalidades integradas, como autenticação e proteção contra ataques comuns, o que acelera o desenvolvimento e reduz o risco de vulnerabilidades. Django é amplamente utilizado por grandes empresas, sendo uma escolha sólida para garantir uma aplicação performática e segura.

6.1.4 - Docker

O uso de Docker é essencial para garantir a portabilidade da aplicação, pois permite a criação de contêineres que isolam a aplicação e suas dependências. Os principais benefícios são:

  • Consistência entre Ambientes: O Docker garante que o ambiente de desenvolvimento, testes e produção sejam idênticos.
  • Escalabilidade Facilitada: A solução de contêineres facilita o escalonamento horizontal, já que a infraestrutura pode ser facilmente replicada.
  • Facilidade de Atualizações: Com Docker, é possível atualizar a aplicação de forma rápida e sem interrupção de serviço.

6.1.5 - ECS (Elastic Container Service)

O ECS é a ferramenta principal para orquestrar contêineres na AWS, permitindo gerenciar, escalar e monitorar os contêineres de forma eficiente:

  • Escalonamento Automático: O ECS pode aumentar ou reduzir automaticamente o número de contêineres em execução com base na demanda.
  • Gerenciamento Simplificado: Ao invés de gerenciar instâncias EC2 manualmente, o ECS cuida da criação e da administração dos contêineres de forma simples e eficiente.

6.1.6 - ECR (Elastic Container Registry)

O ECR é usado para armazenar e gerenciar imagens Docker. Ele integra-se diretamente com o ECS, permitindo que os contêineres sejam facilmente atualizados sempre que uma nova versão da imagem for empurrada para o repositório.

6.1.7 - GitHub Actions para CI/CD

GitHub Actions será usado para automação de build e deploy da aplicação:

  • Automação de Build: Sempre que um push for feito na branch main, o GitHub Actions irá construir uma nova imagem Docker e empurrá-la para o ECR.
  • Deploy Automatizado: Após a imagem ser empurrada para o ECR, o Github Actions irá disparar uma ação para criar uma nova Task Definition e atualizar os contêineres em execução no ECS.

6.1.8 - RDS para Banco de Dados PostgreSQL

Usaremos o RDS para o banco de dados PostgreSQL, garantindo:

  • Alta Disponibilidade e Backup: O RDS oferece suporte para Multi-AZ, garantindo que o banco de dados esteja sempre disponível.
  • Escalabilidade Automática: O RDS pode ser escalado conforme a demanda, permitindo aumentar a capacidade do banco de dados conforme o número de usuários cresce.

6.1.9 - ElastiCache para Cache Redis

O ElastiCache com Redis será utilizado para acelerar o acesso a dados frequentemente acessados e melhorar a performance da aplicação:

  • Cache de Sessão e Dados Temporários: O Redis armazenará sessões de usuários, dados em cache e resultados de consultas, aliviando a carga no banco de dados.
  • Alta Performance: O Redis permite consultas e operações de leitura extremamente rápidas.

6.1.10 - Load Balancer

O Load Balancer será utilizado para distribuir o tráfego entre as instâncias ECS de forma eficiente e garantir a alta disponibilidade da aplicação:

  • Distribuição de Tráfego: O Load Balancer distribuirá automaticamente o tráfego de entrada entre os contêineres em execução no ECS, assegurando que a carga de trabalho seja balanceada e que nenhuma instância receba tráfego excessivo.
  • Alta Disponibilidade: Em caso de falha de uma instância ou contêiner, o Load Balancer garante que o tráfego seja redirecionado para as instâncias saudáveis, minimizando o impacto na disponibilidade da aplicação.
  • SSL/TLS: O Load Balancer pode ser configurado para realizar o término de SSL, garantindo que a comunicação entre o cliente e o servidor seja segura.

Embora o Elastic Load Balancer (ELB) seja uma excelente solução para garantir alta disponibilidade e balanceamento de tráfego, ele será utilizado apenas quando necessário, com o objetivo de otimizar os custos e melhorar a escalabilidade da aplicação.

6.2 - Acesso à Máquina AWS e Deployment

6.2.1 - Acesso à máquina AWS via SSH

Acesse a instância EC2 (ou o ambiente gerenciado pelo ECS) para realizar manutenções ou verificações utilizando o comando SSH:

ssh -i "caminho/para/sua_chave.pem" user@ip-da-maquina

6.2.2 - Build da Imagem Docker via GitHub Actions

Toda vez que houver um push na branch main, o GitHub Actions acionará automaticamente o processo de build e push da imagem Docker para o ECR.

6.2.3 - Deploy via ECS

Com a imagem atualizada no ECR, o GitHub Actions irá disparar uma ação para criar uma nova Task Definition e atualizar os contêineres:

  • Pull da Imagem: O ECS puxa a nova imagem Docker do ECR.
  • Atualização das Tarefas: O ECS reinicia os contêineres com a nova imagem baseada na nova Task Definition.
  • Escalonamento: Se necessário, o ECS escalona os contêineres conforme a demanda, aumentando ou diminuindo o número de instâncias.

6.2.4 - RDS e ElastiCache

Garanta que o RDS e o ElastiCache estejam corretamente configurados e escalados para suportar a carga da aplicação. O RDS pode ser monitorado pelo CloudWatch, e o ElastiCache pode ser ajustado para otimizar a performance.

Uso de Instâncias Micro

Considerando as necessidades da aplicação e a separação entre o back-end e o front-end, o uso de várias instâncias do tipo micro é uma abordagem vantajosa. Isso permite isolar e escalonar cada parte da aplicação de maneira eficiente, mantendo uma estrutura leve e econômica. A abordagem de instâncias micro facilita o gerenciamento e a alocação dinâmica de recursos, garantindo que tanto o front-end quanto o back-end possam ser ajustados conforme a demanda, sem comprometer a performance.