Una aplicación web serverless que analiza automáticamente la normativa publicada en la sección "Legislación y Avisos Oficiales" del Boletín Oficial de la República Argentina utilizando inteligencia artificial.
Importante! Tanto su bacckend (lambda AWS - BD MongoDb -Gemini AI) como su frontend (opcion Netlify) --> se pueden desplegar de manera gratuita y en capa gratuita en el caso de aws.
Esta aplicación permite a los usuarios consultar y analizar la normativa argentina de manera automatizada. Utiliza AWS Lambda para acceder directamente al sitio web del Boletín Oficial (https://www.boletinoficial.gob.ar/), y genera análisis detallados usando Google Gemini LLM con acceso web directo.
- ✅ Análisis automático: Accede directamente al sitio web del Boletín Oficial para análisis en tiempo real
- ✅ Inteligencia artificial: Utiliza Google Gemini con acceso web para generar análisis detallados
- ✅ Cache inteligente: Almacena análisis previos en MongoDB para respuestas rápidas
- ✅ API REST: Interfaz HTTP para integración con aplicaciones frontend
- ✅ Arquitectura serverless: Escalable y costo-efectiva usando AWS Lambda
- ✅ Seguridad: Manejo seguro de credenciales via variables de entorno
┌─────────────────┐ ┌─────────────────┐
│ Telegram Mini │───▶│ AWS Lambda │
│ App (Frontend) │ │ Function URL │
└─────────────────┘ └─────────────────┘
│
┌────────┼──────────┐
│ ▼ │
│ ┌──────────────┐ │ ┌─────────────┐
│ │ LLM Service │ │ │ Database │
│ │ (Direct) │ │ │ Service │
│ └──────────────┘ │ └─────────────┘
└───────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
│ Boletín Oficial │ │ Google Gemini│ │ MongoDB │
│ Website │ │ (Web Access) │ │ Atlas │
└─────────────────┘ └──────────────┘ └─────────────┘
Antes de comenzar, asegúrate de tener instalado:
- Python 3.11+ - Descargar Python
- Terraform 1.0+ - Instalar Terraform
- AWS CLI (opcional pero recomendado) - Instalar AWS CLI
- Git - Instalar Git
-
Cuenta AWS con permisos para crear:
- Lambda functions
- Lambda Function URLs
- IAM roles y policies
- CloudWatch logs
-
Google Cloud Account para acceso a Gemini API:
- Crear proyecto en Google Cloud Console
- Habilitar Gemini API
- Generar API key
-
MongoDB Atlas (gratuito):
- Crear cuenta en MongoDB Atlas
- Crear cluster gratuito
- Obtener connection string
git clone https://github.com/reinalau/boletin-oficial-app.git
- Ejecuta el script de setup (recomendado):
scripts\setup.batO manualmente:
- Copia el archivo de ejemplo:
copy scripts\iac\terraform.tfvars.example scripts\iac\terraform.tfvars- Edita
scripts\iac\terraform.tfvarscon tus valores:
# Configuración del proyecto
project_name = "boletin-oficial-telegram-app"
environment = "prod"
aws_region = "us-east-1"
# Credenciales (REQUERIDAS)
google_api_key = "tu-google-api-key-aqui"
mongodb_connection_string = "mongodb+srv://usuario:password@cluster.mongodb.net/?retryWrites=true&w=majority"
# Configuración de base de datos
mongodb_database = "BoletinOficial"
mongodb_collection = "boletin-oficial"
# Configuración de Lambda
lambda_function_name = "boletin-oficial-analyzer"
lambda_memory_size = 256
lambda_timeout = 360
# Configuración opcional
cors_allowed_origins = ["*"]Elige una de las siguientes opciones:
Opción A: Variables de entorno
set AWS_ACCESS_KEY_ID=tu-access-key
set AWS_SECRET_ACCESS_KEY=tu-secret-key
set AWS_DEFAULT_REGION=us-east-1Opción B: AWS CLI
aws configureOpción C: Perfil específico
set AWS_PROFILE=tu-perfilEjecuta el script de despliegue:
deploy.batEl script realizará automáticamente:
- ✅ Verificación de prerrequisitos
- ✅ Construcción del paquete Lambda
- ✅ Inicialización de Terraform
- ✅ Planificación del despliegue
- ✅ Aplicación de la infraestructura
- ✅ Configuración de Lambda Function URL
Una vez completado el despliegue, verás información similar a:
🎉 Deployment completed successfully!
📋 Important information:
📡 Lambda Function URL: https://[function-url].lambda-url.[region].on.aws//
🔍 Direct HTTPS Endpoint: https://[function-url].lambda-url.[region].on.aws//
⚠️ Next steps:
1. Test your API using the test script: python test_api.py
2. Configure your Telegram Mini App to use the Lambda Function URL
3. Monitor logs in AWS CloudWatch
Ejecuta las pruebas automatizadas del backend:
python test_api.py https://[function-url].lambda-url.[region].on.aws/| Variable | Descripción | Requerida | Valor por defecto |
|---|---|---|---|
google_api_key |
API key de Google Gemini | ✅ Sí | - |
mongodb_connection_string |
String de conexión MongoDB Atlas | ✅ Sí | - |
mongodb_database |
Nombre de la base de datos | No | BoletinOficial |
mongodb_collection |
Nombre de la colección | No | boletin-oficial |
lambda_memory_size |
Memoria Lambda (MB) | No | 256 |
lambda_timeout |
Timeout Lambda (segundos) | No | 360 |
langchain_model |
Modelo Gemini a usar | No | gemini-2.5-flash |
langchain_temperature |
Temperatura del modelo | No | 0 |
Para configuraciones más avanzadas, puedes modificar las siguientes variables en terraform.tfvars:
# Configuración de red (opcional)
enable_vpc = true
vpc_id = "vpc-12345678"
subnet_ids = ["subnet-12345678", "subnet-87654321"]
# Configuración de seguridad
enable_waf = true
waf_rate_limit = 2000
allowed_ip_ranges = ["0.0.0.0/0"]
# Configuración de throttling
api_throttle_rate_limit = 100
api_throttle_burst_limit = 200
# Tags adicionales
additional_tags = {
Owner = "tu-nombre"
CostCenter = "desarrollo"
Environment = "production"
}POST https://[function-url].lambda-url.[region].on.aws/
La API ahora soporta dos tipos de análisis separados:
{
"action": "analyze_boletin",
"fecha": "2024-01-15",
"forzar_reanalisis": false
}{
"action": "get_expert_opinions",
"fecha": "2024-01-15"
}{
"fecha": "2024-01-15",
"forzar_reanalisis": false
}| Parámetro | Tipo | Descripción | Requerido |
|---|---|---|---|
action |
string | Tipo de análisis: "analyze_boletin" o "get_expert_opinions" | No (default: análisis completo) |
fecha |
string | Fecha en formato YYYY-MM-DD | No (usa fecha actual) |
forzar_reanalisis |
boolean | Forzar nuevo análisis ignorando cache | No (default: false) |
{
"success": true,
"data": {
"fecha": "2024-01-15",
"analisis": {
"resumen": "Resumen ejecutivo de los cambios normativos...",
"cambios_principales": [
{
"tipo": "decreto",
"numero": "123/2024",
"rotulo": "PODER EJECUTIVO. Decreto 123/2024. DECTO-2025-592-APN-PTE - Decreto N° 186/2022. Modificación.",
"titulo": "Modificación de...",
"descripcion": "Descripción del cambio",
"impacto": "alto"
}
],
"impacto_estimado": "Análisis del impacto general",
"areas_afectadas": ["tributario", "laboral", "comercial"]
},
"opiniones_expertos": [
{
"fuente": "Nombre del experto",
"opinion": "Texto de la opinión",
"fecha_opinion": "2024-01-15",
"relevancia": "alta"
}
],
"metadatos": {
"fecha_creacion": "2024-01-15T10:30:00Z",
"tiempo_procesamiento": 25.5,
"desde_cache": false
}
},
"message": "Análisis completado exitosamente"
}{
"success": false,
"error": {
"code": "WEB_001",
"message": "No se pudo acceder al contenido para la fecha especificada",
"details": "Información adicional del error"
},
"message": "Error en el procesamiento"
}| Código | Descripción | Status HTTP |
|---|---|---|
WEB_001 |
Error accediendo al sitio web | 404 |
WEB_002 |
Error procesando contenido web | 500 |
LLM_001 |
Error en servicio de IA | 503 |
DB_001 |
Error de base de datos | 500 |
VALIDATION_001 |
Error de validación | 400 |
Análisis del boletín solamente:
curl -X POST https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ \
-H "Content-Type: application/json" \
-d '{"action": "analyze_boletin", "fecha": "2024-01-15"}'Obtener opiniones de expertos:
curl -X POST https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ \
-H "Content-Type: application/json" \
-d '{"action": "get_expert_opinions", "fecha": "2024-01-15"}'Análisis completo (backward compatibility):
curl -X POST https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ \
-H "Content-Type: application/json" \
-d '{"fecha": "2024-01-15"}'Forzar nuevo análisis del boletín:
curl -X POST https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ \
-H "Content-Type: application/json" \
-d '{"action": "analyze_boletin", "fecha": "2024-01-15", "forzar_reanalisis": true}'La aplicación ahora cuenta con dos botones separados para un mejor control del proceso:
- Función: Analiza únicamente el contenido normativo del Boletín Oficial
- Tiempo: ~30-60 segundos
- Resultado: Resumen, cambios principales, áreas afectadas, impacto estimado
- Cache: Utiliza cache si existe análisis previo
- Función: Busca y analiza opiniones de expertos sobre el boletín ya analizado
- Requisito: Debe existir un análisis previo del boletín para la fecha
- Tiempo: ~20-40 segundos
- Resultado: Lista de opiniones de medios y expertos argentinos
- Cache: Utiliza cache si ya se obtuvieron opiniones
- ✅ Rapidez: Obtén el análisis principal más rápido
- ✅ Control: Decide si necesitas opiniones de expertos
- ✅ Eficiencia: Evita timeouts en análisis largos
- ✅ Flexibilidad: Usa solo lo que necesitas
El proyecto incluye scripts de pruebas completos:
# Ejecutar todas las pruebas (análisis completo)
python test_api.py https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/
# Probar endpoints separados
python test_separated_endpoints.py https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/
# Ejecutar con datos de prueba
python test_api.py https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ --load-test-data
# Ejecutar prueba específica
python test_api.py https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ --single-test health
# Con timeout personalizado
python test_api.py https://w6scjpjua3bmj272d2dqhxy2ve000000.lambda-url.us-east-1.on.aws/ --timeout 120Importar en Postman la colección: tests/BoletinOficial.postman_collection.json
- Health Check: Verifica conectividad básica
- Input Validation: Prueba validación de parámetros
- Recent Date Analysis: Análisis con fecha reciente
- Old Date Analysis: Análisis con fecha antigua
- Cache Functionality: Verificación del sistema de cache
- Error Handling: Manejo de errores
# Instalar dependencias de testing
pip install pytest pytest-mock mongomock
# Ejecutar pruebas unitarias
pytest tests/ -v
# Con cobertura
pytest tests/ --cov=services --cov=utils1-Una vez que tienes la function lambda en aws con su correspondiente base de datos NOSQL MongoDb se puede testear localmente el frontend.
En ..\frontend\js\api.js Busca cambiar la asignacion "const fallbackUrl =" por la url de tu lambda de aws. Ejemplo:
// Fallback para pruebas locales
const fallbackUrl = 'https://[function-url].lambda-url.[region].on.aws';
console.warn('⚠️ Using fallback URL for local testing:', fallbackUrl);
return fallbackUrl;2- Ejecuta en la terminal de VisualStudio :
python -m http.server 30003- En el navegador: http://localhost:3000/

4-para detener en la terminal: CTRL+C
Los logs se almacenan automáticamente en CloudWatch:
- Lambda logs:
/aws/lambda/boletin-oficial-analyzer
- Invocation Count: Número de invocaciones
- Duration: Tiempo de ejecución
- Error Rate: Tasa de errores
- Memory Usage: Uso de memoria
- Cache Hit Rate: Tasa de aciertos de cache
# Error rate > 5%
aws cloudwatch put-metric-alarm \
--alarm-name "BoletinOficial-HighErrorRate" \
--alarm-description "High error rate in Lambda function" \
--metric-name "Errors" \
--namespace "AWS/Lambda" \
--statistic "Sum" \
--period 300 \
--threshold 5 \
--comparison-operator "GreaterThanThreshold"
# Duration > 4 minutes
aws cloudwatch put-metric-alarm \
--alarm-name "BoletinOficial-HighDuration" \
--alarm-description "High duration in Lambda function" \
--metric-name "Duration" \
--namespace "AWS/Lambda" \
--statistic "Average" \
--period 300 \
--threshold 240000 \
--comparison-operator "GreaterThanThreshold"- Variables de entorno: Credenciales manejadas de forma segura via Lambda environment variables
- IAM Roles: Permisos mínimos necesarios
- HTTPS: Todas las comunicaciones encriptadas
- Rate Limiting: Protección contra abuso
- Input Validation: Validación estricta de parámetros
- CORS: Configuración restrictiva de orígenes
Para entornos de producción, considera:
# Habilitar WAF
enable_waf = true
waf_rate_limit = 1000
# Restringir IPs
allowed_ip_ranges = ["203.0.113.0/24", "198.51.100.0/24"]
# Habilitar VPC
enable_vpc = true
vpc_id = "vpc-12345678"
subnet_ids = ["subnet-12345678", "subnet-87654321"]Síntoma: Unable to locate credentials
Solución:
# Verificar credenciales
aws sts get-caller-identity
# Configurar si es necesario
aws configureSíntoma: Invalid API key o Permission denied
Solución:
- Verificar que la API key sea correcta
- Asegurar que Gemini API esté habilitada
- Verificar cuotas y límites
Síntoma: Connection timeout o Authentication failed
Solución:
- Verificar connection string
- Verificar whitelist de IPs en MongoDB Atlas
- Verificar credenciales de usuario
Síntoma: Task timed out after 300.00 seconds
Solución:
# Aumentar timeout en terraform.tfvars
lambda_timeout = 600 # 10 minutos
lambda_memory_size = 2048 # Más memoria = más CPUSíntoma: Unzipped size must be smaller than 262144000 bytes
Solución:
- Revisar dependencias en
requirements.txt - Usar layers para dependencias grandes
- Optimizar código y eliminar archivos innecesarios
Síntoma: User is not authorized to perform: lambda:InvokeFunction
Solución:
- Verificar políticas IAM
- Asegurar que el rol tenga permisos correctos
- Revisar resource-based policies
Para debugging detallado:
# Ver logs de Lambda en tiempo real
aws logs tail /aws/lambda/boletin-oficial-analyzer --follow
# Ver configuración de Function URL
aws lambda get-function-url-config --function-name boletin-oficial-analyzer
# Filtrar por errores
aws logs filter-log-events \
--log-group-name /aws/lambda/boletin-oficial-analyzer \
--filter-pattern "ERROR"# Verificar estado de Terraform
terraform show
# Verificar configuración
terraform validate
# Ver outputs
terraform output
# Refrescar estado
terraform refresh
# Importar recurso existente
terraform import aws_lambda_function.boletin_analyzer nombre-funcionPara actualizar la aplicación:
- Actualizar código:
git pull origin main- Reconstruir y redesplegar:
deploy.bat- Solo actualizar código Lambda:
build.bat
# Subir manualmente el ZIP a AWS Lambda ConsoleBase de datos:
# Backup de MongoDB Atlas (automático)
# Configurar en MongoDB Atlas Console > BackupConfiguración:
# Backup de estado de Terraform
copy terraform.tfstate terraform.tfstate.backup.$(date +%Y%m%d)Para limpiar recursos temporales:
# Limpiar archivos de build
del lambda_deployment.zip
rmdir /s lambda_package
# Limpiar logs antiguos (opcional)
aws logs delete-log-group --log-group-name /aws/lambda/boletin-oficial-analyzerPara eliminar completamente la aplicación:
# CUIDADO: Esto eliminará TODOS los recursos
destroy.bat
# O con confirmación automática
destroy.bat /force- Documentación de AWS Lambda
- Documentación de Terraform
- Google Generative AI Documentation
- Google Gemini API
- MongoDB Atlas Documentation
Si encuentras problemas:
- Revisar esta documentación
- Verificar logs en CloudWatch
- Ejecutar pruebas de diagnóstico
- Crear issue en el repositorio con:
- Descripción del problema
- Logs relevantes
- Pasos para reproducir
- Configuración (sin credenciales)
Una vez que tengas el backend y frontend desplegados, puedes configurar la aplicación como una Telegram Mini App para una experiencia nativa.
- ✅ Backend desplegado (Lambda Function URL funcionando)
- ✅ Frontend desplegado (en Netlify, Vercel, etc.)
- 📱 Bot de Telegram creado
- Abrir Telegram y buscar
@BotFather - Enviar
/newbot - Seguir instrucciones para crear tu bot
- Guardar el token que te proporciona BotFather
- Enviar a BotFather:
/newapp - Seleccionar tu bot de la lista
- Configurar la aplicación:
- Title:
Boletín Oficial Argentina - Description:
Análisis inteligente del Boletín Oficial argentino - Photo: Subir un ícono (512x512 px recomendado)
- Web App URL:
https://tu-frontend.netlify.app(tu URL de Netlify/vercel o hosting elegido)
- Title:
Enviar a BotFather: /setcommands
start - Iniciar análisis del Boletín Oficial
help - Ayuda y información
analyze - Abrir Mini App para análisis
- Enviar a BotFather:
/setmenubutton - Seleccionar tu bot
- Configurar:
- Button text:
📊 Analizar Boletín - Web App URL:
https://tu-frontend.netlify.app
- Button text:
Enviar a BotFather: /setdescription
🇦🇷 Bot oficial para análisis inteligente del Boletín Oficial de la República Argentina.
✨ Características:
• Análisis automático con IA
• Resumen de cambios normativos
• Opiniones de expertos
• Búsqueda por fecha
• Interfaz intuitiva
Desarrollado con AWS Lambda y Google Gemini AI.
Enviar a BotFather: /setabouttext
Análisis inteligente del Boletín Oficial argentino usando IA. Obtén resúmenes automáticos de cambios normativos, impacto estimado y opiniones de expertos.
- Buscar tu bot en Telegram
- Enviar
/start - Hacer clic en el botón "📊 Analizar Boletín"
- Verificar que se abra tu frontend correctamente
En tu frontend, puedes detectar el tema de Telegram:
// En tu app.js
if (window.Telegram?.WebApp) {
const tg = window.Telegram.WebApp;
// Aplicar tema de Telegram
document.documentElement.style.setProperty('--tg-theme-bg-color', tg.themeParams.bg_color);
document.documentElement.style.setProperty('--tg-theme-text-color', tg.themeParams.text_color);
// Configurar botón principal
tg.MainButton.setText('Analizar Boletín');
tg.MainButton.show();
}// Configurar botones nativos de Telegram
if (window.Telegram?.WebApp) {
const tg = window.Telegram.WebApp;
// Botón principal
tg.MainButton.setText('🔍 Analizar');
tg.MainButton.onClick(() => {
handleAnalyze();
});
// Botón de atrás
tg.BackButton.onClick(() => {
showDateSelector();
});
}- Verificar URL: Debe ser HTTPS
- Verificar certificado SSL: Debe ser válido
- Probar URL directamente en navegador
- Verificar headers en tu Lambda
- Verificar configuración de Netlify
- Revisar logs de CloudWatch
--> Buscar Sumplementos adicioanles de la sección 1 del boletin Oficial de la nacion Argentina. Los suplementos son normativa que se agregan a ultima hora del dia a la edición original, por lo general contiene Decretos urgentes.
--> Incrementar la Seguridad del sitio.
Este proyecto está bajo la licencia MIT. Ver archivo LICENSE para más detalles.