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.
- Sobre o Projeto
- Arquitetura
- Tecnologias Utilizadas
- Etapas do Projeto
- Estrutura de Pastas
- Como Executar
- CI/CD
- Monitoramento
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.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| 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 |
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 8000Empacotamento 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 apiPrΓ‘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 podsDeploy 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-1ConfiguraΓ§Γ£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
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-approvePipeline 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
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=LoadBalancerDashboards configurados:
- Node Exporter Full (ID: 1860) β CPU, memΓ³ria, disco e rede dos nΓ³s
- Kubernetes Cluster (ID: 3119) β visΓ£o geral do cluster
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
- Python 3.11+
- Docker e Docker Compose
- kubectl
- AWS CLI configurado
- Terraform
- eksctl
- Helm
# 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/docscd 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-serviceO 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 |
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
Para evitar cobranΓ§as desnecessΓ‘rias, destrua a infraestrutura apΓ³s os estudos:
cd terraform/
terraform destroy -auto-approveEstimativa 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
Mandre β @mandre-dev
Projeto desenvolvido para aprendizado prΓ‘tico de DevOps β do cΓ³digo Γ produΓ§Γ£o. π