Skip to content

mandre-dev/devops-project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ Projeto DevOps Completo β€” FastAPI + AWS + Kubernetes

Pipeline DevOps completo do zero: do cΓ³digo Γ  produΓ§Γ£o na AWS, com containerizaΓ§Γ£o, orquestraΓ§Γ£o, infraestrutura como cΓ³digo, CI/CD automatizado e monitoramento em tempo real.


πŸ“‹ Índice


πŸ“– Sobre o Projeto

Este projeto foi desenvolvido com o objetivo de construir um pipeline DevOps completo e funcional, cobrindo todas as etapas de um ciclo de entrega moderno:

  • Desenvolvimento de uma API REST com Python e FastAPI
  • ContainerizaΓ§Γ£o com Docker
  • OrquestraΓ§Γ£o com Kubernetes
  • Deploy na nuvem usando serviΓ§os gerenciados da AWS (EKS + RDS)
  • Infraestrutura como CΓ³digo com Terraform
  • CI/CD automatizado com GitHub Actions
  • Monitoramento com Grafana e Prometheus

A API em si Γ© uma aplicaΓ§Γ£o CRUD simples de itens, mas o foco do projeto Γ© a infraestrutura e o pipeline de entrega que envolve essa aplicaΓ§Γ£o.


πŸ—οΈ Arquitetura

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        GitHub                                β”‚
β”‚  Push na main β†’ GitHub Actions β†’ Build β†’ Push ECR β†’ Deploy  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      AWS Cloud                               β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                    VPC                               β”‚    β”‚
β”‚  β”‚                                                      β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚    β”‚
β”‚  β”‚  β”‚   Subnet PΓΊblica  β”‚    β”‚   Subnet Privada     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚                  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚    EKS     β”‚  β”‚    β”‚  β”‚   RDS MySQL   β”‚  β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚            β”‚  β”‚    β”‚  β”‚               β”‚  β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β”‚  API   β”‚ β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β”‚  Pod   β”‚ β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β”‚Grafana β”‚ β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β”‚  Pod   β”‚ β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚  β”‚    β”‚                     β”‚    β”‚    β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                              β”‚
β”‚  Load Balancer (PΓΊblico) ←── Internet                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ› οΈ Tecnologias Utilizadas

Categoria Tecnologia Uso
API Python 3.11, FastAPI, Uvicorn Desenvolvimento da aplicaΓ§Γ£o REST
Banco de Dados MySQL 8.0, SQLAlchemy, PyMySQL PersistΓͺncia de dados
ContainerizaΓ§Γ£o Docker, Docker Compose Empacotamento da aplicaΓ§Γ£o
OrquestraΓ§Γ£o Kubernetes, kubectl, minikube Gerenciamento de containers
Cloud AWS EKS, Amazon RDS, Amazon ECR ServiΓ§os gerenciados na nuvem
Rede VPC, Security Groups, Load Balancer Infraestrutura de rede
IaC Terraform, AWS Provider Infraestrutura como cΓ³digo
CI/CD GitHub Actions AutomaΓ§Γ£o de build e deploy
Monitoramento Grafana, Prometheus, Helm Observabilidade

πŸ“š Etapas do Projeto

01 β€” API REST com FastAPI + MySQL

Desenvolvimento de uma API REST com FastAPI em Python, com:

  • Rotas CRUD para gerenciamento de itens (GET, POST, PUT, DELETE)
  • ConexΓ£o com banco de dados MySQL via SQLAlchemy
  • ValidaΓ§Γ£o de dados com Pydantic
  • DocumentaΓ§Γ£o automΓ‘tica via Swagger UI em /docs
  • VariΓ‘veis de ambiente com python-dotenv
# Rodar localmente
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

02 β€” ContainerizaΓ§Γ£o com Docker

Empacotamento da aplicaΓ§Γ£o em containers portΓ‘teis e reproduzΓ­veis:

  • Dockerfile multi-stage otimizado com Python 3.11-slim
  • Docker Compose orquestrando API + MySQL com health checks
  • Volume persistente para dados do banco
  • Rede interna entre os containers
# Subir os containers
docker compose up --build -d

# Ver logs
docker compose logs -f api

03 β€” OrquestraΓ§Γ£o com Kubernetes

PrΓ‘tica de Kubernetes localmente com minikube antes de ir para a nuvem:

  • Deployment com 2 rΓ©plicas da API
  • Service do tipo LoadBalancer
  • Secret para credenciais do banco
  • ConfigMap para variΓ‘veis de ambiente
  • Auto-healing: pods reiniciados automaticamente em caso de falha
# Aplicar os manifestos
kubectl apply -f k8s/

# Verificar pods
kubectl get pods

04 β€” Cloud AWS β€” Amazon EKS + RDS MySQL

Deploy na AWS usando serviΓ§os gerenciados:

  • Amazon EKS (Elastic Kubernetes Service) para orquestrar os containers
  • Amazon RDS MySQL para banco de dados com backups automΓ‘ticos
  • Amazon ECR como registro privado de imagens Docker
  • Cluster criado com eksctl na regiΓ£o us-east-1
# Criar cluster EKS
eksctl create cluster --name devops-cluster --region us-east-1 \
  --nodegroup-name workers --node-type t3.small --nodes 1 --version 1.31

# Configurar kubectl
aws eks update-kubeconfig --name devops-cluster --region us-east-1

05 β€” Redes, Firewall e ExposiΓ§Γ£o

ConfiguraΓ§Γ£o de rede segura na AWS:

  • VPC com subnets pΓΊblicas (EKS) e privadas (RDS)
  • Security Groups com regras mΓ­nimas necessΓ‘rias
  • RDS acessΓ­vel somente pelos nΓ³s do EKS (porta 3306 restrita)
  • API exposta na internet via AWS Load Balancer criado automaticamente pelo Kubernetes Service

06 β€” Infraestrutura como CΓ³digo com Terraform

Toda a infraestrutura AWS declarada em cΓ³digo:

terraform/
β”œβ”€β”€ main.tf       # Provider AWS
β”œβ”€β”€ variables.tf  # VariΓ‘veis de entrada
β”œβ”€β”€ outputs.tf    # Outputs (endpoints)
β”œβ”€β”€ vpc.tf        # VPC e subnets
β”œβ”€β”€ eks.tf        # Cluster EKS
└── rds.tf        # Banco RDS MySQL
# Subir toda a infraestrutura
terraform init
terraform plan
terraform apply -auto-approve

# Destruir tudo
terraform destroy -auto-approve

07 β€” CI/CD com GitHub Actions

Pipeline automatizado em .github/workflows/deploy.yml:

Push na main
    β”‚
    β–Ό
Checkout do cΓ³digo
    β”‚
    β–Ό
Configurar credenciais AWS
    β”‚
    β–Ό
Login no Amazon ECR
    β”‚
    β–Ό
Build da imagem Docker
    β”‚
    β–Ό
Push da imagem no ECR
    β”‚
    β–Ό
Configurar kubectl β†’ EKS
    β”‚
    β–Ό
kubectl set image β†’ Deploy
    β”‚
    β–Ό
kubectl rollout status β†’ ValidaΓ§Γ£o

08 β€” Monitoramento com Grafana + Prometheus

Stack de observabilidade instalada no prΓ³prio cluster EKS via Helm:

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set grafana.service.type=LoadBalancer

Dashboards configurados:

  • Node Exporter Full (ID: 1860) β€” CPU, memΓ³ria, disco e rede dos nΓ³s
  • Kubernetes Cluster (ID: 3119) β€” visΓ£o geral do cluster

πŸ“ Estrutura de Pastas

devops-project/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ main.py           # Entrypoint da API
β”‚   β”œβ”€β”€ database.py       # ConexΓ£o SQLAlchemy
β”‚   β”œβ”€β”€ models.py         # Modelos ORM
β”‚   β”œβ”€β”€ schemas.py        # Schemas Pydantic
β”‚   └── routers/
β”‚       β”œβ”€β”€ __init__.py
β”‚       └── items.py      # Rotas CRUD
β”œβ”€β”€ k8s/
β”‚   β”œβ”€β”€ api-deployment.yaml    # Deployment + Service da API
β”‚   └── mysql-deployment.yaml  # Deployment + Service do MySQL
β”œβ”€β”€ terraform/
β”‚   β”œβ”€β”€ main.tf
β”‚   β”œβ”€β”€ variables.tf
β”‚   β”œβ”€β”€ outputs.tf
β”‚   β”œβ”€β”€ vpc.tf
β”‚   β”œβ”€β”€ eks.tf
β”‚   └── rds.tf
β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       └── deploy.yml    # Pipeline CI/CD
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ requirements.txt
└── .gitignore

πŸš€ Como Executar

PrΓ©-requisitos

  • Python 3.11+
  • Docker e Docker Compose
  • kubectl
  • AWS CLI configurado
  • Terraform
  • eksctl
  • Helm

Rodando localmente

# Clone o repositΓ³rio
git clone https://github.com/mandre-dev/devops-project.git
cd devops-project

# Crie o ambiente virtual
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# Configure o .env
echo 'DATABASE_URL=mysql+pymysql://root:root@localhost:3306/devopsdb' > .env

# Suba com Docker Compose
docker compose up --build -d

# Acesse a API
# http://localhost:8000/docs

Subindo na AWS com Terraform

cd terraform/

# Inicialize e aplique
terraform init
terraform apply -auto-approve

# Configure o kubectl
aws eks update-kubeconfig --name devops-cluster --region us-east-1

# Configure o acesso
aws eks create-access-entry --cluster-name devops-cluster \
  --principal-arn arn:aws:iam::<ACCOUNT_ID>:root --region us-east-1

# Deploy da aplicaΓ§Γ£o
kubectl create secret generic db-secret \
  --from-literal=database_url='mysql+pymysql://devops:SenhaForte123!@<RDS_ENDPOINT>:3306/devopsdb'

kubectl apply -f ../k8s/

# Obtenha o IP pΓΊblico da API
kubectl get service api-service

βš™οΈ CI/CD

O pipeline Γ© acionado automaticamente a cada push na branch main.

Secrets necessΓ‘rios no GitHub:

Secret DescriΓ§Γ£o
AWS_ACCESS_KEY_ID Chave de acesso AWS
AWS_SECRET_ACCESS_KEY Chave secreta AWS
AWS_REGION RegiΓ£o AWS (ex: us-east-1)
ECR_REGISTRY URL do registro ECR
EKS_CLUSTER_NAME Nome do cluster EKS

πŸ“Š Monitoramento

ApΓ³s instalar o stack de monitoramento, acesse o Grafana:

# Obtenha o IP do Grafana
kubectl get service kube-prometheus-stack-grafana -n monitoring

# Obtenha a senha do admin
kubectl get secret --namespace monitoring kube-prometheus-stack-grafana \
  -o jsonpath='{.data.admin-password}' | base64 --decode
  • URL: http://<EXTERNAL-IP>
  • UsuΓ‘rio: admin
  • Senha: resultado do comando acima

⚠️ Custos AWS

Para evitar cobranΓ§as desnecessΓ‘rias, destrua a infraestrutura apΓ³s os estudos:

cd terraform/
terraform destroy -auto-approve

Estimativa de custo por hora:

  • EKS Control Plane: ~USD 0.10/h
  • EC2 t3.small (1 nΓ³): ~USD 0.023/h
  • NAT Gateway: ~USD 0.045/h
  • RDS db.t3.micro: gratuito no Free Tier

πŸ‘¨β€πŸ’» Autor

Mandre β€” @mandre-dev


Projeto desenvolvido para aprendizado prΓ‘tico de DevOps β€” do cΓ³digo Γ  produΓ§Γ£o. πŸš€

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors