Funciones Serverless en Rust: AWS Lambda de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Por qué Rust para Serverless es un gran avance

\n\n

La arquitectura Serverless se ha convertido desde hace tiempo en el estándar para construir aplicaciones escalables y rentables. Sin embargo, la elección tradicional de lenguajes (Python, Node.js, Java) a menudo se enfrenta al problema del arranque en frío y al alto consumo de memoria. Rust, con su costo cero de abstracciones y la ausencia de un recolector de basura, ofrece una solución revolucionaria. En este artículo, analizaremos cómo crear, configurar y desplegar funciones serverless en Rust para AWS Lambda, desde la instalación de herramientas hasta los lanzamientos en producción.

\n\n

Al final del artículo, podrás:

\n
    \n
  • Configurar el entorno para el desarrollo de Rust + AWS Lambda
  • \n
  • Escribir una función eficiente con manejo de eventos
  • \n
  • Optimizar el archivo binario para un tiempo mínimo de arranque en frío
  • \n
  • Desplegar la función en AWS con Cargo Lambda
  • \n
\n\n

Preparación del entorno: Cargo Lambda y AWS CLI

\n\n

Para trabajar con Rust en AWS Lambda necesitamos una herramienta especial: cargo-lambda. Automatiza la compilación, las pruebas y el despliegue. La instalamos a través de Cargo:

\n\n
cargo install cargo-lambda
\n\n

Asegúrate también de tener instalados aws-cli (configurado con claves IAM) y Docker (para pruebas locales). Creemos un nuevo proyecto:

\n\n
cargo lambda new my-rust-lambda\ncd my-rust-lambda
\n\n

El comando creará una estructura básica con el archivo Cargo.toml y src/main.rs. Presta atención a las dependencias en Cargo.toml:

\n\n
[package]\nname = "my-rust-lambda"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nlambda_runtime = "0.11"\ntokio = { version = "1", features = ["macros", "rt-multi-thread"] }\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntracing = { version = "0.1", features = ["log"] }\ntracing-subscriber = { version = "0.3", features = ["fmt"] }
\n\n

La biblioteca clave es lambda_runtime. Proporciona el trait LambdaHandler, que implementaremos.

\n\n

Escribiendo la primera función: manejo de una solicitud de API Gateway

\n\n

Consideremos un escenario clásico: una función que recibe un JSON con el nombre de un usuario y devuelve un saludo. Abrimos src/main.rs y escribimos el siguiente código:

\n\n
use lambda_runtime::{run, service_fn, Error, LambdaEvent};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize)]\nstruct Request {\n    name: String,\n}\n\n#[derive(Serialize)]\nstruct Response {\n    message: String,\n}\n\nasync fn function_handler(event: LambdaEvent<Request>) -> Result<Response, Error> {\n    let name = event.payload.name;\n    let message = format!("¡Hola, {}! ¡Acabas de ejecutar Rust en Lambda!", name);\n    Ok(Response { message })\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n    tracing_subscriber::fmt()\n        .with_max_level(tracing::Level::INFO)\n        .init();\n\n    run(service_fn(function_handler)).await\n}
\n\n

Analicemos los puntos clave:

\n
    \n
  • LambdaEvent<Request> — estructura que contiene el cuerpo de la solicitud y el contexto de ejecución.
  • \n
  • #[tokio::main] — runtime asíncrono necesario para que funcione el runtime de Lambda.
  • \n
  • serde — deserialización del JSON entrante y serialización de la respuesta.
  • \n
\n\n

Probemos localmente:

\n\n
cargo lambda watch
\n\n

Luego, en otra terminal:

\n\n
cargo lambda invoke --data-ascii '{"name": "Alejandro"}'
\n\n

Deberías ver: {"message":"¡Hola, Alejandro! ¡Acabas de ejecutar Rust en Lambda!"}

\n\n

Optimización del arranque en frío y del tamaño del binario

\n\n

La principal ventaja de Rust es el mínimo arranque en frío. Sin embargo, para lograrlo, es necesario compilar correctamente el bi

Blogs

Book Recommendations