¿Qué es Lambda SnapStart?
AWS Lambda SnapStart es una función que reduce significativamente el tiempo de inicio guardando una instantánea inicializada de la función y restaurándola durante el arranque en frío.
Lenguajes compatibles
| Runtime | Estado de soporte |
|---|---|
| Java 11, 17, 21 | ✓ Soporte completo |
| Python 3.12+ | ✓ Soportado |
| .NET 8 | ✓ Soportado |
| Node.js | Próximamente |
Funcionamiento
Arranque en frío normal:
1. Inicio del contenedor
2. Inicialización del runtime
3. Carga del código de función
4. Ejecución del código de inicialización
5. Ejecución del handler
→ Total: 2-10 segundos (en caso de Java)
SnapStart:
1. Restaurar instantánea cacheada
2. Ejecución del handler
→ Total: 200-500ms
Ciclo de vida de la instantánea
flowchart TB
subgraph FirstDeploy["Primer despliegue"]
F1["1. Inicializar función"]
F2["2. Capturar instantánea del estado de memoria después de inicialización"]
F3["3. Guardar instantánea en caché"]
F1 --> F2 --> F3
end
subgraph LaterStart["Inicios posteriores"]
L1["1. Restaurar instantánea desde caché"]
L2["2. Ejecutar hook afterRestore"]
L3["3. Ejecutar handler"]
L1 --> L2 --> L3
end
FirstDeploy --> LaterStart
Método de configuración
AWS Console
Lambda > Funciones > Configuración > Configuración general > SnapStart
→ Seleccionar "PublishedVersions"
AWS SAM
# template.yaml
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: java21
Handler: com.example.Handler::handleRequest
SnapStart:
ApplyOn: PublishedVersions
AutoPublishAlias: live
Terraform
resource "aws_lambda_function" "example" {
function_name = "my-function"
runtime = "java21"
handler = "com.example.Handler::handleRequest"
snap_start {
apply_on = "PublishedVersions"
}
}
resource "aws_lambda_alias" "live" {
name = "live"
function_name = aws_lambda_function.example.function_name
function_version = aws_lambda_function.example.version
}
Hooks de runtime
Java (CRaC)
import org.crac.Context;
import org.crac.Core;
import org.crac.Resource;
public class Handler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent>, Resource {
private Connection dbConnection;
public Handler() {
// Registrar durante inicialización
Core.getGlobalContext().register(this);
// Establecer conexión a BD
this.dbConnection = createConnection();
}
@Override
public void beforeCheckpoint(Context<? extends Resource> context) {
// Cerrar conexión a BD antes de la instantánea
dbConnection.close();
}
@Override
public void afterRestore(Context<? extends Resource> context) {
// Restablecer conexión a BD después de restaurar
this.dbConnection = createConnection();
}
@Override
public APIGatewayProxyResponseEvent handleRequest(
APIGatewayProxyRequestEvent event,
Context context) {
// Lógica del handler
}
}
Python
import boto3
from aws_lambda_powertools import Logger
logger = Logger()
# Variable global (incluida en la instantánea)
db_client = None
def init_db():
global db_client
db_client = boto3.client('dynamodb')
# Ejecutar en fase de inicialización
init_db()
# Si es necesario reinicializar después de restaurar
def on_restore():
global db_client
# Refrescar conexión
db_client = boto3.client('dynamodb')
def handler(event, context):
# Usar db_client restaurado desde instantánea
return db_client.get_item(...)
Consideraciones
Garantizar unicidad
// Mal ejemplo: el valor del momento de la instantánea se reutiliza
private final String uniqueId = UUID.randomUUID().toString();
// Buen ejemplo: generar por cada solicitud
public APIGatewayProxyResponseEvent handleRequest(...) {
String uniqueId = UUID.randomUUID().toString();
// ...
}
Conexiones de red
// Cerrar conexiones antes de la instantánea
@Override
public void beforeCheckpoint(Context<? extends Resource> context) {
httpClient.close();
dbConnection.close();
}
// Reconectar después de restaurar
@Override
public void afterRestore(Context<? extends Resource> context) {
httpClient = HttpClient.newHttpClient();
dbConnection = dataSource.getConnection();
}
Comparación de rendimiento
Spring Boot (Java 17):
- Normal: 6,000ms
- SnapStart: 400ms (93% de reducción)
Quarkus (Java 17):
- Normal: 1,500ms
- SnapStart: 200ms (87% de reducción)
Python:
- Normal: 800ms
- SnapStart: 150ms (81% de reducción)
Precios
Sin costo adicional
- SnapStart en sí es gratuito
- Solo precios normales de Lambda
- Almacenamiento de instantáneas también gratuito
Mejores prácticas
✓ Optimizar código de inicialización (procesos pesados en inicialización)
✓ Implementar apropiadamente hooks beforeCheckpoint/afterRestore
✓ Generar valores que requieren unicidad por cada solicitud
✓ Refrescar pools de conexión después de restaurar
✓ Usar versiones/alias
Resumen
Lambda SnapStart es una función que mejora drásticamente el problema del arranque en frío. Es particularmente efectivo para runtimes con tiempos de inicio largos como Java, y está disponible sin costo adicional. Con una implementación apropiada de los hooks de runtime, se puede utilizar de forma segura en entornos de producción.
← Volver a la lista