운영체제 | 아치 | 상태 |
---|---|---|
아마존 리눅스 2 | x86_64 | |
아마존 리눅스 2 | 아치64 | |
아마존 리눅스(ALAMI) | x86_64 | |
알파인 | x86_64 | |
아치 리눅스 | x86_64 | |
우분투 18.04 | x86_64 |
람다 런타임 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를 애플리케이션의 또 다른 종속성으로 처리해야 합니다. 이 Lambda 런타임과 함께 AWS C++ SDK를 활용하는 데모는 예제 섹션을 참조하십시오.
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 버전에서 빌드하기로 선택한 경우 zip 파일에 C 런타임을 패키징하지 않아도 됩니다. 다음과 같이 CMake에 NO_LIBC
플래그를 전달하면 됩니다.
aws_lambda_package_target( ${PROJECT_NAME} NO_LIBC)
dlopen
통해 동적으로 로드되는 Lambda 함수의 모든 라이브러리 종속성은 자동으로 패키징되지 않습니다. 해당 종속성을 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 파일이 왜 그렇게 큰가요? 그 파일은 다 뭐예요? 일반적으로 전체 C 표준 라이브러리를 패키지해야 하기 때문에 zip 파일의 크기가 큽니다. 다음 중 일부 또는 전부를 수행하여 크기를 줄일 수 있습니다.
-DCMAKE_BUILD_TYPE=Release
CLI를 통해 50MB보다 큰 zip 파일을 업로드하는 방법은 무엇입니까? 먼저 zip 파일을 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
등을 실행합니다.SSL CA 인증서의 CURL 문제
libcurl
버전 또는 해당 버전(BoringSSL, LibreSSL) 중 하나를 사용하고 있는지 확인하세요.libcurl
알려주세요. std::string
과 Aws::String
사이의 알려진 변환은 없습니다.
-DBUILD_SHARED_LIBS=OFF
)로 빌드하세요. 이 라이브러리는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다.