نظام التشغيل | قوس | حالة |
---|---|---|
أمازون لينكس 2 | x86_64 | |
أمازون لينكس 2 | aarch64 | |
أمازون لينكس (عالمي) | x86_64 | |
جبال الألب | x86_64 | |
آرتش لينكس | x86_64 | |
أوبونتو 18.04 | x86_64 |
تنفيذ C++ لواجهة برمجة تطبيقات وقت التشغيل lambda
نظرًا لأن AWS Lambda يعمل على GNU/Linux، فيجب عليك إنشاء مكتبة وقت التشغيل هذه والمنطق الخاص بك على GNU/Linux أيضًا.
تأكد من تثبيت الحزم التالية أولاً:
في المحطة، قم بتشغيل الأوامر التالية:
$ 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
لاستهلاك هذه المكتبة في مشروع يستخدم أيضًا CMake، عليك القيام بما يلي:
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} )
وإليك كيف ستبدو عينة 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 ;
}
وأخيرًا، إليك كيفية تجميع كل شيء. قم بتشغيل الأوامر التالية من الدليل الجذر لتطبيقك:
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= ~ /lambda-install
$ make
$ make aws-lambda-package-demo
الأمر الأخير أعلاه make aws-lambda-package-demo
سينشئ ملفًا مضغوطًا يسمى demo.zip
في الدليل الحالي.
الآن، قم بإنشاء دور IAM ووظيفة Lambda عبر AWS CLI.
قم أولاً بإنشاء ملف JSON لسياسة الثقة التالي
$ cat trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": "sts:AssumeRole"
}
]
}
ثم قم بإنشاء دور IAM:
$ aws iam create-role --role-name lambda-demo --assume-role-policy-document file://trust-policy.json
قم بتدوين الدور الذي أعاده Arn إليك بعد تشغيل هذا الأمر. سنحتاجها في الخطوات التالية:
قم بإرفاق السياسة التالية للسماح لـ Lambda بكتابة السجلات في CloudWatch:
$ aws iam attach-role-policy --role-name lambda-demo --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
تأكد من إرفاق السياسات و/أو الأذونات المناسبة لأي خدمات AWS أخرى تخطط لاستخدامها.
وأخيرًا، قم بإنشاء وظيفة Lambda:
$ aws lambda create-function --function-name demo
--role
--runtime provided --timeout 15 --memory-size 128
--handler demo --zip-file fileb://demo.zip
و لاستدعاء الدالة :
$ aws lambda invoke --function-name demo --payload ' {"answer":42} ' output.txt
هذه المكتبة مستقلة تمامًا عن AWS C++ SDK. يجب عليك التعامل مع AWS C++ SDK على أنها مجرد تبعية أخرى في تطبيقك. راجع قسم الأمثلة للحصول على عرض توضيحي باستخدام AWS C++ SDK مع وقت تشغيل Lambda هذا.
يجب أن يعمل أي مترجم C++ 11 متوافق تمامًا ويستهدف GNU/Linux x86-64. يرجى تجنب إصدارات المترجم التي توفر دعم C++ 11 غير مكتمل.
يقوم Lambda بتشغيل التعليمات البرمجية الخاصة بك على بعض إصدارات Amazon Linux. ستكون تجربة العملاء أقل من مثالية إذا اضطررت إلى إنشاء تطبيقك على هذا النظام الأساسي وتلك المنصة فقط.
ومع ذلك، فإن حرية البناء على أي توزيعة لينكس تمثل تحديًا. مكتبة GNU C ABI. ليس هناك ما يضمن أن النظام الأساسي المستخدم لإنشاء وظيفة Lambda له نفس إصدار GLIBC الذي تستخدمه AWS Lambda. في الواقع، ربما لا تستخدم تطبيق GNU. على سبيل المثال، يمكنك إنشاء دالة Lambda C++ باستخدام musl libc.
للتأكد من أن تطبيقك سيعمل بشكل صحيح على Lambda، يجب أن نحزم مكتبة وقت تشغيل C بالكامل مع وظيفتك. إذا اخترت البناء على نفس إصدار Amazon Linux الذي تستخدمه lambda، فيمكنك تجنب تعبئة وقت تشغيل C في ملف مضغوط. يمكن القيام بذلك عن طريق تمرير علامة NO_LIBC
في CMake كما يلي:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
لن يتم تجميع أي تبعية مكتبة لوظيفة Lambda الخاصة بك والتي يتم تحميلها ديناميكيًا عبر dlopen
تلقائيًا. يجب عليك إضافة هذه التبعيات يدويًا إلى الملف المضغوط. ينطبق هذا على أي ملفات تكوين أو موارد يعتمد عليها الكود الخاص بك.
إذا كنت تجري مكالمات HTTP عبر TLS (https)، فضع في اعتبارك أن موقع حزمة CA يختلف بين التوزيعات. على سبيل المثال، إذا كنت تستخدم AWS C++ SDK، فمن الأفضل تعيين خيارات التكوين التالية:
Aws::Client::ClientConfiguration config;
config.caFile = " /etc/pki/tls/certs/ca-bundle.crt " ;
إذا كنت لا تستخدم AWS C++ SDK، ولكنك تستخدم libcurl مباشرة، فيمكنك تعيين موقع حزمة CA عن طريق القيام بما يلي:
curl_easy_setopt ( curl_handle , CURLOPT_CAINFO , "/etc/pki/tls/certs/ca-bundle.crt" );
لماذا الملف المضغوط كبير جدًا؟ ما هي كل تلك الملفات؟ عادةً ما يكون الملف المضغوط كبيرًا لأنه يتعين علينا حزم مكتبة C القياسية بأكملها. يمكنك تقليل الحجم عن طريق القيام ببعض أو كل ما يلي:
-DCMAKE_BUILD_TYPE=Release
كيف يمكن تحميل ملف مضغوط أكبر من 50 ميجابايت عبر واجهة سطر الأوامر (CLI)؟ قم بتحميل ملفك المضغوط إلى S3 أولاً:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
ملاحظة: يجب عليك استخدام نفس المنطقة لحاوية S3 الخاصة بك مثل لامدا.
ثم يمكنك إنشاء وظيفة Lambda بهذه الطريقة:
$ 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 "
الكود الخاص بي يتعطل، كيف يمكنني تصحيحه؟
sudo apt install libdw-dev
أو sudo apt install binutils-dev
sudo yum install elfutils-devel
أو sudo yum install binutils-devel
إذا كان لديك أي من هذه الحزم مثبتة، فسوف يكتشفها CMake ويرتبط بها تلقائيًا. لا توجد خطوات أخرى مطلوبة.-DCMAKE_BUILD_TYPE=Debug
. يتم تمكين السجلات المطولة بشكل افتراضي في إصدارات التصحيح.-DLOG_VERBOSITY=3
$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
تعد وسيطة security-opt
ضرورية قم بتشغيل gdb
و strace
وما إلى ذلك.مشكلة CURL في شهادة SSL CA
libcurl
المبني باستخدام OpenSSL، أو أحد إصداراته (BoringSSL، LibreSSL)libcurl
بمكان العثور على ملف حزمة CA. لا يوجد تحويل معروف بين std::string
و Aws::String
-DBUILD_SHARED_LIBS=OFF
) هذه المكتبة مرخصة بموجب ترخيص Apache 2.0.