Serverless mit C++: AWS Lambda, Leistung und echter Code

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum C++ in der Serverless-Welt?

\n\n

Wenn 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\n

C++ 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\n

Wie funktioniert Serverless für C++?

\n\n

Tatsache 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\n

Das 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 in bootstrap).
  • \n
  • Sie laden das ZIP in Lambda hoch und wählen „Provide your own bootstrap“.
  • \n
\n\n

Dasselbe ist mit Google Cloud Functions (über Cloud Run oder Knative) und mit Azure Functions (über ein Docker-Image) möglich.

\n\n

Eine einfache Lambda-Funktion in C++ erstellen

\n\n

Schreiben 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\n

Für die Kompilierung benötigen wir den Compiler g++ und die Bibliothek nlohmann/json (Header herunterladen). Wir kompilieren statisch, um keine .so-Dateien mitzuschleppen:

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

Jetzt erstellen wir ein ZIP-Archiv mit der einzelnen Datei bootstrap und laden es in Lambda hoch. Fertig! Die Funktion ist bereit.

\n\n

Fehlerbehandlung und Protokollierung

\n\n

In 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.

\n\n
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\n

Alternativen zu AWS Lambda für C++

\n\n

Keine Lust auf den Aufwand mit Custom Runtime? Es gibt auch andere Optionen.

\n\n

Google Cloud Run + Knative

\n\n

Sie 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\n

Azure Functions mit Docker

\n\n

Analog – Sie verwenden Docker und ein beliebiges Image mit C++-Runtime. Azure unterstützt benutzerdefinierte Handler über custom handlers.

\n

Blogs

Buchempfehlungen