操作系统 | 拱 | 地位 |
---|---|---|
亚马逊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++ 开发工具包与此 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 许可证获得许可。