Betriebssystem | Bogen | Status |
---|---|---|
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 |
C++-Implementierung der Lambda-Laufzeit-API
Da AWS Lambda unter GNU/Linux läuft, sollten Sie diese Laufzeitbibliothek und Ihre Logik auch unter GNU/Linux erstellen.
Stellen Sie sicher, dass Sie zuerst die folgenden Pakete installiert haben:
Führen Sie in einem Terminal die folgenden Befehle aus:
$ 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
Um diese Bibliothek in einem Projekt zu nutzen, das auch CMake verwendet, würden Sie Folgendes tun:
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} )
Und so würde ein Beispiel für main.cpp
aussehen:
# 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 ;
}
Und schließlich erfahren Sie hier, wie Sie alles verpacken würden. Führen Sie die folgenden Befehle im Stammverzeichnis Ihrer Anwendung aus:
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
Der letzte Befehl oben make aws-lambda-package-demo
erstellt eine ZIP-Datei mit dem Namen demo.zip
im aktuellen Verzeichnis.
Erstellen Sie nun über die AWS CLI eine IAM-Rolle und die Lambda-Funktion.
Erstellen Sie zunächst die folgende JSON-Datei für die Vertrauensrichtlinie
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
Erstellen Sie dann die IAM-Rolle:
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
Notieren Sie sich die Rolle, die Arn Ihnen nach der Ausführung dieses Befehls zurückgegeben hat. Wir werden es in den nächsten Schritten benötigen:
Hängen Sie die folgende Richtlinie an, damit Lambda Protokolle in CloudWatch schreiben kann:
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Stellen Sie sicher, dass Sie die entsprechenden Richtlinien und/oder Berechtigungen für alle anderen AWS-Dienste anhängen, die Sie verwenden möchten.
Und schließlich erstellen Sie die Lambda-Funktion:
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
Und um die Funktion aufzurufen:
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
Diese Bibliothek ist völlig unabhängig vom AWS C++ SDK. Sie sollten das AWS C++ SDK einfach als eine weitere Abhängigkeit in Ihrer Anwendung behandeln. Im Abschnitt „Beispiele“ finden Sie eine Demo zur Verwendung des AWS C++ SDK mit dieser Lambda-Laufzeitumgebung.
Jeder vollständig kompatible C++11-Compiler, der auf GNU/Linux x86-64 abzielt, sollte funktionieren. Bitte vermeiden Sie Compilerversionen, die halbherzige C++11-Unterstützung bieten.
Lambda führt Ihren Code auf einer Version von Amazon Linux aus. Es wäre kein ideales Kundenerlebnis, wenn Sie gezwungen wären, Ihre Anwendung nur auf dieser Plattform zu erstellen.
Allerdings bringt die Freiheit, auf jeder Linux-Distribution aufzubauen, eine Herausforderung mit sich. Die GNU C-Bibliothek ABI. Es gibt keine Garantie dafür, dass die zum Erstellen der Lambda-Funktion verwendete Plattform dieselbe GLIBC-Version hat wie die von AWS Lambda verwendete. Tatsächlich verwenden Sie möglicherweise nicht einmal die GNU-Implementierung. Sie könnten beispielsweise eine C++-Lambda-Funktion mit musl libc erstellen.
Um sicherzustellen, dass Ihre Anwendung ordnungsgemäß auf Lambda ausgeführt wird, müssen wir die gesamte C-Laufzeitbibliothek mit Ihrer Funktion packen. Wenn Sie sich dafür entscheiden, auf derselben Amazon Linux-Version zu bauen, die auch von Lambda verwendet wird, können Sie das Packen der C-Laufzeitumgebung in Ihrer ZIP-Datei vermeiden. Dies kann durch die Übergabe des NO_LIBC
-Flags in CMake wie folgt erfolgen:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Jede Bibliotheksabhängigkeit Ihrer Lambda-Funktion, die dynamisch über dlopen
geladen wird, wird NICHT automatisch gepackt. Sie müssen diese Abhängigkeiten manuell zur ZIP-Datei hinzufügen. Dies gilt für alle Konfigurations- oder Ressourcendateien, von denen Ihr Code abhängt.
Wenn Sie HTTP-Aufrufe über TLS (https) tätigen, beachten Sie, dass der Speicherort des CA-Bundles je nach Distribution unterschiedlich ist. Wenn Sie beispielsweise das AWS C++ SDK verwenden, ist es am besten, die folgenden Konfigurationsoptionen festzulegen:
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
Wenn Sie nicht das AWS C++ SDK, sondern libcurl direkt verwenden, können Sie den CA-Bundle-Speicherort wie folgt festlegen:
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
Warum ist die Zip-Datei so groß? Was sind das für Dateien? Normalerweise ist die ZIP-Datei groß, da wir die gesamte C-Standardbibliothek packen müssen. Sie können die Größe reduzieren, indem Sie einige oder alle der folgenden Schritte ausführen:
-DCMAKE_BUILD_TYPE=Release
Wie lade ich über die CLI eine ZIP-Datei hoch, die größer als 50 MB ist? Laden Sie zuerst Ihre ZIP-Datei in S3 hoch:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
HINWEIS: Sie müssen für Ihren S3-Bucket dieselbe Region wie das Lambda verwenden.
Dann können Sie die Lambda-Funktion folgendermaßen erstellen:
$ 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 "
Mein Code stürzt ab. Wie kann ich ihn debuggen?
sudo apt install libdw-dev
oder sudo apt install binutils-dev
sudo yum install elfutils-devel
oder sudo yum install binutils-devel
Wenn Sie eines dieser Pakete installiert haben, erkennt CMake sie und verknüpft sie automatisch. Es sind keine weiteren Schritte erforderlich.-DCMAKE_BUILD_TYPE=Debug
. Ausführliche Protokolle sind in Debug-Builds standardmäßig aktiviert.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
Das Argument security-opt
ist erforderlich Führen Sie gdb
, strace
usw. aus.CURL-Problem mit dem SSL-CA-Zertifikat
libcurl
-Version oder eine seiner Varianten (BoringSSL, LibreSSL) verwenden.libcurl
mitteilen, wo sich die CA-Bundle-Datei befindet. Keine bekannte Konvertierung zwischen std::string
und Aws::String
-DBUILD_SHARED_LIBS=OFF
). Diese Bibliothek ist unter der Apache 2.0-Lizenz lizenziert.