2

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。ローカルでのみテストしたいので、これは避けたいと思います。

4

2 に答える 2