iot-lambda-dashboardApi ======================== Resumen ------ Proyecto serverless simple que expone un endpoint GET /readings protegido por Cognito y API Gateway HTTP API. La Lambda (Go) realiza un Scan sobre una tabla DynamoDB existente y devuelve los items en JSON. Estructura --------- ``` iot-lambda-dashboardApi/ ├── template.yml # CloudFormation template ├── go.mod ├── main.go # Handler y lógica simple (versión inicial sin capas) └── README.md ``` Requisitos --------- - Go (>=1.20) para compilar el binario - AWS CLI configurado con credenciales y permisos para crear recursos CloudFormation - S3 bucket para alojar el paquete zip de la Lambda - Tener desplegado el stack `iot-cognito` (o disponer de UserPoolId y AppClientId) - Una tabla DynamoDB existente con los items de lecturas Variables/Parámetros del template -------------------------------- El template CloudFormation requiere los siguientes parámetros al desplegar: - TableName: nombre de la tabla DynamoDB existente - LambdaS3Bucket: bucket S3 que contiene el zip desplegable - LambdaS3Key: key (ruta) al objeto zip con el binario - CognitoUserPoolId: User Pool ID (puede obtenerse desde el stack iot-cognito export) - CognitoUserPoolClientId: App Client ID (puede obtenerse desde el stack iot-cognito export) Construir y empaquetar la Lambda (localmente) ------------------------------------------- 1. Compilar para Linux (runtime go1.x en Lambda): ```bash GOOS=linux GOARCH=amd64 go build -o main main.go ``` 2. Empaquetar en zip: ```bash zip deployment.zip main ``` 3. Subir a S3: ```bash aws s3 cp deployment.zip s3:///path/deployment.zip ``` Despliegue --------- Ejemplo de despliegue usando `aws cloudformation deploy` pasando los parámetros necesarios: ```bash aws cloudformation deploy \ --template-file template.yml \ --stack-name iot-lambda-dashboardApi \ --parameter-overrides \ TableName= \ LambdaS3Bucket= \ LambdaS3Key= \ CognitoUserPoolId= \ CognitoUserPoolClientId= ``` Notas: - En proyectos integrados, obtener Cognito values desde el stack `iot-cognito` con `aws cloudformation list-exports` y pasar sus valores aquí. Probar el endpoint ------------------ 1. Obtener un JWT (id/access token) desde Cognito (por ejemplo usando el flujo de la SPA o directamente desde la consola si se tienen credenciales). 2. Llamar al endpoint: ```bash curl -H "Authorization: Bearer " https://.execute-api..amazonaws.com/readings ``` Respuesta esperada ------------------ JSON con la forma: ```json { "data": [ { "deviceId": "ARDUINO-01", "timestamp": "2026-09-02T18:00:00Z", "temperature": 24.7, "humidity": 58.2 } ] } ``` Consideraciones pedagógicas --------------------------- - Esta implementación inicial es intencionalmente simple: toda la lógica está en `main.go` y utiliza `Scan` en DynamoDB. - Posteriormente los alumnos deben refactorizar: separar responsabilidades, mejorar acceso a datos, evitar Scan, añadir paginación y filtros, tests, etc. Errores y códigos de estado -------------------------- - 200 -> éxito - 400 -> petición inválida (no implementado ampliamente en esta versión) - 401 -> no autenticado (manejado por API Gateway/Cognito Authorizer) - 500 -> error interno del servidor No crear tabla DynamoDB desde este template ------------------------------------------ La tabla DynamoDB debe existir previamente y su nombre se pasa mediante el parámetro TableName. Contacto -------- Proyecto educativo — implementación simple para fines didácticos.