cloud · temario
6.3tema 3 de 4

Lambda + API Gateway

Arquitectura serverless para servir modelos e IA sin gestionar servidores.

Lambda es el servicio de cómputo serverless de AWS: subes una función, defines el trigger (una petición HTTP, un mensaje en SQS, un evento de S3) y AWS ejecuta el código en un contenedor efímero. No gestionas servidores ni auto-scaling: AWS lo hace automáticamente. El modelo de cobro es por invocación y por milisegundos de ejecución, lo que lo hace muy económico para cargas de trabajo intermitentes.

API Gateway actúa como la puerta de entrada HTTP para tus funciones Lambda. Define las rutas, los métodos HTTP, la autenticación y el rate limiting. Cuando una petición llega a tu endpoint, API Gateway la enruta al Lambda correspondiente, espera la respuesta y la devuelve al cliente. Es el patrón más común para exponer un modelo de predicción o un LLM como una API REST sin gestionar servidores de aplicación.

El cold start es el talón de Aquiles de Lambda: la primera invocación de un contenedor recién creado (o uno que lleva tiempo sin uso) tiene una latencia adicional de 100ms a 2 segundos dependiendo del runtime y el tamaño del paquete de despliegue. Para funciones que sirven modelos de ML, donde cargar el modelo puede tomar varios segundos, esto es un problema real. Las soluciones incluyen Provisioned Concurrency (mantiene contenedores calientes), funciones ligeras que delegan a SageMaker Endpoints, o arquitecturas que cargan el modelo en el init fuera del handler.

Lambda tiene límites concretos que determinan si es el servicio correcto para tu caso: 15 minutos de timeout máximo, 10 GB de RAM máxima, 10 GB de almacenamiento efímero en /tmp y un payload máximo de 6 MB en responses síncronas. Para modelos de lenguaje que generan respuestas largas o para embeddings de documentos extensos, estos límites son activos. Streaming con Lambda Function URLs o API Gateway WebSockets es la respuesta para respuestas largas.

La arquitectura serverless que Benjamin implementó en su portafolio (https://churn.benjacode.com) usa precisamente este patrón: un Lambda que recibe los datos del cliente, carga el modelo de predicción de churn desde S3 o un SageMaker Endpoint, ejecuta la inferencia y devuelve el resultado a través de API Gateway. El beneficio es que el costo es casi cero en períodos sin tráfico y escala automáticamente a miles de peticiones por segundo si el tráfico lo requiere.

Para LLMs, Lambda + API Gateway se usa típicamente como proxy: el Lambda recibe la petición, la valida, agrega autenticación y llama a Bedrock, OpenAI o un SageMaker Endpoint. Esta arquitectura desacopla la lógica de negocio (quién puede llamar, con qué parámetros, con qué límites) de la inferencia real. El handler de Lambda debe ser liviano: no cargues el modelo de 7B dentro del Lambda, delega eso a SageMaker.

structure.txt
# Lambda handler for ML inference
import json
import boto3
import os

# Load model ONCE at container init, not inside handler
sagemaker_runtime = boto3.client('sagemaker-runtime')
ENDPOINT_NAME = os.environ['SAGEMAKER_ENDPOINT_NAME']

def handler(event, context):
    body = json.loads(event.get('body', '{}'))
    text = body.get('text', '')
    if not text:
        return {'statusCode': 400, 'body': json.dumps({'error': 'text is required'})}
    response = sagemaker_runtime.invoke_endpoint(
        EndpointName=ENDPOINT_NAME,
        ContentType='application/json',
        Body=json.dumps({'inputs': text}),
    )
    result = json.loads(response['Body'].read())
    return {'statusCode': 200, 'body': json.dumps(result)}

# SAM template (template.yaml) — API Gateway + Lambda
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  InferenceFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: app.handler
      Runtime: python3.11
      Timeout: 30
      MemorySize: 512
      Environment:
        Variables:
          SAGEMAKER_ENDPOINT_NAME: my-model-endpoint
      Events:
        Api:
          Type: Api
          Properties:
            Path: /predict
            Method: post

# Deploy with SAM CLI
sam build && sam deploy --guided

Debugging lab

Detecta y corrige el error en el código.

0/5 tests passing0%
  1. 6.3.5.1

    def handler(event, context): import boto3 import json client = boto3.client('sagemaker-runtime') # ... rest of handler

  2. 6.3.5.2

    # template.yaml Timeout: 3 def handler(event, context): response = sagemaker_runtime.invoke_endpoint(EndpointName='llm-endpoint', ...)

  3. 6.3.5.3

    def handler(event, context): body = event['body'] text = body['text'] # ...

  4. 6.3.5.4

    return { 'statusCode': 200, 'body': json.dumps(full_document_embeddings) # 8MB response }

  5. 6.3.5.5

    # API Gateway endpoint: no auth configured # Method: POST /predict # Authorization: NONE