Escribir y probar código Lambda

Aplicaciones sin servidor con AWS Lambda

Claudio Canales

Senior DevOps Engineer

Por qué importan las pruebas y los logs

  • Los eventos reales son desordenados y muy variados.
  • Las pruebas detectan errores antes que los usuarios.
  • Los logs son tu "caja negra" para depurar.

Probar es como un simulacro de incendio

Aplicaciones sin servidor con AWS Lambda

Un flujo para recordar

Kit de flujo básico

  • Entra el evento -> corre el handler -> sale la respuesta.
  • Usa logs y eventos de prueba para depurar.

Flujo de invocación de Lambda

Aplicaciones sin servidor con AWS Lambda

Destino de los logs: CloudWatch Logs

  • Lambda envía por defecto la salida de print() y errores allí.
  • CloudWatch Logs es el almacenamiento de logs de AWS.
  • Los grupos de logs se ven como /aws/lambda/<function-name>.

El handler escribe logs en CloudWatch Logs

Aplicaciones sin servidor con AWS Lambda

El contrato del handler

  • event es el payload de entrada.
  • context da metadatos de ejecución.
  • El retorno es la respuesta de la función.

Contrato del handler: event + context -> response

Aplicaciones sin servidor con AWS Lambda

Paso a paso: event y context

def lambda_handler(event, context):
    request_id = context.aws_request_id
    time_left = context.get_remaining_time_in_millis()
    return {"statusCode": 200}

Anotaciones de event y context

Aplicaciones sin servidor con AWS Lambda

Analizar la entrada de forma segura

  • Prefiere event.get() para campos opcionales.
  • Valida entradas obligatorias pronto.
  • Devuelve errores claros si faltan campos.

Parsea con seguridad y valida pronto

Aplicaciones sin servidor con AWS Lambda

Paso a paso: validar entrada obligatoria

def lambda_handler(event, context):
    if not event.get("name"):
        return {"statusCode": 400, "body": "Missing: name"}
    return {"statusCode": 200, "body": f"Hello, {event.get('name')}!"}

Rama de validación: 400 vs 200

Aplicaciones sin servidor con AWS Lambda

Casos límite a probar

  • Campos faltantes (JSON vacío).
  • Tipos erróneos (name es un número).
  • Campos extra o payloads grandes.

Ejemplos de payload edge case

Aplicaciones sin servidor con AWS Lambda

Devolver una respuesta predecible

  • Mantén una forma de respuesta consistente.
  • Usa statusCode para éxito o errores.
  • Codifica el body en JSON.

Sobre de respuesta: statusCode + body JSON

Aplicaciones sin servidor con AWS Lambda

Paso a paso: devolver JSON

import json

def lambda_handler(event, context):
    body = {"message": "ok"}
    return {"statusCode": 200, "body": json.dumps(body)}

json.dumps: dict a texto JSON

Aplicaciones sin servidor con AWS Lambda

Logging y trazabilidad

  • Registra campos clave (usa JSON si hace falta).
  • Incluye context.aws_request_id para trazas.
  • Evita registrar secretos o datos personales.
  • Por defecto, Lambda envía logs a CloudWatch Logs.

Buenas prácticas de logging

Aplicaciones sin servidor con AWS Lambda

Paso a paso: logging estructurado

import json

def lambda_handler(event, context):
    print(json.dumps({"request_id": context.aws_request_id, "event": event}))
    return {"statusCode": 200}

Línea de log JSON estructurada

Aplicaciones sin servidor con AWS Lambda

Probar con eventos de la consola

  • Crea eventos de prueba con nombre.
  • Prueba el camino feliz y los casos límite.
  • Revisa respuesta y logs tras cada ejecución.

Eventos de prueba en la consola

Aplicaciones sin servidor con AWS Lambda

Un bucle de depuración simple

  • Haz un pequeño cambio.
  • Despliega y ejecuta un evento de prueba.
  • Lee la respuesta y los logs de CloudWatch.

Ciclo de depuración

Aplicaciones sin servidor con AWS Lambda

¡Vamos a practicar!

Aplicaciones sin servidor con AWS Lambda

Preparing Video For Download...