Files
iot-lambda-dashboardApi/README.md
T
2026-09-06 18:39:37 -03:00

120 lines
3.6 KiB
Markdown

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://<your-bucket>/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=<DDB_TABLE_NAME> \
LambdaS3Bucket=<S3_BUCKET_NAME> \
LambdaS3Key=<S3_KEY> \
CognitoUserPoolId=<COGNITO_USER_POOL_ID> \
CognitoUserPoolClientId=<COGNITO_APP_CLIENT_ID>
```
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 <JWT_TOKEN>" https://<api-id>.execute-api.<region>.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.