🚀 NO PARAMOS!!!, continuamos con la semana dos de nuestros #AWSChallenge, ahora quiero mostrarles las ventajas de los servicios Serverless, Construiremos un Pipeline de datos completo, desde la ingesta, procesamiento y visualización de datos, enteramente en AWS y librerias de python como streamlit, lo llamaremos : "Crypto-Tracker Serverless"
¿Alguna vez te has preguntado cómo las grandes empresas monitorean datos en tiempo real sin tener servidores encendidos las 24 horas? La respuesta es Arquitectura Serverless.
Hoy no vamos a ver teoría. Hoy vamos a construir.
En este taller paso a paso, crearemos un sistema que monitorea el precio de Bitcoin y Ethereum, lo almacena en la nube y lo visualiza en un dashboard interactivo.
🏗️ La Arquitectura
Nuestro flujo de datos ("Data Pipeline") será completamente nativo de la nube:
- Fuente: CoinGecko API (Datos públicos gratuitos).
- Ingesta (Compute): AWS Lambda (Python) orquestada por EventBridge.
- Almacenamiento: Amazon DynamoDB (NoSQL de baja latencia).
- Backend API: Amazon API Gateway para exponer los datos de forma segura.
- Frontend: Streamlit para visualizar las tendencias.
🛠️ Fase 1: El Almacén de Datos (DynamoDB)
Primero, necesitamos un lugar rápido y flexible para guardar nuestros precios.
Ve a la consola de AWS DynamoDB > Create Table.
Table Name: CryptoPrecios
Partition Key: symbol (String). Ej: BTC
Sort Key: timestamp (String). Ej: 2025-12-05T10:00:00
Configuración: Selecciona On-Demand.
💡 Pro Tip: La combinación de Partition Key + Sort Key nos permite hacer consultas ultra rápidas de series de tiempo por moneda.
⚡ Fase 2: Ingesta Automática (Lambda + EventBridge)
Vamos a crear un "robot" que busque los precios cada 5 minutos.
- La Función Lambda (Writer) Crea una función llamada CryptoIngestor (Python 3.9+) y pega este código. Usaremos urllib3 para no complicarnos con Layers externos.
import json
import boto3
import urllib3
from datetime import datetime
# Configuración
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('CryptoPrecios')
http = urllib3.PoolManager()
def lambda_handler(event, context):
coins = {'bitcoin': 'BTC', 'ethereum': 'ETH'}
url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"
try:
response = http.request('GET', url)
data = json.loads(response.data.decode('utf-8'))
current_time = datetime.now().isoformat()
with table.batch_writer() as batch:
for coin_id, symbol in coins.items():
price = data[coin_id]['usd']
batch.put_item(Item={
'symbol': symbol,
'timestamp': current_time,
'price': str(price)
})
return {'statusCode': 200, 'body': 'Datos Ingestados OK'}
except Exception as e:
print(f"Error: {e}")
return {'statusCode': 500, 'body': 'Error en ingesta'}
- Los Permisos (IAM) Tu Lambda fallará si no le das permiso. Ve a Configuration > Permissions, edita el Rol y añade una Inline Policy:
{
"Effect": "Allow",
"Action": ["dynamodb:PutItem", "dynamodb:BatchWriteItem"],
"Resource": "arn:aws:dynamodb:*:*:table/CryptoPrecios"
}
- La Automatización (EventBridge) En la Lambda, haz clic en Add Trigger > EventBridge.
Schedule Expression: rate(5 minutes).
¡Listo! Tu base de datos empezará a llenarse sola.
🌐 Fase 3: Exponiendo los Datos (API Gateway)
No es buena práctica conectar el Frontend directo a la Base de Datos. Usaremos una API intermedia.
Crea una segunda Lambda llamada CryptoReader con permisos de dynamodb:Query.
import json
import boto3
from boto3.dynamodb.conditions import Key
table = boto3.resource('dynamodb').Table('CryptoPrecios')
def lambda_handler(event, context):
symbol = event.get('queryStringParameters', {}).get('symbol', 'BTC')
response = table.query(
KeyConditionExpression=Key('symbol').eq(symbol),
ScanIndexForward=False, Limit=50
)
return {
'statusCode': 200,
'body': json.dumps(response['Items'])
}
Ve a API Gateway > Create HTTP API.
Crea una ruta GET /get-prices e intégrala con tu Lambda CryptoReader.
Importante: Habilita CORS (Origins: *) para que tu Streamlit local pueda acceder.
📊 Fase 4: Visualización (Streamlit)
Visualicemos nuestros datos con Python puro.
Instala las librerías: pip install streamlit pandas requests
import streamlit as st
import pandas as pd
import requests
# ⚠️ REEMPLAZA CON TU URL DE API GATEWAY
API_URL = "https://TU-API-ID.execute-api.us-east-1.amazonaws.com/get-prices"
st.set_page_config(page_title="Crypto Workshop", layout="wide")
st.title("⚡ AWS Serverless Crypto Tracker")
symbol = st.selectbox("Moneda:", ["BTC", "ETH"])
if st.button('Refrescar'):
try:
r = requests.get(f"{API_URL}?symbol={symbol}")
data = r.json()
df = pd.DataFrame(data)
# Limpieza de datos
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['price'] = df['price'].astype(float)
df = df.sort_values('timestamp')
# Métricas
latest = df.iloc[-1]['price']
st.metric(label=f"Precio Actual {symbol}", value=f"${latest:,.2f}")
# Gráfico
st.area_chart(df, x='timestamp', y='price')
except Exception as e:
st.error(f"Error conectando a AWS: {e}")
Para ejecutar tu aplicacion, vamos hacerlo de manera "Profesional" (Entorno Virtual)
Esta es la forma recomendada para no mezclar librerías de distintos proyectos.
Crea un entorno virtual (una carpeta aislada para este proyecto):
python -m venv venv
Actívalo (Verás que aparece un (venv) al inicio de tu línea de comandos):
.\venv\Scripts\activate
Instala las librerías AQUÍ dentro:
pip install streamlit pandas requests boto3
Ejecuta el programa:
streamlit run app.py
🎯 El Reto Continúa: ¿Te atreves a más?
¡Felicidades! 🎉 Si llegaste hasta aquí, acabas de construir una arquitectura moderna, escalable y serverless. Pero un Ingeniero de Datos nunca se detiene.
¿Quieres llevar esto al Nivel Senior? Te reto a:
🔔 Nivel Medio: Agrega AWS SNS para que te llegue un correo electrónico si el Bitcoin baja de cierto precio.
🧠 Nivel Avanzado: Usa AWS Comprehend para analizar noticias sobre Cripto y cruzar el "Sentimiento" (Positivo/Negativo) con el precio en tu gráfica.
🤖 Nivel Experto: Despliega toda esta infraestructura usando código (Terraform o AWS CDK) en lugar de hacer clics en la consola.
El aprendizaje en la nube es un viaje, no un destino. ¿Qué funcionalidad le agregarías tú? ¡Te leo en los comentarios! 👇
Comenta "LOGRADO" si tu Lambda ya está corriendo.
¡Comparte este post, con tu compañero que siguie utilizando las mismas graficas de datos!



Top comments (0)