API serverless para repositório e recomendação de livros, desenvolvida como projeto da Pós-Graduação FIAP.
Sistema de gerenciamento e recomendação de livros com arquitetura cloud-native na AWS. A aplicação realiza scraping automatizado de dados de livros, armazena em DynamoDB e disponibiliza APIs REST para consulta e recomendações baseadas em Machine Learning.
- ECS (Fargate): Hospedagem da API conteinerizada
- Lambda: Scraping de dados e processamento de eventos S3
- DynamoDB: Banco de dados NoSQL (tabelas Books e users)
- S3: Armazenamento de arquivos CSV do scraping (bucket:
fiap-postech-scrape-book) - EventBridge: Agendamento automático do scraping
- ECR: Registry de imagens Docker
- CloudWatch: Logs e métricas
- EventBridge dispara Lambda de scraping periodicamente
- Lambda salva CSV no S3
- Trigger S3 aciona Lambda que insere dados no DynamoDB
- API ECS consulta DynamoDB para servir requisições
- Dashboard Streamlit consome métricas do CloudWatch
PosTech-Fiap/
├── app/ \
│ ├── routers/ # Endpoints da API
│ ├── core/ # Autenticação e configurações
│ ├── internal/ # Modelo de ML para recomendações
│ └── models/ # Modelos de dados (Pydantic)
├── dashboard/ # Dashboard Streamlit
├── requirements.txt # Dependências Python
├── Dockerfile # Imagem Docker da aplicação
└── .github/workflows/ # CI/CD GitHub Actions- Python 3.11 \
- AWS CLI v3 \
- Docker (para build local) \
- Conta AWS configurada
aws configure \
AWS Access Key ID: [sua-key] \
AWS Secret Access Key: [seu-secret] \
Default region name: us-east-2 \
Default output format: jsonTabela Books:
aws dynamodb create-table \
--table-name Books \
--attribute-definitions AttributeName=id,AttributeType=N \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-2Tabela users:
aws dynamodb create-table \
--table-name users \
--attribute-definitions AttributeName=id,AttributeType=N \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-2Criar arquivo .env na raiz do projeto:
SECRET_KEY=seu-secret-key-gerado-aqui-minimo-32-caracteres
AWS_DEFAULT_REGION=us-east-2Gerar SECRET_KEY seguro: \
python3 -c "import secrets; print(secrets.token_urlsafe(32))"git clone https://github.com/rods/PosTech-Fiap.git
cd PosTech-Fiappython3.11 -m venv venv \
source venv/bin/activate (Linux/Mac) \
ou \
venv\Scripts\activate (Windows)pip install -r requirements.txtuvicorn app.main:app --reloadA API estará disponível em: http://localhost:8000
streamlit run dashboard/app.py --server.port 8500Dashboard disponível em: http://localhost:8500
Acesse a documentação interativa em: http://localhost:8000/docs
GET /api/v1/healthResponse:
{
"status": "ok"
}POST /api/v1/auth/login
Content-Type: application/json
{
"username": "seu-usuario",
"password": "sua-senha"
}Response:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"message": "Login successful"
}POST /api/v1/books
Authorization: Bearer {token}
Content-Type: application/json
{
"id": 1,
"title": "Clean Code",
"price": 89.90,
"rating": 4.8,
"availability": true,
"category": "Programming"
}Response (201):
{
"message": "Livro criado com sucesso",
"id": 1,
"created_by": "usuario"
}Possíveis Erros:
401: Token inválido ou ausente409: Livro com esse ID já existe500: Erro interno do servidor
GET /api/v1/books/search?title=Clean&category=Programming
Authorization: Bearer {token}Parâmetros de Query:
title(opcional): Busca parcial no títulocategory(opcional): Busca exata por categoria- Pelo menos um parâmetro é obrigatório Response:
[
{
"id": 1,
"title": "Clean Code",
"price": 89.90,
"rating": 4.8,
"availability": true,
"category": "Programming"
}
]Possíveis Erros:
400: Nenhum parâmetro de busca fornecido401: Token inválido ou ausente500: Erro interno do servidor
POST /api/v1/ml/predictions"
Content-Type: application/json
{
"book_title": "Clean Code"
}Response:
{
"input_book": {
"title": "Clean Code",
"rating": "One",
"price": "89.99"
},
"recommendations": [
{
"title": "Mesaerion: The Best Science Fiction Stories 1800-1849",
"category": "Science Fiction",
"rating": "One",
"price": "£37.59"
}
],
"filter_criteria": "Rating similar ou igual a 'One'"
}Todas as rotas POST requerem autenticação JWT.
Como usar:
- Faça login em
/auth/loginpara obter o token - Inclua o token no header:
Authorization: Bearer {seu-token} - Token expira em 30 minutos
O deploy é automatizado via GitHub Actions:
- Push na branch
maindispara o workflow - Build da imagem Docker
- Push para Amazon ECR
- Deploy no ECS Fargate
- EventBridge agenda execução periódica
- Lambda Scraper coleta dados do site fonte
- Salva arquivo CSV no bucket S3
fiap-postech-scrape-book - Trigger S3 aciona Lambda de processamento
- Lambda insere/atualiza registros no DynamoDB
Localizado em /app/internal/, o modelo de Machine Learning analisa:
- Ratings dos livros
Retorna recomendações.
Dashboard Streamlit para visualização de logs e métricas:
- Logs
- Requests (acessos, erros, cache)
- Métricas de serviço
- Logs do CloudWatch
Acesso: URL fornecida na documentação do trabalho (por segurança)
- Autenticação JWT com expiração de 30 minutos
- Validação de tokens em todas as rotas protegidas
- IAM roles com permissões mínimas necessárias
- Região AWS: us-east-2 (Ohio)
- Tabelas DynamoDB usam billing mode PAY_PER_REQUEST
- Logs disponíveis no CloudWatch Logs
- Imagens Docker armazenadas no ECR privado
Projeto desenvolvido como requisito da Pós-Graduação FIAP.
Projeto acadêmico - FIAP 2025
