Files
2026-09-06 18:39:37 -03:00

3.6 KiB

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):
GOOS=linux GOARCH=amd64 go build -o main main.go
  1. Empaquetar en zip:
zip deployment.zip main
  1. Subir a S3:
aws s3 cp deployment.zip s3://<your-bucket>/path/deployment.zip

Despliegue

Ejemplo de despliegue usando aws cloudformation deploy pasando los parámetros necesarios:

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:
curl -H "Authorization: Bearer <JWT_TOKEN>" https://<api-id>.execute-api.<region>.amazonaws.com/readings

Respuesta esperada

JSON con la forma:

{
  "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.