Introduction : Pourquoi le C++ dans le Serverless ?
Le monde du serverless computing est fortement associé à JavaScript (Node.js), Python ou Java. Cependant, pour les tâches critiques en termes de performance et de consommation mémoire, le C++ devient un candidat idéal. AWS Lambda prend en charge le C++ via Native Runtime, permettant d'exécuter des fichiers binaires avec une surcharge minimale.
Dans cet article, nous allons voir comment écrire, compiler et déployer une fonction C++ sur AWS Lambda. Vous découvrirez les avantages du C++ dans une architecture serverless, la configuration de l'environnement et l'optimisation du démarrage à froid.
1. Avantages du C++ face à Python et Node.js
Performance et démarrage à froid
Le principal inconvénient des langages interprétés est la latence au démarrage à froid. Un conteneur Lambda avec Python peut s'initialiser en 200-500 ms, tandis qu'avec C++ — moins de 50 ms. C'est crucial pour les API ayant des exigences élevées en matière de latence.
- Faible consommation mémoire : Un binaire C++ occupe ~1-3 Mo contre 20+ Mo pour Node.js avec ses dépendances.
- Accès direct aux ressources système : Travail avec les sockets, fichiers et mémoire sans couche VM intermédiaire.
- Économies : Grâce à une exécution rapide, vous payez moins pour les millisecondes de fonctionnement.
2. Configuration de l'environnement pour C++ sur AWS Lambda
Pour compiler du code C++ pour Lambda, il est nécessaire d'utiliser Amazon Linux 2 (ou une image compatible). La méthode recommandée est un conteneur Docker avec l'image officielle Lambda.
Prérequis
- CMake ≥ 3.15
- GCC 7.3+ ou Clang 7+
- AWS SDK for C++ (optionnel, pour travailler avec S3/DynamoDB)
- Docker (pour la compilation dans un environnement identique à Lambda)
Dockerfile de base pour la compilation
FROM public.ecr.aws/lambda/provided:al2
# Installation des outils de compilationRUN yum install -y gcc-c++ cmake3 make
# Copie des sourcesCOPY . /codeWORKDIR /code/build
# Compilation du binaire statiqueRUN cmake3 .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-static-libstdc++ -static-libgcc" \ && make -j$(nproc)
# Copie du résultat dans le répertoire LambdaRUN cp handler /var/task/bootstrapCMD ["handler"]3. Écrire une fonction Lambda en C++
Contrairement à Python, où le handler est une fonction, en C++ nous créons un fichier exécutable que Lambda lance comme un processus. Les données d'entrée sont transmises via stdin, et le résultat est affiché dans stdout.
Exemple simple : traitement JSON
#include <iostream>#include <string>#include <nlohmann/json.hpp> // Bibliothèque pour travailler avec JSON
using json = nlohmann::json;
int main() { // Lecture de tout stdin (JSON d'entrée de Lambda) std::string input; std::getline(std::cin, input);
try { auto event = json::parse(input);
// Extraction des paramètres std::string name = event.value("name", "World"); int number = event.value("number", 0);
// Formation de la réponse 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; }}Structure du CMakeLists.txt
cmake_minimum_required(VERSION 3.15)project(lambda-handler)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Liaison statique pour la portabilitéset(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc")
# Inclusion de nlohmann/json (vcpkg ou fetch)find_package(nlohmann_json REQUIRED)
add_executable(handler main.cpp)target_link_libraries(handler nlohmann_json::nlohmann_json)