Système d'exploitation | Cambre | Statut |
---|---|---|
Amazon Linux 2 | x86_64 | |
Amazon Linux 2 | aarch64 | |
Amazon Linux (ALAMI) | x86_64 | |
Alpin | x86_64 | |
Arch Linux | x86_64 | |
Ubuntu 18.04 | x86_64 |
Implémentation C++ de l'API d'exécution lambda
Étant donné qu'AWS Lambda fonctionne sur GNU/Linux, vous devez également créer cette bibliothèque d'exécution et votre logique sur GNU/Linux.
Assurez-vous d'abord que les packages suivants sont installés :
Dans un terminal, exécutez les commandes suivantes :
$ 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
Pour utiliser cette bibliothèque dans un projet qui utilise également CMake, vous feriez :
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} )
Et voici à quoi ressemblerait un exemple 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 ;
}
Et enfin, voici comment regrouper le tout. Exécutez les commandes suivantes à partir du répertoire racine de votre application :
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
La dernière commande ci-dessus make aws-lambda-package-demo
créera un fichier zip appelé demo.zip
dans le répertoire actuel.
Maintenant, créez un rôle IAM et la fonction Lambda via l'AWS CLI.
Créez d’abord le fichier JSON de stratégie de confiance suivant
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
Créez ensuite le rôle IAM :
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
Notez le rôle qu'Arn vous a rendu après avoir exécuté cette commande. Nous en aurons besoin dans les prochaines étapes :
Attachez la stratégie suivante pour autoriser Lambda à écrire des journaux dans CloudWatch :
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Assurez-vous de joindre les politiques et/ou autorisations appropriées pour tout autre service AWS que vous prévoyez d'utiliser.
Et enfin, créez la fonction Lambda :
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
Et pour appeler la fonction :
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
Cette bibliothèque est totalement indépendante du SDK AWS C++. Vous devez traiter le SDK AWS C++ comme une simple dépendance supplémentaire dans votre application. Consultez la section Exemples pour une démonstration utilisant le kit SDK AWS C++ avec ce runtime Lambda.
Tout compilateur C++11 entièrement conforme ciblant GNU/Linux x86-64 devrait fonctionner. Veuillez éviter les versions de compilateur qui fournissent une prise en charge C++11 à moitié cuite.
Lambda exécute votre code sur certaines versions d'Amazon Linux. Ce serait une expérience client loin d’être idéale si vous étiez obligé de créer votre application sur cette plate-forme et uniquement sur cette plate-forme.
Cependant, la liberté de construire sur n'importe quelle distribution Linux pose un défi. L'ABI de la bibliothèque GNU C. Il n'y a aucune garantie que la plate-forme utilisée pour créer la fonction Lambda ait la même version GLIBC que celle utilisée par AWS Lambda. En fait, vous n'utilisez peut-être même pas l'implémentation de GNU. Par exemple, vous pouvez créer une fonction C++ Lambda en utilisant musl libc.
Pour garantir que votre application fonctionnera correctement sur Lambda, nous devons empaqueter l'intégralité de la bibliothèque d'exécution C avec votre fonction. Si vous choisissez de construire sur la même version d'Amazon Linux utilisée par lambda, vous pouvez éviter de conditionner le runtime C dans votre fichier zip. Cela peut être fait en passant l'indicateur NO_LIBC
dans CMake comme suit :
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Toute dépendance de bibliothèque de votre fonction Lambda qui est chargée dynamiquement via dlopen
ne sera PAS automatiquement empaquetée. Vous devez ajouter ces dépendances manuellement au fichier zip. Cela s’applique à tous les fichiers de configuration ou de ressources dont dépend votre code.
Si vous effectuez des appels HTTP via TLS (https), gardez à l'esprit que l'emplacement du bundle CA est différent selon les distributions. Par exemple, si vous utilisez le SDK AWS C++, il est préférable de définir les options de configuration suivantes :
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
Si vous n'utilisez pas le SDK AWS C++, mais que vous utilisez directement libcurl, vous pouvez définir l'emplacement du bundle CA en procédant :
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
Pourquoi le fichier zip est-il si volumineux ? c'est quoi tous ces fichiers ? En règle générale, le fichier zip est volumineux car nous devons empaqueter l’intégralité de la bibliothèque standard C. Vous pouvez réduire la taille en effectuant tout ou partie des opérations suivantes :
-DCMAKE_BUILD_TYPE=Release
Comment télécharger un fichier zip de plus de 50 Mo via la CLI ? Téléchargez d'abord votre fichier zip sur S3 :
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
REMARQUE : vous devez utiliser la même région pour votre compartiment S3 que le lambda.
Ensuite, vous pouvez créer la fonction Lambda de cette façon :
$ 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 "
Mon code plante, comment puis-je le déboguer ?
sudo apt install libdw-dev
ou sudo apt install binutils-dev
sudo yum install elfutils-devel
ou sudo yum install binutils-devel
Si l'un de ces packages est installé, CMake les détectera et se liera automatiquement à eux. Aucune autre étape n’est requise.-DCMAKE_BUILD_TYPE=Debug
. Les journaux détaillés sont activés par défaut dans les versions de débogage.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
L'argument security-opt
est nécessaire pour exécutez gdb
, strace
, etc.Problème CURL avec le certificat SSL CA
libcurl
construite avec OpenSSL, ou l'une de ses versions (BoringSSL, LibreSSL)libcurl
où trouver le fichier du bundle CA. Aucune conversion connue entre std::string
et Aws::String
-DBUILD_SHARED_LIBS=OFF
) Cette bibliothèque est sous licence Apache 2.0.