Warum C++ in der Serverless-Welt?
\n\nWenn man „Serverless“ hört, denkt man zuerst an JavaScript, Python oder Go. Aber was, wenn ich sage, dass man C++ in AWS Lambda, Google Cloud Functions und sogar auf eigenen Runtimes ausführen kann? Und das ist kein bloßer Hack, sondern ein durchaus sinnvolles Szenario für Aufgaben, bei denen jede Millisekunde zählt.
\n\nC++ in Serverless geht um Geschwindigkeit und Kaltstarts. Während eine Python-Funktion den Interpreter und Abhängigkeiten lädt, hat C++ die Ausführung bereits abgeschlossen. Aber es gibt Nuancen: Sie müssen eine Binärdatei für Linux erstellen, in ein ZIP packen und einen benutzerdefinierten Runtime angeben. Klingt kompliziert? In Wirklichkeit ist es das nicht. Lassen Sie es uns ansehen.
\n\nWie funktioniert Serverless für C++?
\n\nTatsache ist, dass Cloud-Anbieter kompilierte Sprachen nicht von Haus aus unterstützen. AWS Lambda unterstützt offiziell nur Python, Node.js, Java, Go, .NET und Ruby. Aber Lambda hat einen Mechanismus namens Custom Runtime – Sie können jede Binärdatei bereitstellen, die über HTTP mit der Lambda Runtime API kommuniziert.
\n\nDas Schema ist einfach:
\n- \n
- Sie kompilieren C++-Code für Amazon Linux 2 (oder eine kompatible Umgebung). \n
- Sie packen die ausführbare Datei zusammen mit einem
bootstrap-Skript (oder der Binärdatei selbst, umbenannt inbootstrap). \n - Sie laden das ZIP in Lambda hoch und wählen „Provide your own bootstrap“. \n
Dasselbe ist mit Google Cloud Functions (über Cloud Run oder Knative) und mit Azure Functions (über ein Docker-Image) möglich.
\n\nEine einfache Lambda-Funktion in C++ erstellen
\n\nSchreiben wir eine Funktion, die ein JSON mit zwei Zahlen akzeptiert und deren Summe zurückgibt. Das ist ein Klassiker, aber in 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 // Ereignis von stdin lesen (Lambda übergibt es so)\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 // Ausgabe nach stdout – das ist die Lambda-Antwort\n std::cout << result.dump() << std::endl;\n\n return 0;\n}\n\n\nFür die Kompilierung benötigen wir den Compiler g++ und die Bibliothek nlohmann/json (Header herunterladen). Wir kompilieren statisch, um keine .so-Dateien mitzuschleppen:
g++ -std=c++17 -static -O2 main.cpp -o bootstrap\n\n\nJetzt erstellen wir ein ZIP-Archiv mit der einzelnen Datei bootstrap und laden es in Lambda hoch. Fertig! Die Funktion ist bereit.
Fehlerbehandlung und Protokollierung
\n\nIn einem echten Projekt müssen JSON-Parsing-Fehler korrekt behandelt und eine verständliche Antwort zurückgegeben werden. AWS Lambda erwartet, dass Ihre Binärdatei bei Erfolg mit Code 0 und bei einem Fehler mit einem Nicht-Null-Code beendet wird. Logs können Sie in stderr schreiben – sie landen in CloudWatch.
if (!event.contains("a") || !event.contains("b")) {\n std::cerr << "Fehlende Parameter" << std::endl;\n json error;\n error["statusCode"] = 400;\n error["body"] = "Ungültige Anfrage";\n std::cout << error.dump() << std::endl;\n return 1;\n}\n\n\nAlternativen zu AWS Lambda für C++
\n\nKeine Lust auf den Aufwand mit Custom Runtime? Es gibt auch andere Optionen.
\n\nGoogle Cloud Run + Knative
\n\nSie können Ihre C++-Anwendung in ein Docker-Image packen und auf Cloud Run ausführen. Das ist nicht wirklich eine „Funktion“, sondern eher containerbasierter Serverless, aber für C++ ist das der einfachste Weg. Der Kaltstart dauert länger (Sekunden), dafür gibt es keine Runtime-Einschränkungen.
\n\nAzure Functions mit Docker
\n\nAnalog – Sie verwenden Docker und ein beliebiges Image mit C++-Runtime. Azure unterstützt benutzerdefinierte Handler über custom handlers.