Por que C++ no mundo Serverless?
\n\nQuando se ouve "serverless", a primeira coisa que vem à mente é JavaScript, Python ou Go. Mas e se eu disser que é possível executar C++ no AWS Lambda, Google Cloud Functions e até mesmo em runtimes próprios? E isso não é apenas um hack, mas um cenário perfeitamente viável para tarefas onde cada milissegundo conta.
\n\nC++ em serverless é sobre velocidade e cold start. Enquanto uma função Python carrega o interpretador e as dependências, o C++ já concluiu a execução. Mas há nuances: você precisará compilar um binário para Linux, empacotá-lo em um ZIP e especificar um runtime personalizado. Parece complicado? Na verdade, não. Vamos entender.
\n\nComo o Serverless funciona para C++?
\n\nA questão é que os provedores de nuvem não suportam linguagens compiladas nativamente. O AWS Lambda, por exemplo, oferece suporte oficial apenas a Python, Node.js, Java, Go, .NET e Ruby. Mas o Lambda possui o mecanismo Custom Runtime — você pode fornecer qualquer binário que se comunique com a Lambda Runtime API via HTTP.
\n\nO esquema é simples:
\n- \n
- Você compila o código C++ para Amazon Linux 2 (ou ambiente compatível). \n
- Empacota o arquivo executável junto com um script
bootstrap(ou o próprio binário renomeado parabootstrap). \n - Faz o upload do ZIP no Lambda e seleciona "Provide your own bootstrap". \n
O mesmo pode ser feito com o Google Cloud Functions (via Cloud Run ou Knative) e com o Azure Functions (via imagem Docker).
\n\nConstruindo uma função Lambda simples em C++
\n\nVamos escrever uma função que recebe um JSON com dois números e retorna a soma deles. É um clássico, mas em 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 // Lê o evento do stdin (o Lambda passa assim)\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 // Saída para stdout — é a resposta do Lambda\n std::cout << result.dump() << std::endl;\n\n return 0;\n}\n\n\nPara compilar, precisamos do compilador g++ e da biblioteca nlohmann/json (baixar o cabeçalho). Compilamos estaticamente para não carregar arquivos .so:
g++ -std=c++17 -static -O2 main.cpp -o bootstrap\n\n\nAgora criamos um arquivo ZIP com o único arquivo bootstrap e fazemos o upload no Lambda. Pronto! A função está pronta.
Tratamento de erros e logging
\n\nEm um projeto real, é necessário tratar corretamente os erros de parsing do JSON e retornar uma resposta clara. O AWS Lambda espera que seu binário termine com código 0 em caso de sucesso e com código diferente de zero em caso de erro. Logs podem ser escritos no stderr — eles irão para o 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 ao AWS Lambda para C++
\n\nNão quer se preocupar com Custom Runtime? Existem outras opções.
\n\nGoogle Cloud Run + Knative
\n\nVocê pode empacotar uma aplicação C++ em uma imagem Docker e executá-la no Cloud Run. Não é exatamente uma "função", mas sim um serverless baseado em contêiner, porém para C++ é o caminho mais simples. O cold start será mais longo (segundos), mas não há limitações de runtime.
\n\nAzure Functions com Docker
\n\nDe forma similar — use Docker e qualquer imagem com runtime C++. O Azure suporta handlers personalizados através de custom handlers.