¿Por qué C++ en el mundo Serverless?
\n\nCuando 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\nC++ 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\nEl 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\nEl 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 abootstrap). \n - Subes el ZIP a Lambda y seleccionas «Proporcionar tu propio bootstrap». \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\nConstruyendo una función Lambda simple en C++
\n\nEscribamos 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\nPara compilar necesitaremos el compilador g++ y la librería nlohmann/json (descargar el encabezado). Compilamos estáticamente para no arrastrar archivos .so:
g++ -std=c++17 -static -O2 main.cpp -o bootstrap\n\n\nAhora creamos un archivo ZIP con un único archivo bootstrap y lo subimos a Lambda. ¡Listo! La función está preparada.
Manejo de errores y registro
\n\nEn 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.
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\nAlternativas a AWS Lambda para C++
\n\n¿No quieres complicarte con Custom Runtime? Hay otras opciones.
\n\nGoogle Cloud Run + Knative
\n\nPuedes 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\nAzure Functions con Docker
\n\nDe manera similar, usas Docker y cualquier imagen con runtime de C++. Azure admite controladores personalizados a través de custom handlers.