Serverless en C++: AWS Lambda, rendimiento y código real

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

¿Por qué C++ en el mundo Serverless?

\n\n

Cuando escuchas «serverless», lo primero que viene a la mente es JavaScript, Python o Go. Pero, ¿y si te dijera que se puede ejecutar C++ en AWS Lambda, Google Cloud Functions e incluso en runtimes propios? Y esto no es solo un truco, sino un escenario completamente razonable para tareas donde cada milisegundo cuenta.

\n\n

C++ en serverless se trata de velocidad y arranque en frío. Mientras una función en Python carga el intérprete y las dependencias, C++ ya ha completado la ejecución. Pero hay matices: tendrás que compilar un binario para Linux, empaquetarlo en un ZIP y especificar un runtime personalizado. ¿Suena complicado? En realidad, no lo es. Vamos a analizarlo.

\n\n

¿Cómo funciona Serverless para C++?

\n\n

El problema es que los proveedores de la nube no admiten lenguajes compilados de forma nativa. AWS Lambda, por ejemplo, solo admite oficialmente Python, Node.js, Java, Go, .NET y Ruby. Pero Lambda tiene el mecanismo Custom Runtime: puedes proporcionar cualquier binario que se comunique con la API de Lambda Runtime a través de HTTP.

\n\n

El esquema es simple:

\n
    \n
  • Compilas el código C++ para Amazon Linux 2 (o un entorno compatible).
  • \n
  • Empaquetas el archivo ejecutable junto con un script bootstrap (o el propio binario renombrado a bootstrap).
  • \n
  • Subes el ZIP a Lambda y seleccionas «Proporcionar tu propio bootstrap».
  • \n
\n\n

Lo mismo se puede hacer con Google Cloud Functions (a través de Cloud Run o Knative) y con Azure Functions (mediante una imagen Docker).

\n\n

Construyendo una función Lambda simple en C++

\n\n

Escribamos una función que reciba un JSON con dos números y devuelva su suma. Es un clásico, pero en C++.

\n\n
// main.cpp\n#include <iostream>\n#include <string>\n#include <nlohmann/json.hpp>\n\nusing json = nlohmann::json;\n\nint main() {\n    // Leemos el evento desde stdin (Lambda lo pasa así)\n    std::string input;\n    std::getline(std::cin, input);\n\n    auto event = json::parse(input);\n\n    int a = event["a"];\n    int b = event["b"];\n    int sum = a + b;\n\n    json result;\n    result["statusCode"] = 200;\n    result["body"] = std::to_string(sum);\n\n    // La salida a stdout es la respuesta de Lambda\n    std::cout << result.dump() << std::endl;\n\n    return 0;\n}\n
\n\n

Para compilar necesitaremos el compilador g++ y la librería nlohmann/json (descargar el encabezado). Compilamos estáticamente para no arrastrar archivos .so:

\n\n
g++ -std=c++17 -static -O2 main.cpp -o bootstrap\n
\n\n

Ahora creamos un archivo ZIP con un único archivo bootstrap y lo subimos a Lambda. ¡Listo! La función está preparada.

\n\n

Manejo de errores y registro

\n\n

En un proyecto real, es necesario manejar correctamente los errores de análisis JSON y devolver una respuesta clara. AWS Lambda espera que su binario termine con código 0 en caso de éxito y con un código distinto de cero en caso de error. Los registros se pueden escribir en stderr y aparecerán en CloudWatch.

\n\n
if (!event.contains("a") || !event.contains("b")) {\n    std::cerr << "Missing parameters" << std::endl;\n    json error;\n    error["statusCode"] = 400;\n    error["body"] = "Bad Request";\n    std::cout << error.dump() << std::endl;\n    return 1;\n}\n
\n\n

Alternativas a AWS Lambda para C++

\n\n

¿No quieres complicarte con Custom Runtime? Hay otras opciones.

\n\n

Google Cloud Run + Knative

\n\n

Puedes empaquetar una aplicación C++ en una imagen Docker y ejecutarla en Cloud Run. No es exactamente una «función», sino más bien un serverless basado en contenedores, pero para C++ es la ruta más sencilla. El arranque en frío será más lento (segundos), pero no hay restricciones de runtime.

\n\n

Azure Functions con Docker

\n\n

De manera similar, usas Docker y cualquier imagen con runtime de C++. Azure admite controladores personalizados a través de custom handlers.

\n

Blogs

Book Recommendations