120 lines
3.6 KiB
Markdown
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.
|