Skip to content
SP StackPractices
intermediate

Construir funciones serverless

Crea y despliega funciones serverless con AWS Lambda, Google Cloud Functions y Azure Functions para computación event-driven y pago por uso.

Construir funciones serverless

Visión General

La computación serverless te permite ejecutar código sin aprovisionar ni gestionar servidores. Escribes funciones, las subes a un proveedor de nube y la plataforma se encarga del escalado, parches y disponibilidad automáticamente. Pagas solo por el tiempo de ejecución, lo que la hace ideal para cargas de trabajo esporádicas y arquitecturas event-driven.

Esta receta cubre la creación y despliegue de funciones serverless con AWS Lambda, Google Cloud Functions y Azure Functions.

Cuándo Usar

Usa este recurso cuando:

  • Tienes cargas de trabajo event-driven (webhooks, procesamiento de archivos, jobs programados)
  • Quieres escalado automático de cero a miles de peticiones
  • Necesitas evitar el mantenimiento de servidores y la sobrecarga de infraestructura
  • Tu tráfico es esporádico y aprovisionar servidores sería un desperdicio

Solución

Python (AWS Lambda)

import json
import boto3

def handler(event, context):
    # Extraer parámetro de query
    name = event.get("queryStringParameters", {}).get("name", "World")

    return {
        "statusCode": 200,
        "headers": {"Content-Type": "application/json"},
        "body": json.dumps({"message": f"Hello, {name}!"})
    }

JavaScript (Google Cloud Functions)

const functions = require('@google-cloud/functions-framework');

functions.http('helloHttp', (req, res) => {
  const name = req.query.name || 'World';
  res.json({ message: `Hello, ${name}!` });
});

Java (Azure Functions)

import com.microsoft.azure.functions.*;
import java.util.Optional;

public class HelloFunction {
    @FunctionName("hello")
    public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS)
        HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {

        String name = request.getQueryParameters().getOrDefault("name", "World");
        return request.createResponseBuilder(HttpStatus.OK)
            .body("Hello, " + name + "!")
            .build();
    }
}

Explicación

Las plataformas serverless abstraen la gestión de infraestructura:

  • Triggers de eventos: Peticiones HTTP, subidas de archivos, cambios en base de datos, timers
  • Escalado automático: Cada invocación corre en un contenedor fresco; las plataformas escalan contenedores arriba y abajo
  • Pago por uso: Se factura por milisegundos de ejecución y número de invocaciones

Los cold starts ocurren cuando una función no ha sido invocada recientemente. La plataforma debe inicializar un nuevo contenedor, añadiendo latencia (100ms–3s dependiendo del runtime y asignación de memoria).

Variantes

PlataformaRuntimeTipos de triggerCold Start
AWS LambdaPython, Node, Java, Go, RubyHTTP, S3, SNS, SQS, EventBridge, Cron100ms–1s
Cloud FunctionsNode, Python, Go, JavaHTTP, Pub/Sub, Storage, Firestore, Cron200ms–2s
Azure FunctionsNode, Python, Java, C#HTTP, Blob, Queue, Event Grid, Timer200ms–3s

Mejores Prácticas

  • Mantén las funciones pequeñas y enfocadas: Una función por responsabilidad; compón workflows complejos con step functions
  • Minimiza el tamaño del paquete de despliegue: Elimina dependencias innecesarias para reducir el cold start
  • Usa concurrencia provisionada para cargas sensibles a latencia: Precalienta contenedores para rutas críticas
  • Almacena estado externamente: Las funciones son stateless; usa DynamoDB, Redis o Cloud Firestore para persistencia
  • Configura límites de memoria y timeout apropiadamente: Memoria insuficiente causa OOM; excesiva desperdicia dinero

Errores Comunes

  • Almacenar estado en el contenedor de la función: Las variables locales se pierden entre invocaciones; los contenedores pueden reutilizarse, pero nunca dependas de ello
  • Ignorar cold starts: Las APIs síncronas orientadas a usuarios sufren latencia de cold start
  • Sobreaprovisionar memoria: Lambda asigna CPU proporcionalmente a la memoria; encuentra el punto óptimo
  • No manejar fallos parciales: El procesamiento por lotes debe manejar reintentos sin duplicar trabajo
  • Acoplamiento fuerte a un vendor: Usa capas de abstracción (Serverless Framework, SAM) para portabilidad

Preguntas Frecuentes

P: ¿Cómo reduzco la latencia de cold start? R: Usa runtimes más pequeños (Node.js, Python) en lugar de Java. Reduce el tamaño del paquete. Usa concurrencia provisionada. Mantén conexiones (base de datos, HTTP) calientes inicializando fuera del handler.

P: ¿Las funciones serverless pueden manejar tareas de larga duración? R: AWS Lambda máximo 15 minutos, Cloud Functions 60 minutos, Azure Functions configurable. Para tareas más largas, usa step functions para orquestar múltiples funciones cortas o muevete a computación basada en contenedores (ECS, Cloud Run).

P: ¿Cómo debuggeo funciones serverless localmente? R: AWS SAM CLI, Azure Functions Core Tools y Functions Framework para Node.js proporcionan emuladores locales. Prueba localmente, pero siempre valida en la nube ya que el comportamiento puede diferir.