AWS Lambda のカスタム C++ ランタイムを試して、 SAMを使用してローカルでテストしたいと思います。残念ながら、エラーが発生しますRuntime exited without providing a reason
(以下のエラーの詳細を比較してください)。SAM を使用して C++ Lambda 関数をローカルで実行するにはどうすればよいですか?
アプローチ:
「C++ 関数の作成」の最後のステップまで、公式の C++ 紹介ブログに記載されている正確な手順に従っています。ブログの残りの部分は、関数を Lambda にデプロイすることについてです (SAM をローカルで使用したいので、これはやりたくありません)。
SAM を使用するためtemplate.yaml
に、ビルド ディレクトリに a を入れています。現在の構造は次のbuild dir
ようになります。
├── CMakeCache.txt
├── CMakeFiles
| |...
├── cmake_install.cmake
├── hello
├── hello.zip
├── Makefile
└── template.yaml
6 directories, 37 files
これはtemplate.yaml
、ビルド ディレクトリの内容です。
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: >
cpp hello world
Globals: # default settings across all resources if nothing else is specified
Function:
Timeout: 15
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello.zip # relative location or S3 key
Handler: hello # function to handle call? Why is this hello and not main?
Runtime: provided
Events:
HelloWorld: # the name of the event
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
Outputs:
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
呼び出す:
フォルダ内で実行sam local start-api --debug
していdebug
ます。127.0.0.1:3000/hello
クロムに移動して関数を呼び出しています。
エラー:
URL を呼び出した結果のメッセージの詳細:
...
Invoking hello (provided)
Decompressing /home/path/to/folder/test_cpp_local/aws-lambda-cpp/build/hello_cpp/build/hello.zip
Fetching lambci/lambda:provided Docker container image......
Mounting /tmp/tmpm9djt4mb as /var/task:ro,delegated inside runtime container
/var/task/bin/hello: error while loading shared libraries: /var/task/lib/libc.so.6: file too short
START RequestId: 3435a342-d86d-1a59-df1a-10167070cd22 Version: $LATEST
END RequestId: 3435a342-d86d-1a59-df1a-10167070cd22
REPORT RequestId: 3435a342-d86d-1a59-df1a-10167070cd22 Init Duration: 29.71 ms Duration: 0.00 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 6 MB
{
"errorType": "Runtime.ExitError",
"errorMessage": "RequestId: 3435a342-d86d-1a59-df1a-10167070cd22 Error: Runtime exited without providing a reason"
}
Function returned an invalid response (must include one of: body, headers, multiValueHeaders or statusCode in the response object
...
私のシステム:
cmake 3.5.1、g ++ 4.5.0、gcc 4.5.0を使用してUbuntu 16.04で構築しています
これを解決する方法のアイデア:
どういうわけか、AWS Linux を使用するマシンでリモートを構築する必要があります (そうでないことを願っています)。
ここで推奨されているようにCloudFormationPackageを使用できますstackoverflow。ローカルでのみテストしたいので、これは避けたいと思います。