Initial commit
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user