ОС | Арка | Статус |
---|---|---|
Амазонка Линукс 2 | x86_64 | |
Амазонка Линукс 2 | aarch64 | |
Amazon Linux (АЛАМИ) | x86_64 | |
Альпийский | x86_64 | |
Арч Линукс | x86_64 | |
Убунту 18.04 | x86_64 |
Реализация C++ API среды выполнения лямбда
Поскольку AWS Lambda работает на GNU/Linux, вам также следует создать эту библиотеку времени выполнения и свою логику на GNU/Linux.
Сначала убедитесь, что у вас установлены следующие пакеты:
В терминале выполните следующие команды:
$ git clone https://github.com/awslabs/aws-lambda-cpp.git
$ cd aws-lambda-cpp
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make && make install
Чтобы использовать эту библиотеку в проекте, который также использует CMake, вам нужно сделать:
cmake_minimum_required ( VERSION 3.9)
set (CMAKE_CXX_STANDARD 11)
project (demo LANGUAGES CXX)
find_package (aws-lambda-runtime)
add_executable ( ${PROJECT_NAME} "main.cpp" )
target_link_libraries ( ${PROJECT_NAME} PRIVATE AWS::aws-lambda-runtime)
target_compile_features ( ${PROJECT_NAME} PRIVATE "cxx_std_11" )
target_compile_options ( ${PROJECT_NAME} PRIVATE "-Wall" "-Wextra" )
# this line creates a target that packages your binary and zips it up
aws_lambda_package_target( ${PROJECT_NAME} )
А вот как будет выглядеть пример main.cpp
:
# include < aws/lambda-runtime/runtime.h >
using namespace aws ::lambda_runtime ;
static invocation_response my_handler (invocation_request const & req)
{
if (req. payload . length () > 42 ) {
return invocation_response::failure ( " error message here " /* error_message */ ,
" error type here " /* error_type */ );
}
return invocation_response::success ( " json payload here " /* payload */ ,
" application/json " /* MIME type */ );
}
int main ()
{
run_handler (my_handler);
return 0 ;
}
И, наконец, вот как бы вы все это упаковали. Запустите следующие команды из корневого каталога вашего приложения:
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
Последняя команда выше make aws-lambda-package-demo
создаст zip-файл с именем demo.zip
в текущем каталоге.
Теперь создайте роль IAM и функцию Lambda через интерфейс командной строки AWS.
Сначала создайте следующий JSON-файл политики доверия.
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
Затем создайте роль IAM:
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
Запишите роль, которую Арн вернул вам после выполнения этой команды. Он понадобится нам в следующих шагах:
Прикрепите следующую политику, чтобы разрешить Lambda записывать журналы в CloudWatch:
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Обязательно прикрепите соответствующие политики и/или разрешения для любых других сервисов AWS, которые вы планируете использовать.
И, наконец, создайте функцию Lambda:
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
И чтобы вызвать функцию:
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
Эта библиотека полностью независима от AWS C++ SDK. Вам следует рассматривать AWS C++ SDK как еще одну зависимость в вашем приложении. В разделе примеров представлена демонстрация использования AWS C++ SDK с этой средой выполнения Lambda.
Любой полностью совместимый компилятор C++11, предназначенный для GNU/Linux x86-64, должен работать. Пожалуйста, избегайте версий компилятора, которые обеспечивают полусырую поддержку C++11.
Lambda запускает ваш код в какой-либо версии Amazon Linux. Было бы далеко не идеальное обслуживание клиентов, если бы вы были вынуждены создавать свое приложение на этой платформе и только на этой платформе.
Однако свобода создания любого дистрибутива Linux сопряжена с трудностями. Библиотека GNU C ABI. Нет никакой гарантии, что платформа, используемая для создания функции Lambda, имеет ту же версию GLIBC, что и платформа, используемая AWS Lambda. На самом деле вы, возможно, даже не используете реализацию GNU. Например, вы можете создать лямбда-функцию C++, используя musl libc.
Чтобы гарантировать, что ваше приложение будет корректно работать на Lambda, мы должны упаковать всю библиотеку времени выполнения C вместе с вашей функцией. Если вы решите использовать ту же версию Amazon Linux, которую использует лямбда-выражение, вы можете избежать упаковки среды выполнения C в свой zip-файл. Это можно сделать, передав флаг NO_LIBC
в CMake следующим образом:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Любая библиотечная зависимость вашей функции Lambda, динамически загружаемая через dlopen
, НЕ будет автоматически упакована. Вы должны добавить эти зависимости вручную в zip-файл. Это относится к любым файлам конфигурации или ресурсов, от которых зависит ваш код.
Если вы совершаете HTTP-вызовы через TLS (https), имейте в виду, что расположение пакета CA в разных дистрибутивах различается. Например, если вы используете AWS C++ SDK, лучше всего установить следующие параметры конфигурации:
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
Если вы не используете AWS C++ SDK, но используете libcurl напрямую, вы можете установить местоположение пакета CA, выполнив следующие действия:
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
Почему zip-файл такой большой? что это за файлы? Обычно zip-файл имеет большой размер, поскольку нам нужно упаковать всю стандартную библиотеку C. Вы можете уменьшить размер, выполнив некоторые или все из следующих действий:
-DCMAKE_BUILD_TYPE=Release
Как загрузить zip-файл размером более 50 МБ через CLI? Сначала загрузите zip-файл на S3:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
ПРИМЕЧАНИЕ. Вы должны использовать тот же регион для корзины S3, что и лямбда.
Затем вы можете создать функцию Lambda следующим образом:
$ aws lambda create-function --function-name demo
--role < specify role arn here >
--runtime provided --timeout 15 --memory-size 128
--handler demo
--code " S3Bucket=mys3bucket,S3Key=demo.zip "
Мой код дает сбой, как его отладить?
sudo apt install libdw-dev
или sudo apt install binutils-dev
sudo yum install elfutils-devel
или sudo yum install binutils-devel
Если у вас установлен какой-либо из этих пакетов, CMake обнаружит их и автоматически свяжется с ними. Никаких других действий не требуется.-DCMAKE_BUILD_TYPE=Debug
. Подробные журналы включены по умолчанию в отладочных сборках.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
Аргумент security-opt
необходим для запустите gdb
, strace
и т. д.Проблема CURL с сертификатом SSL CA
libcurl
созданную с помощью OpenSSL, или одну из ее разновидностей (BoringSSL, LibreSSL).libcurl
где найти файл пакета CA. Не известно преобразование между std::string
и Aws::String
-DBUILD_SHARED_LIBS=OFF
). Эта библиотека распространяется по лицензии Apache 2.0.