DEV Community

Cover image for Desmitificando AWS Lambda: Potencia Real con C++ y CMake
Alejandro
Alejandro

Posted on

Desmitificando AWS Lambda: Potencia Real con C++ y CMake

Cuando pensamos en Serverless y AWS Lambda, nuestra mente suele irse automáticamente a lenguajes interpretados: Python, Typescript. Son geniales, productivos y fáciles de editar en la consola.

Pero, ¿son la única opción? Definitivamente no. Y más importante aún: ¿Son siempre la mejor opción? Tampoco.

Hoy vamos a romper el mito de que las Lambdas son solo para scripts ligeros y vamos a ver cómo C++ entra en juego para ofrecernos un rendimiento brutal y tiempos de ejecución predecibles. Para ello, analizaremos la pieza clave que a menudo asusta a los desarrolladores: el sistema de construcción con CMake.

Lambda en binario compilada vista desde consola

  1. La Lambda no es una caja negra: El Rol del Runtime

A veces vemos a AWS como una caja mágica donde subes código y "simplemente funciona". Pero AWS es ingeniería pura, y entenderla nos da poder.

Las Lambdas no ejecutan tu código por arte de magia. Necesitan un Runtime. En Python o Node, AWS te da el runtime pre-cocinado. Pero en C++, Go o Rust, tú puedes controlar ese entorno.

¿Qué hace realmente el Runtime? No es más que un bucle infinito (un loop) que hace peticiones HTTP a una API interna de AWS.

1. Pregunta: "¿Hay trabajo nuevo?"
2. Si sí: Ejecuta tu función.
3. Envía la respuesta de vuelta a AWS.
4. Repite.
Enter fullscreen mode Exit fullscreen mode

Al usar C++, no estamos "hackeando" Lambda; estamos usando el Custom Runtime API. Y para no tener que escribir ese bucle HTTP nosotros mismos, usamos la librería aws-lambda-runtime.

  1. El Código: Simpleza en C++

Para demostrar que esto no es ciencia de cohetes, mira este main.cpp. Es todo lo que necesitas para una Lambda funcional:

#include <aws/lambda-runtime/runtime.h>

using namespace aws::lambda_runtime;

// Tu lógica de negocio va aquí
invocation_response my_handler(invocation_request const& request)
{
   return invocation_response::success("Hello, World!", "application/json");
}

int main()
{
   // Aquí inicia el bucle infinito del Runtime que mencionamos antes
   run_handler(my_handler);
   return 0;
}
Enter fullscreen mode Exit fullscreen mode

¿Ves el run_handler? Ese es el puente. Ese es el código que conecta tu función my_handler con la infraestructura de Amazon.

  1. El Arquitecto: Explicando el CMakeLists.txt

Aquí es donde muchos se detienen. C++ requiere compilación, y en el mundo de AWS, necesitamos empaquetar todo (binario + dependencias) en un archivo .zip.

Afortunadamente, el SDK de C++ para Lambda nos hace la vida fácil. Analicemos el archivo de configuración línea por línea:


cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(hello LANGUAGES CXX)

find_package(aws-lambda-runtime REQUIRED)
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} PUBLIC AWS::aws-lambda-runtime)
aws_lambda_package_target(${PROJECT_NAME})
Enter fullscreen mode Exit fullscreen mode

El desglose paso a paso:

Configuración Básica:


cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(hello LANGUAGES CXX)
Enter fullscreen mode Exit fullscreen mode

Nada fuera de lo común aquí. Definimos el proyecto y establecemos C++11 como estándar.

Encontrando el "Pegamento" (El Runtime):

find_package(aws-lambda-runtime REQUIRED)
Enter fullscreen mode Exit fullscreen mode

Esta es la línea crítica. Le dice a CMake: "Busca en el sistema la librería aws-lambda-runtime". Ojo: Para que esto funcione, debes haber instalado previamente el AWS Lambda C++ Runtime en tu entorno de compilación (o en tu contenedor Docker de CI/CD). Esta librería contiene la lógica del bucle de eventos.

Creando el Ejecutable:


add_executable(${PROJECT_NAME} "main.cpp")

Enter fullscreen mode Exit fullscreen mode

Compila nuestro main.cpp y crea un binario llamado hello (el nombre del proyecto).

El Linkeo (La conexión):

target_link_libraries(${PROJECT_NAME} PUBLIC AWS::aws-lambda-runtime)
Enter fullscreen mode Exit fullscreen mode

Aquí es donde ocurre la magia del enlazado. Unimos nuestro código con la librería de AWS. Esto inyecta toda la funcionalidad necesaria para que run_handler se comunique con la API de Lambda.

El Empaquetado Automático:

aws_lambda_package_target(${PROJECT_NAME})
Enter fullscreen mode Exit fullscreen mode

Esta es la joya de la corona. Esta función no es de CMake estándar; es una utilidad que provee la librería de AWS. ¿Qué hace?

Toma tu ejecutable.

Busca las dependencias compartidas necesarias.

Lo comprime todo en un hello.zip listo para subir a la consola de AWS o desplegar vía Terraform/CDK.

Te ahorra escribir scripts de bash manuales para hacer el zip.
Enter fullscreen mode Exit fullscreen mode

Asi se ve la configuración

Configuración con custom runtime **Amazon Linux 2023**

Reflexión: AWS te hace productivo, no ciego

Este ejemplo de C++ nos enseña algo valioso sobre la filosofía de AWS.

A menudo, la "nube" se siente como una abstracción que nos quita control a cambio de comodidad. Pero herramientas como el Runtime API y este SDK de C++ demuestran que AWS no es una caja negra hermética.

Nos dan las herramientas para ser productivos (como aws_lambda_package_target que automatiza el zip), pero nos dejan la puerta abierta para bajar al nivel del sistema operativo, gestionar la memoria manualmente y optimizar cada milisegundo de ejecución si nuestro negocio lo requiere.

Usar C++ en Lambda no es solo por "velocidad"; es por tener el control total de lo que sucede en tu infraestructura, pagando solo por los milisegundos que realmente usas.

Top comments (0)