Serverless en C++ : AWS Lambda, performances et code réel

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi le C++ dans le monde Serverless ?

\n\n

Quand on entend « serverless », la première chose qui vient à l'esprit est JavaScript, Python ou Go. Mais que diriez-vous si je vous disais que l'on peut exécuter du C++ dans AWS Lambda, Google Cloud Functions et même sur des runtimes personnalisés ? Et ce n'est pas juste un hack, mais un scénario tout à fait pertinent pour des tâches où chaque milliseconde compte.

\n\n

Le C++ en serverless, c'est une question de vitesse et de démarrage à froid. Pendant qu'une fonction Python charge l'interpréteur et ses dépendances, le C++ a déjà terminé son exécution. Mais il y a des nuances : vous devrez compiler un binaire pour Linux, l'empaqueter dans un ZIP et spécifier un runtime personnalisé. Cela semble compliqué ? En réalité, non. Voyons cela ensemble.

\n\n

Comment fonctionne Serverless pour le C++ ?

\n\n

Le fait est que les fournisseurs cloud ne supportent pas nativement les langages compilés. AWS Lambda, par exemple, ne supporte officiellement que Python, Node.js, Java, Go, .NET et Ruby. Mais Lambda dispose d'un mécanisme de Custom Runtime : vous pouvez fournir n'importe quel binaire qui communiquera avec l'API Lambda Runtime via HTTP.

\n\n

Le schéma est simple :

\n
    \n
  • Vous compilez votre code C++ pour Amazon Linux 2 (ou un environnement compatible).
  • \n
  • Vous empaquetez le fichier exécutable avec un script bootstrap (ou le binaire lui-même renommé en bootstrap).
  • \n
  • Vous téléchargez le ZIP dans Lambda et sélectionnez « Provide your own bootstrap ».
  • \n
\n\n

La même chose peut être faite avec Google Cloud Functions (via Cloud Run ou Knative) et avec Azure Functions (via une image Docker).

\n\n

Construction d'une simple fonction Lambda en C++

\n\n

Écrivons une fonction qui reçoit un JSON avec deux nombres et retourne leur somme. C'est un classique, mais en 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    // Lecture de l'événement depuis stdin (Lambda le transmet ainsi)\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    // Sortie vers stdout — c'est la réponse de Lambda\n    std::cout << result.dump() << std::endl;\n\n    return 0;\n}\n
\n\n

Pour la compilation, nous aurons besoin du compilateur g++ et de la bibliothèque nlohmann/json (télécharger l'en-tête). Compilons statiquement pour éviter d'emporter des fichiers .so :

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

Créez maintenant une archive ZIP avec le seul fichier bootstrap et téléchargez-la dans Lambda. Et voilà ! La fonction est prête.

\n\n

Gestion des erreurs et journalisation

\n\n

Dans un projet réel, il faut gérer correctement les erreurs d'analyse JSON et retourner une réponse compréhensible. AWS Lambda s'attend à ce que votre binaire se termine avec le code 0 en cas de succès et avec un code non nul en cas d'erreur. Les logs peuvent être écrits dans stderr — ils apparaîtront dans CloudWatch.

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

Alternatives à AWS Lambda pour le C++

\n\n

Vous ne voulez pas vous embêter avec un Custom Runtime ? Il existe d'autres options.

\n\n

Google Cloud Run + Knative

\n\n

Vous pouvez empaqueter votre application C++ dans une image Docker et l'exécuter sur Cloud Run. Ce n'est pas tout à fait une « fonction », mais plutôt un serverless conteneurisé. Pour le C++, c'est le chemin le plus simple. Le démarrage à froid sera plus long (quelques secondes), mais il n'y a pas de limitations sur le runtime.

\n\n

Azure Functions avec Docker

\n\n

De manière similaire — utilisez Docker et n'importe quelle image avec un runtime C++. Azure supporte les gestionnaires personnalisés via les custom handlers.

\n

Blogs

Book Recommendations