SO | Arco | Estado |
---|---|---|
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 |
Implementación en C++ de la API de tiempo de ejecución lambda
Dado que AWS Lambda se ejecuta en GNU/Linux, debe crear esta biblioteca de tiempo de ejecución y su lógica también en GNU/Linux.
Asegúrese de tener instalados los siguientes paquetes primero:
En una terminal, ejecute los siguientes 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 en un proyecto que también usa CMake, haría:
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} )
Y así es como se vería un ejemplo de 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 ;
}
Y finalmente, así es como lo empaquetarías todo. Ejecute los siguientes comandos desde el directorio raíz de su aplicación:
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
El último comando anterior make aws-lambda-package-demo
creará un archivo zip llamado demo.zip
en el directorio actual.
Ahora, cree un rol de IAM y la función Lambda a través de la CLI de AWS.
Primero cree el siguiente archivo JSON de política de confianza
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
Luego cree el rol de IAM:
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
Anota el rol que Arn te devolvió después de ejecutar ese comando. Lo necesitaremos en los próximos pasos:
Adjunte la siguiente política para permitir que Lambda escriba registros en CloudWatch:
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Asegúrese de adjuntar las políticas y/o permisos adecuados para cualquier otro servicio de AWS que planee utilizar.
Y finalmente, crea la función Lambda:
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
Y para invocar la función:
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
Esta biblioteca es completamente independiente del SDK de AWS C++. Debe tratar el SDK de AWS C++ como una dependencia más en su aplicación. Consulte la sección de ejemplos para ver una demostración que utiliza el SDK de AWS C++ con este tiempo de ejecución de Lambda.
Cualquier compilador C++11 totalmente compatible con GNU/Linux x86-64 debería funcionar. Evite las versiones del compilador que brindan soporte a medias para C++ 11.
Lambda ejecuta su código en alguna versión de Amazon Linux. Sería una experiencia menos que ideal para el cliente si se viera obligado a crear su aplicación en esa plataforma y solo en esa plataforma.
Sin embargo, la libertad de desarrollar cualquier distribución de Linux presenta un desafío. La biblioteca GNU C ABI. No hay garantía de que la plataforma utilizada para crear la función Lambda tenga la misma versión de GLIBC que la utilizada por AWS Lambda. De hecho, es posible que ni siquiera estés utilizando la implementación de GNU. Por ejemplo, podría crear una función Lambda de C++ utilizando musl libc.
Para garantizar que su aplicación se ejecute correctamente en Lambda, debemos empaquetar toda la biblioteca de tiempo de ejecución de C con su función. Si elige compilar en la misma versión de Amazon Linux utilizada por lambda, puede evitar empaquetar el tiempo de ejecución de C en su archivo zip. Esto se puede hacer pasando el indicador NO_LIBC
en CMake de la siguiente manera:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Cualquier dependencia de biblioteca que tenga su función Lambda y que se cargue dinámicamente a través de dlopen
NO se empaquetará automáticamente. Debe agregar esas dependencias manualmente al archivo zip. Esto se aplica a cualquier archivo de configuración o de recursos del que dependa su código.
Si realiza llamadas HTTP a través de TLS (https), tenga en cuenta que la ubicación del paquete de CA es diferente entre las distribuciones. Por ejemplo, si utiliza el SDK de AWS C++, es mejor configurar las siguientes opciones de configuración:
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
Si no está utilizando el SDK de AWS C++, pero sí usa libcurl directamente, puede configurar la ubicación del paquete de CA haciendo lo siguiente:
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
¿Por qué el archivo zip es tan grande? ¿Qué son todos esos archivos? Normalmente, el archivo zip es grande porque tenemos que empaquetar toda la biblioteca estándar de C. Puede reducir el tamaño haciendo algunas o todas las siguientes acciones:
-DCMAKE_BUILD_TYPE=Release
¿Cómo cargar un archivo zip de más de 50 MB a través de la CLI? Cargue su archivo zip en S3 primero:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
NOTA: debe usar la misma región para su depósito S3 que lambda.
Luego puedes crear la función Lambda de esta manera:
$ 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 "
Mi código falla, ¿cómo puedo depurarlo?
sudo apt install libdw-dev
o sudo apt install binutils-dev
sudo yum install elfutils-devel
o sudo yum install binutils-devel
Si tiene alguno de esos paquetes instalado, CMake los detectará y los vinculará automáticamente. No se requieren otros pasos.-DCMAKE_BUILD_TYPE=Debug
. Los registros detallados están habilitados de forma predeterminada en las compilaciones de depuración.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
El argumento security-opt
es necesario para ejecutar gdb
, strace
, etc.Problema de CURL con el certificado SSL CA
libcurl
creada con OpenSSL o una de sus versiones (BoringSSL, LibreSSL)libcurl
dónde encontrar el archivo del paquete CA. No se conoce ninguna conversión entre std::string
y Aws::String
-DBUILD_SHARED_LIBS=OFF
) Esta biblioteca tiene la licencia Apache 2.0.