sistem operasi | Lengkungan | Status |
---|---|---|
Amazon Linux 2 | x86_64 | |
Amazon Linux 2 | aarch64 | |
Amazon Linux (ALAMI) | x86_64 | |
Alpen | x86_64 | |
Lengkungan Linux | x86_64 | |
Ubuntu 18.04 | x86_64 |
Implementasi C++ dari API runtime lambda
Karena AWS Lambda berjalan di GNU/Linux, Anda juga harus membangun perpustakaan runtime ini dan logika Anda di GNU/Linux.
Pastikan Anda telah menginstal paket-paket berikut terlebih dahulu:
Di terminal, jalankan perintah berikut:
$ 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
Untuk menggunakan perpustakaan ini dalam proyek yang juga menggunakan CMake, Anda harus melakukan:
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} )
Dan berikut adalah tampilan contoh 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 ;
}
Dan terakhir, inilah cara Anda mengemas semuanya. Jalankan perintah berikut dari direktori root aplikasi Anda:
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
Perintah terakhir di atas make aws-lambda-package-demo
akan membuat file zip bernama demo.zip
di direktori saat ini.
Sekarang, buat IAM role dan fungsi Lambda melalui AWS CLI.
Pertama buat file JSON kebijakan kepercayaan berikut
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
Kemudian buat peran IAM:
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
Catat peran yang dikembalikan Arn kepada Anda setelah menjalankan perintah itu. Kami akan membutuhkannya pada langkah selanjutnya:
Lampirkan kebijakan berikut untuk mengizinkan Lambda menulis log di CloudWatch:
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Pastikan Anda melampirkan kebijakan dan/atau izin yang sesuai untuk layanan AWS lainnya yang ingin Anda gunakan.
Dan terakhir, buat fungsi Lambda:
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
Dan untuk menjalankan fungsinya:
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
Pustaka ini sepenuhnya independen dari AWS C++ SDK. Anda harus memperlakukan AWS C++ SDK hanya sebagai ketergantungan lain dalam aplikasi Anda. Lihat bagian contoh untuk demo menggunakan AWS C++ SDK dengan runtime Lambda ini.
Kompiler C++11 apa pun yang sepenuhnya kompatibel dan menargetkan GNU/Linux x86-64 akan berfungsi. Harap hindari versi kompiler yang menyediakan dukungan C++11 setengah matang.
Lambda menjalankan kode Anda pada beberapa versi Amazon Linux. Ini akan menjadi pengalaman pelanggan yang kurang ideal jika Anda dipaksa untuk membangun aplikasi Anda pada platform itu dan platform itu saja.
Namun, kebebasan untuk membangun distro linux apa pun membawa tantangan. Perpustakaan GNU C ABI. Tidak ada jaminan platform yang digunakan untuk membangun fungsi Lambda memiliki versi GLIBC yang sama dengan yang digunakan oleh AWS Lambda. Faktanya, Anda mungkin tidak menggunakan implementasi GNU. Misalnya Anda dapat membangun fungsi C++ Lambda menggunakan musl libc.
Untuk memastikan bahwa aplikasi Anda akan berjalan dengan benar di Lambda, kami harus mengemas seluruh pustaka runtime C dengan fungsi Anda. Jika Anda memilih untuk membangun versi Amazon Linux yang sama dengan yang digunakan oleh lambda, Anda dapat menghindari pengemasan runtime C dalam file zip Anda. Hal ini dapat dilakukan dengan meneruskan flag NO_LIBC
di CMake sebagai berikut:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Ketergantungan perpustakaan apa pun yang dimiliki fungsi Lambda Anda yang dimuat secara dinamis melalui dlopen
TIDAK akan dikemas secara otomatis. Anda harus menambahkan dependensi tersebut secara manual ke file zip. Ini berlaku untuk semua file konfigurasi atau sumber daya yang bergantung pada kode Anda.
Jika Anda melakukan panggilan HTTP melalui TLS (https), perlu diingat bahwa lokasi bundel CA berbeda antar distro. Misalnya, jika Anda menggunakan AWS C++ SDK, yang terbaik adalah mengatur opsi konfigurasi berikut:
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
Jika Anda tidak menggunakan AWS C++ SDK, namun kebetulan menggunakan libcurl secara langsung, Anda dapat mengatur lokasi bundel CA dengan melakukan:
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
Mengapa file zipnya sangat besar? apa semua file itu? Biasanya, file zip berukuran besar karena kita harus mengemas seluruh pustaka standar C. Anda dapat memperkecil ukurannya dengan melakukan beberapa atau semua hal berikut:
-DCMAKE_BUILD_TYPE=Release
Bagaimana cara mengunggah file zip yang lebih besar dari 50MB melalui CLI? Unggah file zip Anda ke S3 terlebih dahulu:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
CATATAN: Anda harus menggunakan wilayah yang sama untuk bucket S3 Anda dengan lambda.
Kemudian Anda dapat membuat fungsi Lambda dengan cara ini:
$ 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 "
Kode saya mogok, bagaimana cara men-debugnya?
sudo apt install libdw-dev
atau sudo apt install binutils-dev
sudo yum install elfutils-devel
atau sudo yum install binutils-devel
Jika Anda menginstal salah satu paket tersebut, CMake akan mendeteksinya dan secara otomatis menautkannya. Tidak ada langkah lain yang diperlukan.-DCMAKE_BUILD_TYPE=Debug
. Log verbose diaktifkan secara default di build Debug.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
Argumen security-opt
diperlukan untuk jalankan gdb
, strace
, dll.Masalah CURL dengan sertifikat SSL CA
libcurl
yang dibuat dengan OpenSSL, atau salah satu variannya (BoringSSL, LibreSSL)libcurl
di mana menemukan file bundel CA. Tidak ada konversi yang diketahui antara std::string
dan Aws::String
-DBUILD_SHARED_LIBS=OFF
) Perpustakaan ini dilisensikan di bawah Lisensi Apache 2.0.