ระบบปฏิบัติการ | โค้ง | สถานะ |
---|---|---|
อเมซอน ลินุกซ์ 2 | x86_64 | |
อเมซอน ลินุกซ์ 2 | อาร์ค64 | |
อเมซอน ลินุกซ์ (ALAMI) | x86_64 | |
อัลไพน์ | x86_64 | |
อาร์ค ลินุกซ์ | x86_64 | |
อูบุนตู 18.04 | x86_64 |
การใช้งาน C ++ ของ lambda runtime API
เนื่องจาก 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
จะสร้างไฟล์ zip ชื่อ 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 แบบ half-baked
Lambda รันโค้ดของคุณบน Amazon Linux บางเวอร์ชัน มันจะเป็นประสบการณ์ที่ไม่ดีนักหากคุณถูกบังคับให้สร้างแอปพลิเคชันของคุณบนแพลตฟอร์มนั้นและแพลตฟอร์มนั้นเท่านั้น
อย่างไรก็ตาม อิสระในการสร้างบน linux distro นำมาซึ่งความท้าทาย ABI ไลบรารี GNU C ไม่มีการรับประกันว่าแพลตฟอร์มที่ใช้สร้างฟังก์ชัน Lambda จะมีเวอร์ชัน GLIBC เหมือนกับเวอร์ชันที่ใช้โดย AWS Lambda ที่จริงแล้ว คุณอาจไม่ได้ใช้การติดตั้ง GNU ด้วยซ้ำ ตัวอย่างเช่น คุณสามารถสร้างฟังก์ชัน C++ Lambda โดยใช้ musl libc
เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณจะทำงานอย่างถูกต้องบน Lambda เราต้องจัดทำแพ็กเกจรันไทม์ไลบรารี C ทั้งหมดด้วยฟังก์ชันของคุณ หากคุณเลือกที่จะสร้างบน Amazon Linux เวอร์ชันเดียวกับที่ lambda ใช้ คุณสามารถหลีกเลี่ยงการรวมรันไทม์ C ไว้ในไฟล์ zip ของคุณได้ ซึ่งสามารถทำได้โดยการส่งแฟล็ก NO_LIBC
ใน CMake ดังนี้:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
การพึ่งพาไลบรารีใดๆ ที่ฟังก์ชัน Lambda ของคุณมีซึ่งโหลดแบบไดนามิกผ่าน dlopen
จะไม่ถูกจัดทำแพ็กเกจโดยอัตโนมัติ คุณ ต้อง เพิ่มการอ้างอิงเหล่านั้นลงในไฟล์ zip ด้วยตนเอง สิ่งนี้ใช้กับไฟล์การกำหนดค่าหรือทรัพยากรใด ๆ ที่โค้ดของคุณใช้อยู่
หากคุณกำลังทำการเรียก HTTP ผ่าน TLS (https) โปรดทราบว่าตำแหน่งของบันเดิล CA นั้นแตกต่างกันระหว่าง distros ตัวอย่างเช่น หากคุณใช้ 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" );
ทำไมไฟล์ zip ถึงใหญ่มาก? ไฟล์ทั้งหมดพวกนั้นคืออะไร? โดยทั่วไปแล้ว ไฟล์ zip จะมีขนาดใหญ่เนื่องจากเราต้องจัดทำแพ็กเกจไลบรารีมาตรฐาน C ทั้งหมด คุณสามารถลดขนาดได้โดยทำบางส่วนหรือทั้งหมดต่อไปนี้:
-DCMAKE_BUILD_TYPE=Release
จะอัพโหลดไฟล์ zip ที่ใหญ่กว่า 50MB ผ่าน CLI ได้อย่างไร อัปโหลดไฟล์ zip ของคุณไปที่ S3 ก่อน:
$ aws s3 cp demo.zip s3://mys3bucket/demo.zip
หมายเหตุ: คุณต้องใช้ขอบเขตเดียวกันสำหรับบัคเก็ต S3 ของคุณเป็น lambda
จากนั้น คุณสามารถสร้างฟังก์ชัน 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
บันทึกแบบละเอียดจะเปิดใช้งานตามค่าเริ่มต้นในรุ่น 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 License