作業系統 | 拱 | 地位 |
---|---|---|
亞馬遜Linux 2 | x86_64 | |
亞馬遜Linux 2 | 架構64 | |
亞馬遜 Linux (ALAMI) | x86_64 | |
阿爾卑斯山 | x86_64 | |
架構Linux | x86_64 | |
烏班圖18.04 | x86_64 |
lambda 運行時 API 的 C++ 實現
由於 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
的 zip 檔。
現在,透過 AWS CLI 建立 IAM 角色和 Lambda 函數。
首先建立以下信任策略 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 執行時間結合使用的示範。
任何針對 GNU/Linux x86-64 的完全相容的 C++11 編譯器都應該可以運作。請避免提供不成熟的 C++11 支援的編譯器版本。
Lambda 在某些版本的 Amazon Linux 上執行您的程式碼。如果您被迫在該平台上且僅在該平台上建立應用程序,那麼客戶體驗將不太理想。
然而,在任何 Linux 發行版上建構的自由都會帶來挑戰。 GNU C 庫 ABI。無法保證用於建立 Lambda 函數的平台與 AWS Lambda 使用的 GLIBC 版本相同。事實上,您甚至可能沒有使用 GNU 的實作。例如,您可以使用 musl libc 建立 C++ Lambda 函數。
為了確保您的應用程式能夠在 Lambda 上正確運行,我們必須將整個 C 運行時庫與您的函數打包在一起。如果您選擇在 lambda 使用的相同 Amazon Linux 版本上進行構建,則可以避免將 C 運行時打包在 zip 檔案中。這可以透過在 CMake 中傳遞NO_LIBC
標誌來完成,如下所示:
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
Lambda 函數具有的任何透過dlopen
動態載入的函式庫相依性都不會自動打包。您必須手動將這些依賴項新增至 zip 檔案。這適用於您的程式碼所依賴的任何配置或資源檔案。
如果您透過 TLS (https) 進行 HTTP 調用,請記住,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" );
為什麼 zip 檔案這麼大?這些文件是什麼?通常,zip 檔案很大,因為我們必須打包整個 C 標準函式庫。您可以透過執行以下部分或全部操作來減少大小:
-DCMAKE_BUILD_TYPE=Release
如何透過 CLI 上傳大於 50MB 的 zip 檔案?首先將您的 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
。預設情況下,在偵錯版本中啟用詳細日誌。-DLOG_VERBOSITY=3
建置執行階段$ docker run -v /tmp:/tmp -it --security-opt seccomp=unconfined amazonlinux:2017.03
security-opt
參數對於執行gdb
、 strace
等。SSL CA 憑證的 CURL 問題
libcurl
版本libcurl
在哪裡可以找到 CA 捆綁檔。 std::string
和Aws::String
之間沒有已知的轉換
-DBUILD_SHARED_LIBS=OFF
) 該庫根據 Apache 2.0 許可證獲得許可。