Serverless функции на C++: AWS Lambda от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Serverless функции на C++: AWS Lambda от А до Я

Serverless-архитектура прочно вошла в мир современной разработки, предлагая масштабирование и оплату только за фактическое использование ресурсов. Большинство ассоциируют serverless с Python, Node.js или Java, но C++ — мощный и производительный язык, который также можно использовать для создания Lambda-функций в AWS. В этой статье мы разберем полный цикл: от настройки окружения до деплоя и отладки C++ функции в AWS Lambda.

Почему стоит выбрать C++ для AWS Lambda?

C++ предоставляет уникальные преимущества для serverless-сценариев:

  • Максимальная производительность: C++ компилируется в машинный код, что дает минимальное время выполнения и низкую задержку (latency). Это критично для high-frequency trading, обработки видео в реальном времени или сложных математических вычислений.
  • Экономия ресурсов: Функции на C++ потребляют меньше памяти и CPU по сравнению с интерпретируемыми языками, что позволяет снизить стоимость за счет меньшего количества вызовов или использования более дешевых тарифов.
  • Работа с legacy-кодом: Вы можете легко интегрировать существующие C++ библиотеки и алгоритмы без переписывания на другой язык.

Настройка окружения и AWS SDK для C++

Перед тем как писать код, необходимо настроить рабочее место. AWS предоставляет официальный AWS SDK для C++, который упрощает взаимодействие с сервисами (S3, DynamoDB и т.д.).

Установка зависимостей

Для Linux (Amazon Linux 2 или Ubuntu) используйте пакетный менеджер:

sudo yum install cmake gcc-c++ libcurl-devel openssl-devel
# Или для Ubuntu:
sudo apt-get install cmake g++ libcurl4-openssl-dev libssl-dev

Сборка AWS SDK

Скачайте и соберите SDK:

git clone https://github.com/aws/aws-sdk-cpp.git
cd aws-sdk-cpp
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_ONLY="lambda"
make -j$(nproc)
sudo make install

Флаг -DBUILD_ONLY="lambda" ускоряет сборку, включая только необходимые модули.

Написание Lambda-функции на C++

Lambda-функция на C++ — это обычная программа, которая компилируется в исполняемый файл и использует специальный интерфейс Runtime API. AWS ожидает, что ваш бинарник будет запущен и будет слушать запросы на локальном HTTP-сервере.

Структура проекта

Создадим минимальный проект:

my-lambda-cpp/
├── CMakeLists.txt
└── src/
    └── main.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(my-lambda)

set(CMAKE_CXX_STANDARD 17)

find_package(AWSSDK REQUIRED COMPONENTS lambda)

add_executable(handler src/main.cpp)
target_link_libraries(handler ${AWSSDK_LINK_LIBRARIES})

Основной код (main.cpp)

В C++ Lambda используется Custom Runtime. Мы должны реализовать цикл обработки событий:

#include <iostream>
#include <aws/lambda-runtime/runtime.h>

using namespace aws::lambda_runtime;

// Функция-обработчик
invocation_response my_handler(invocation_request const& req) {
    // Логируем входящее событие
    std::cout << "Received event: " << req.payload << std::endl;

    // Простейшая обработка: возвращаем JSON
    std::string response = R"({"statusCode": 200, "body": "Hello from C++ Lambda!"})";
    return invocation_response::success(response, "application/json");
}

int main() {
    run_handler(my_handler);
    return 0;
}

Важно: run_handler запускает бесконечный цикл, который слушает порт 9001 (стандартный для Runtime API).

Сборка и деплой функции

Сборка должна производиться в среде, совместимой с Amazon Linux, иначе бинарник не запустится. Используем Docker для эмуляции:

Docker-контейнер для сборки

FROM amazonlinux:2
RUN yum install -y cmake gcc-c++ libcurl-devel openssl-devel git
# ... копируем и собираем SDK и проект

После сборки получим исполняемый файл handler. Его нужно упаковать в ZIP-архив вместе с библиотеками:

zip -j deployment.zip bootstrap handler
# bootstrap — скрипт запуска (см. ниже)

Файл bootstrap (без расширения) — это скрипт, который AWS запускает при старте:

#!/bin/sh
./handler

Не забудьте сделать его исполняемым: chmod +x bootstrap.

Загрузка в AWS Lambda

Через консоль AWS или AWS CLI:

aws lambda create-function \
    --function-name my-cpp-function \
    --runtime provided.al2 \
    --role arn:aws:iam::123456789012:role/lambda-execution-role \
    --handler handler \
    --zip-file fileb://deployment.zip

Обратите внимание на runtime provided.al2 — это Custom Runtime на базе Amazon Linux 2.

Отладка и мониторинг

Отладка C++ в serverless-среде сложнее, чем для Python, но возможна:

  • Логирование: Используйте std::cout — вывод направляется в Amazon CloudWatch Logs.
  • Тестирование локально: Запустите бинарник локально и отправьте тестовый запрос через curl:
    curl -X POST http://localhost:9001/2015-03-31/functions/function/invocations \
        -d '{"key": "value"}'
  • X-Ray: Подключите AWS X-Ray для трассировки запросов, добавив SDK для X-Ray в ваш проект.

Лучшие практики для C++ Lambda

  1. Минимизируйте размер бинарника: Используйте статическую линковку только необходимых библиотек. Рассмотрите использование musl libc вместо glibc для уменьшения размера.
  2. Холодный

Блоги

Рекомендаций по книгам