Я бы хотел попробовать пользовательскую среду C ++ для AWS Lambda и протестировать ее локально, используя SAM . К сожалению, я получаю ошибку Runtime exited without providing a reason
(сравните подробности ошибки ниже). Как я могу запускать лямбда-функции C ++ локально с SAM?
Подход:
Я выполняю точные шаги, описанные в Официальный C ++Вводный блог , вплоть до последнего шага «Создайте свою функцию C ++». Остальная часть блога посвящена развертыванию функции на Lambda (что я НЕ хочу делать, поскольку я хотел бы использовать SAM локально).
Чтобы использовать SAM, я помещаю template.yaml
в сборке реж. Структура 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
Invoke:
Я работаю sam local start-api --debug
в папке debug
. Я вызываю функцию, перейдя к 127.0.0.1:3000/hello
в chrome.
Ошибка:
Некоторые сведения из сообщения, получающегося в результате вызова 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
...
Моя система:
Я работаю на Ubuntu 16.04 с использованием cmake 3.5.1, g ++ 4.5.0, gcc 4.5.0
Идеи, как решить эту проблему:
Мне как-то нужно собрать пульт на машине, которая использует AWS Linux (надеюсь, что это не так)
Я мог бы использовать CloudFormationPackage как рекомендовано здесь stackoverflow . Я хотел бы избежать этого, так как я хотел бы тестировать только локально.