How can I test AWS Lambda functions locally?

2020-06-02 17:19发布

Explain to me please what is the best way to locally test the lambda function. I used sam local and this solution https://github.com/lambci/docker-lambda for testing, but for example, where I invoke one lambda from another error occurs. In general, I can't make stubs for methods since lambda runs in a container

3条回答
Fickle 薄情
2楼-- · 2020-06-02 17:21

This is how I test local lambda functions without Serverless frameworks, I run an HTTP post on local (quite easy setup for Go)

  • decouple lambda logic like so:
func HandleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    _, _ = pretty.Println("parsed:", request.Body)
    return events.APIGatewayProxyResponse{Body: "response is working", StatusCode: 200}, nil
}
  • main function then checks if it is a local instance then run local post endpoint, else start lambda
func main() {
    environment := loadEnv()
    if environment == "develop" {
        router.NewRouter()
        select {}
    } else {
        lambda.Start(lambdahandler.HandleRequest)
    }
}
  • in between you have an Adapter Pattern that converts your http request to whatever your lambda function accepts, for example:
func MapToApiGateway(w http.ResponseWriter, r *http.Request) (interface{}, error) {
    request := new(EmailResponderRequest)
    if err := json.NewDecoder(r.Body).Decode(request); err != nil {
        return err.Error(), err
    }
    apiGatewayRequest := mapHttpRequestToGatewayRequest(*request)
    events, err := lambdahandler.HandleRequest(nil, apiGatewayRequest)
    if err != nil {
        return err.Error(), err
    }
    return events, nil
}
查看更多
欢心
3楼-- · 2020-06-02 17:36

For local manual testing (not unit testing) with sam cli you can specify the environment varilables file with the -n, --env-vars PATHoption and use your real resource identifiers like you would normally do within your Cloud Formation template (refer to the official documentation for more informations).

This should let you invoke other functions directly and use a real DynamoDB table and all other AWS Cloud resources.

Note: if you use VSCode you can try this helper extension.

查看更多
成全新的幸福
4楼-- · 2020-06-02 17:43

There are a couple of options. Following two are some popular ones.

查看更多
登录 后发表回答