SO | Arco | Status |
---|---|---|
Amazon Linux 2 | x86_64 | |
Amazon Linux 2 | aarch64 | |
Amazon Linux (ALAMI) | x86_64 | |
Alpino | x86_64 | |
Arco Linux | x86_64 | |
Ubuntu 18.04 | x86_64 |
Implementação C++ da API de tempo de execução lambda
Como o AWS Lambda é executado em GNU/Linux, você deve construir esta biblioteca de tempo de execução e sua lógica também em GNU/Linux.
Certifique-se de ter os seguintes pacotes instalados primeiro:
Em um terminal, execute os seguintes comandos:
$ 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
Para consumir esta biblioteca em um projeto que também usa CMake, você faria:
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} )
E aqui está como seria um exemplo 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 ;
}
E, finalmente, veja como você empacotaria tudo. Execute os seguintes comandos no diretório raiz do seu aplicativo:
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
O último comando acima make aws-lambda-package-demo
criará um arquivo zip chamado demo.zip
no diretório atual.
Agora, crie uma função IAM e a função Lambda por meio da AWS CLI.
Primeiro, crie o seguinte arquivo JSON de política de confiança
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
Em seguida, crie a função IAM:
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
Anote a função que Arn retornou para você após executar esse comando. Precisaremos dele nas próximas etapas:
Anexe a seguinte política para permitir que o Lambda grave logs no CloudWatch:
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Certifique-se de anexar as políticas e/ou permissões apropriadas para quaisquer outros serviços da AWS que você planeja usar.
E por fim, crie a função Lambda:
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
E para invocar a função:
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
Esta biblioteca é completamente independente do AWS C++ SDK. Você deve tratar o AWS C++ SDK como apenas mais uma dependência em seu aplicativo. Consulte a seção de exemplos para ver uma demonstração utilizando o AWS C++ SDK com este tempo de execução do Lambda.
Qualquer compilador C++ 11 totalmente compatível direcionado ao GNU/Linux x86-64 deve funcionar. Evite versões de compilador que forneçam suporte incompleto ao C++ 11.
O Lambda executa seu código em alguma versão do Amazon Linux. Seria uma experiência nada ideal para o cliente se você fosse forçado a construir seu aplicativo nessa plataforma e apenas nessa plataforma.
No entanto, a liberdade de desenvolver qualquer distribuição Linux traz um desafio. A Biblioteca GNU C ABI. Não há garantia de que a plataforma usada para construir a função Lambda tenha a mesma versão GLIBC usada pelo AWS Lambda. Na verdade, você pode nem estar usando a implementação do GNU. Por exemplo, você poderia construir uma função C++ Lambda usando musl libc.
Para garantir que seu aplicativo será executado corretamente no Lambda, devemos empacotar toda a biblioteca de tempo de execução C com sua função. Se você optar por criar na mesma versão do Amazon Linux usada pelo lambda, poderá evitar empacotar o tempo de execução C em seu arquivo zip. Isso pode ser feito passando o sinalizador NO_LIBC
no CMake da seguinte maneira:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Qualquer dependência de biblioteca que sua função Lambda tenha e que seja carregada dinamicamente via dlopen
NÃO será empacotada automaticamente. Você deve adicionar essas dependências manualmente ao arquivo zip. Isso se aplica a qualquer arquivo de configuração ou de recursos dos quais seu código depende.
Se você estiver fazendo chamadas HTTP por TLS (https), lembre-se de que o local do pacote CA é diferente entre as distros. Por exemplo, se você estiver usando o AWS C++ SDK, é melhor definir as seguintes opções de configuração:
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
Se você não estiver usando o AWS C++ SDK, mas estiver usando libcurl diretamente, poderá definir o local do pacote CA fazendo:
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
Por que o arquivo zip é tão grande? o que são todos esses arquivos? Normalmente, o arquivo zip é grande porque precisamos empacotar toda a biblioteca padrão C. Você pode reduzir o tamanho executando alguns ou todos os seguintes procedimentos:
-DCMAKE_BUILD_TYPE=Release
Como fazer upload de um arquivo zip maior que 50 MB por meio da CLI? Carregue seu arquivo zip para o S3 primeiro:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
NOTA: você deve usar a mesma região para seu bucket S3 que o lambda.
Então você pode criar a função Lambda desta forma:
$ 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 "
Meu código está travando, como posso depurá-lo?
sudo apt install libdw-dev
ou sudo apt install binutils-dev
sudo yum install elfutils-devel
ou sudo yum install binutils-devel
Se você tiver algum desses pacotes instalados, o CMake irá detectá-los e vinculá-los automaticamente. Nenhuma outra etapa é necessária.-DCMAKE_BUILD_TYPE=Debug
. Os logs detalhados são habilitados por padrão em builds de depuração.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
O argumento security-opt
é necessário para execute gdb
, strace
, etc.Problema CURL com o certificado SSL CA
libcurl
construída com OpenSSL ou um de seus sabores (BoringSSL, LibreSSL)libcurl
onde encontrar o arquivo do pacote CA. Nenhuma conversão conhecida entre std::string
e Aws::String
-DBUILD_SHARED_LIBS=OFF
) Esta biblioteca está licenciada sob a licença Apache 2.0.