Einführung: Warum C++ in Serverless?
Die Welt des Serverless-Computing wird stark mit JavaScript (Node.js), Python oder Java assoziiert. Für leistungskritische und speicherintensive Aufgaben wird C++ jedoch zum idealen Kandidaten. AWS Lambda unterstützt C++ über die Native Runtime und ermöglicht so die Ausführung von Binärdateien mit minimalem Overhead.
In diesem Artikel werden wir uns ansehen, wie man eine C++-Funktion für AWS Lambda schreibt, kompiliert und bereitstellt. Sie erfahren mehr über die Vorteile von C++ in einer Serverless-Architektur, die Einrichtung der Umgebung und die Optimierung des Kaltstarts.
1. Vorteile von C++ gegenüber Python und Node.js
Leistung und Kaltstart
Der Hauptnachteil interpretierter Sprachen ist die Verzögerung beim Kaltstart. Ein Lambda-Container mit Python kann 200-500 ms zur Initialisierung benötigen, während C++ weniger als 50 ms braucht. Dies ist kritisch für APIs mit hohen Latenzanforderungen.
- Geringer Speicherverbrauch: Eine C++-Binärdatei belegt ~1-3 MB im Vergleich zu 20+ MB für Node.js mit Abhängigkeiten.
- Direkter Zugriff auf Systemressourcen: Arbeit mit Sockets, Dateien und Speicher ohne VM-Zwischenschicht.
- Kosteneffizienz: Durch die schnelle Ausführung zahlen Sie weniger pro Millisekunde Laufzeit.
2. Einrichtung der Umgebung für C++ auf AWS Lambda
Für die Kompilierung von C++-Code für Lambda muss Amazon Linux 2 (oder ein kompatibles Image) verwendet werden. Die empfohlene Methode ist ein Docker-Container mit dem offiziellen Lambda-Image.
Anforderungen
- CMake ≥ 3.15
- GCC 7.3+ oder Clang 7+
- AWS SDK for C++ (optional, für die Arbeit mit S3/DynamoDB)
- Docker (für den Build in einer Lambda-identischen Umgebung)
Basis-Dockerfile für den Build
FROM public.ecr.aws/lambda/provided:al2
# Installation der Build-ToolsRUN yum install -y gcc-c++ cmake3 make
# Quellcode kopierenCOPY . /codeWORKDIR /code/build
# Build der statischen BinärdateiRUN cmake3 .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-static-libstdc++ -static-libgcc" \ && make -j$(nproc)
# Ergebnis in das Lambda-Verzeichnis kopierenRUN cp handler /var/task/bootstrapCMD ["handler"]3. Schreiben einer Lambda-Funktion in C++
Im Gegensatz zu Python, wo der Handler eine Funktion ist, erstellen wir in C++ eine ausführbare Datei, die Lambda als Prozess startet. Die Eingabedaten werden über stdin übergeben, das Ergebnis wird in stdout ausgegeben.
Einfaches Beispiel: JSON-Verarbeitung
#include <iostream>#include <string>#include <nlohmann/json.hpp> // Bibliothek für JSON-Verarbeitung
using json = nlohmann::json;
int main() { // Gesamtes stdin lesen (Eingabe-JSON von Lambda) std::string input; std::getline(std::cin, input);
try { auto event = json::parse(input);
// Parameter extrahieren std::string name = event.value("name", "World"); int number = event.value("number", 0);
// Antwort erstellen json response = { {"message", "Hello, " + name + "!"}, {"computed", number * 2}, {"language", "C++"} };
std::cout << response.dump() << std::endl; return 0; } catch (const std::exception& e) { std::cerr << "{\\"error\\":\\"" << e.what() << "\\"}" << std::endl; return 1; }}Struktur der CMakeLists.txt
cmake_minimum_required(VERSION 3.15)project(lambda-handler)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Statisches Linken für Portabilitätset(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc")
# nlohmann/json einbinden (vcpkg oder fetch)find_package(nlohmann_json REQUIRED)
add_executable(handler main.cpp)target_link_librar