Introdução: Por que C++ em Serverless?
O mundo da computação serverless está fortemente associado a JavaScript (Node.js), Python ou Java. No entanto, para tarefas críticas em termos de desempenho e consumo de memória, C++ torna-se um candidato ideal. O AWS Lambda suporta C++ através do Native Runtime, permitindo executar arquivos binários com sobrecarga mínima.
Neste artigo, vamos analisar como escrever, compilar e implantar uma função C++ no AWS Lambda. Você aprenderá sobre as vantagens do C++ na arquitetura serverless, configuração do ambiente e otimização da inicialização a frio.
1. Vantagens do C++ sobre Python e Node.js
Desempenho e inicialização a frio
A principal desvantagem das linguagens interpretadas é a latência na inicialização a frio. Um contêiner Lambda com Python pode inicializar em 200-500 ms, enquanto com C++ — menos de 50 ms. Isso é crítico para APIs com altos requisitos de latência.
- Baixo consumo de memória: Um binário C++ ocupa ~1-3 MB contra 20+ MB para Node.js com dependências.
- Acesso direto a recursos do sistema: Trabalho com sockets, arquivos e memória sem a camada de VM.
- Economia: Devido à execução rápida, você paga menos por milissegundos de trabalho.
2. Configuração do ambiente para C++ no AWS Lambda
Para compilar código C++ para Lambda, é necessário usar Amazon Linux 2 (ou uma imagem compatível). A maneira recomendada é usar um contêiner Docker com a imagem oficial do Lambda.
Requisitos
- CMake ≥ 3.15
- GCC 7.3+ ou Clang 7+
- AWS SDK for C++ (opcional, para trabalhar com S3/DynamoDB)
- Docker (para compilar em um ambiente idêntico ao Lambda)
Dockerfile básico para compilação
FROM public.ecr.aws/lambda/provided:al2
# Instalação das ferramentas de compilaçãoRUN yum install -y gcc-c++ cmake3 make
# Copiamos os fontesCOPY . /codeWORKDIR /code/build
# Compilação do binário estáticoRUN cmake3 .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-static-libstdc++ -static-libgcc" \ && make -j$(nproc)
# Copiamos o resultado para o diretório LambdaRUN cp handler /var/task/bootstrapCMD ["handler"]3. Escrevendo uma função Lambda em C++
Ao contrário do Python, onde o handler é uma função, em C++ criamos um arquivo executável que o Lambda executa como um processo. Os dados de entrada são passados via stdin, e o resultado é enviado para stdout.
Exemplo simples: processamento de JSON
#include <iostream>#include <string>#include <nlohmann/json.hpp> // Biblioteca para trabalhar com JSON
using json = nlohmann::json;
int main() { // Lê todo o stdin (JSON de entrada do Lambda) std::string input; std::getline(std::cin, input);
try { auto event = json::parse(input);
// Extrai os parâmetros std::string name = event.value("name", "World"); int number = event.value("number", 0);
// Forma a resposta 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; }}Estrutura do CMakeLists.txt
cmake_minimum_required(VERSION 3.15)project(lambda-handler)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Linkagem estática para portabilidadeset(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc")
# Inclui nlohmann/json (vcpkg ou fetch)find_package(nlohmann_json REQUIRED)
add_executable(handler main.cpp)target_link_librar