Dashboard analítico serverless en AWS que visualiza estadísticas musicales de Spotify en tiempo real
- Propósito
- Arquitectura
- Quick Start
- Autenticación Spotify
- Estructura S3
- Comandos AWS CLI
- Dashboard QuickSight
- Costos
- Costos
Problema: Los usuarios de Spotify solo reciben estadísticas una vez al año.
Solución: Dashboard serverless que extrae, procesa y visualiza datos musicales automáticamente cada 24 horas.
Valor Demostrado:
- ✅ Arquitectura serverless escalable
- ✅ Pipeline ETL completo con Python/Pandas
- ✅ Integración de APIs REST (OAuth 2.0)
- ✅ Visualización de datos con BI
- ✅ Infraestructura como código
- ✅ Costo operacional < $10/mes
*Dashboard en Quicksight con los kpis basicos del mini wrapped *
Spotify API → Lambda (Python) → S3 (CSV) → QuickSight → Dashboard
↑
EventBridge (Scheduler)
| Componente | Tecnología | Propósito |
|---|---|---|
| Compute | AWS Lambda | Procesamiento serverless |
| Storage | AWS S3 | Data Lake (CSV) |
| Orchestration | EventBridge | Scheduler (cron) |
| Analytics | QuickSight | BI Dashboard |
| Processing | Pandas | ETL y transformación |
# AWS CLI configurado
aws configure
# Python 3.11+
python --version
# Cuenta Spotify Developer
# https://developer.spotify.com/dashboard# Clonar repositorio
git clone https://github.com/tu-usuario/spotify-wrapped-poc.git
cd spotify-wrapped-poc
# Configurar variables
export AWS_REGION=us-east-1
export S3_BUCKET=mini-wrapped-data-analytics
export SPOTIFY_ACCESS_TOKEN=tu_token# Crear infraestructura S3
./scripts/setup_s3.sh
# Crear rol IAM
./scripts/setup_iam.sh
# Desplegar Lambda
cd lambda && ./deploy.sh
# Configurar scheduler
./scripts/setup_eventbridge.sh
# Ejecutar primera vez
aws lambda invoke --function-name spotify-wrapped-extractor response.json# Ver archivos generados
aws s3 ls s3://mini-wrapped-data-analytics/ --recursive
# Ver logs
aws logs tail /aws/lambda/spotify-wrapped-extractor --followMétodo Rápido (Desarrollo):
# 1. Ir a: https://developer.spotify.com/console/get-recently-played/
# 2. Click "GET TOKEN"
# 3. Seleccionar scopes:
# ☑ user-read-recently-played
# ☑ user-top-read
# 4. Autorizar y copiar tokenScopes Requeridos:
| Scope | Endpoint | Propósito |
|---|---|---|
user-read-recently-played |
/me/player/recently-played |
Historial último mes |
user-top-read |
/me/top/tracks /me/top/artists |
Rankings de favoritos |
# 1. Recently Played - Historial real de reproducción
GET https://api.spotify.com/v1/me/player/recently-played
Params: {limit: 50, after: timestamp_30_dias_atras}
# 2. Top Tracks - Canciones más escuchadas (algorítmico)
GET https://api.spotify.com/v1/me/top/tracks
Params: {time_range: "short_term", limit: 50}
# 3. Top Artists - Artistas favoritos + géneros
GET https://api.spotify.com/v1/me/top/artists
Params: {time_range: "short_term", limit: 50}¿Por qué estos endpoints?
recently-played: Único con historial real + timestampstop-tracks: Ranking pre-calculado por Spotifytop-artists: Incluye géneros musicales (no disponible en otros)
# Script rápido
./scripts/update_token.sh
# O manualmente
aws lambda update-function-configuration \
--function-name spotify-wrapped-extractor \
--environment Variables="{
S3_BUCKET_NAME=mini-wrapped-data-analytics,
SPOTIFY_ACCESS_TOKEN=nuevo_token
}"mini-wrapped-data-analytics/
│
├── top_canciones/
│ ├── manifest.json # QuickSight manifest
│ └── top_canciones.csv # Dataset actual
│
├── top_artistas/
│ ├── manifest.json
│ └── top_artistas.csv
│
├── actividad_diaria/
│ ├── manifest.json
│ └── actividad_diaria.csv
│
├── actividad_horaria/
│ ├── manifest.json
│ └── actividad_horaria.csv
│
├── generos/
│ ├── manifest.json
│ └── generos.csv
│
├── resumen/
│ ├── manifest.json
│ └── resumen.csv
│
└── historico/ # Archivos con timestamp
└── top_canciones_20250103.csv
#!/bin/bash
BUCKET="mini-wrapped-data-analytics"
# Crear bucket
aws s3 mb s3://${BUCKET}
# Crear carpetas
for folder in top_canciones top_artistas actividad_diaria actividad_horaria generos resumen historico
do
aws s3api put-object --bucket ${BUCKET} --key "${folder}/"
done
# Habilitar versionado
aws s3api put-bucket-versioning \
--bucket ${BUCKET} \
--versioning-configuration Status=Enabled
Vista del bucket en consola AWS
# Ver configuración
aws lambda get-function-configuration --function-name spotify-wrapped-extractor
# Actualizar código
aws lambda update-function-code \
--function-name spotify-wrapped-extractor \
--zip-file fileb://lambda.zip
# Ver logs en tiempo real
aws logs tail /aws/lambda/spotify-wrapped-extractor --follow
# Invocar manualmente
aws lambda invoke --function-name spotify-wrapped-extractor output.json# Listar archivos
aws s3 ls s3://mini-wrapped-data-analytics/ --recursive
# Descargar CSV
aws s3 cp s3://mini-wrapped-data-analytics/top_canciones/top_canciones.csv .
# Ver contenido de manifest
aws s3 cp s3://mini-wrapped-data-analytics/top_canciones/manifest.json - | jq .# Ver reglas
aws events list-rules
# Deshabilitar scheduler
aws events disable-rule --name spotify-wrapped-daily
# Cambiar frecuencia a semanal
aws events put-rule \
--name spotify-wrapped-daily \
--schedule-expression "rate(7 days)"# Despliegue completo
./scripts/full_deploy.sh
# Ejecutar Lambda manualmente
./scripts/run_manual.sh
# Actualizar token Spotify
./scripts/update_token.sh
# Verificar datos en S3
./scripts/verify_data.sh1. Activar QuickSight
https://quicksight.aws.amazon.com/
→ Sign up → Standard Edition ($9/mes)
2. Dar Permisos a S3
QuickSight → Manage QuickSight → Security & permissions
→ Add S3 bucket: mini-wrapped-data-analytics
3. Crear 6 Datasets
Usar estas URLs en QuickSight (New dataset → S3 → Upload manifest):
s3://mini-wrapped-data-analytics/top_canciones/manifest.json
s3://mini-wrapped-data-analytics/top_artistas/manifest.json
s3://mini-wrapped-data-analytics/actividad_diaria/manifest.json
s3://mini-wrapped-data-analytics/actividad_horaria/manifest.json
s3://mini-wrapped-data-analytics/generos/manifest.json
s3://mini-wrapped-data-analytics/resumen/manifest.json
Vista de datasets en QuickSight
| Visual | Tipo | Dataset | Configuración |
|---|---|---|---|
| KPIs | KPI Cards | Resumen | 4 métricas principales |
| Top Canciones | Horizontal Bar | Top Canciones | Top 10 por reproducciones |
| Top Artistas | Vertical Bar | Top Artistas | Top 5 artistas |
| Actividad Diaria | Line Chart | Actividad Diaria | Canciones/minutos por día |
| Distribución Semanal | Bar Chart | Actividad Diaria | Canciones por día semana |
| Heat Map | Heat Map | Actividad Horaria | Hora × Día de semana |
| Géneros | Donut Chart | Géneros | Top 5 géneros |
| Tabla Detalle | Table | Top Canciones | Ranking detallado |
Detalle de visualizaciones individuales
| Servicio | Uso | Costo |
|---|---|---|
| Lambda | 30 ejecuciones/mes | $0.11 |
| S3 | 150 MB | $0.00 |
| EventBridge | 30 invocaciones | $0.00 |
| QuickSight | 1 autor | $9.00 |
| TOTAL | ~$9.11/mes |
Con AWS Free Tier (primeros 12 meses): $9/mes (solo QuickSight)
# Reducir a ejecución semanal (ahorro ~$0.08/mes)
aws events put-rule --name spotify-wrapped-daily \
--schedule-expression "rate(7 days)"
# Usar QuickSight Reader en lugar de Author
# Reader: $5/mes (solo visualización)
# Author: $9/mes (edición de dashboards)# Token expirado o sin scopes correctos
# Obtener nuevo token: https://developer.spotify.com/console/
./scripts/update_token.sh# Aumentar timeout a 5 minutos
aws lambda update-function-configuration \
--function-name spotify-wrapped-extractor \
--timeout 300QuickSight → Manage QuickSight → Security & permissions
→ QuickSight access to AWS services
→ Seleccionar tu bucket S3
# Recrear manifests
./scripts/upload_manifests.sh
# Verificar formato
aws s3 cp s3://bucket/top_canciones/manifest.json - | jq .[Tu Nombre]
MIT License - Este proyecto es de código abierto para propósitos educativos.
Si este proyecto te ayudó en tus entrevistas técnicas, ¡dale una estrella! ⭐
Desarrollado con 💙 para demostrar habilidades en arquitectura cloud serverless

