如何在本地测试AWS Lambda函数?

时间:2018-04-30 11:06:38

标签: amazon-web-services testing aws-lambda

请向我解释一下本地测试lambda函数的最佳方法是什么。我使用sam local和此解决方案https://github.com/lambci/docker-lambda进行测试,但是例如,我从另一个错误中调用一个lambda。一般来说,我不能为方法创建存根,因为lambda在容器中运行

3 个答案:

答案 0 :(得分:5)

有几种选择。以下两个是一些受欢迎的。

答案 1 :(得分:2)

对于使用sam cli进行本地手动测试(而非单元测试),您可以使用-n, --env-vars PATH选项指定环境变量文件,并像通常在Cloud Formation模板中那样使用真实的资源标识符(有关更多信息,请参见official documentation

这应该使您可以直接调用其他功能,并使用真实的DynamoDB表和所有其他AWS Cloud资源。

注意:如果您使用VSCode,则可以尝试this helper extension

答案 2 :(得分:0)

这是我在没有Serverless框架的情况下测试本地lambda函数的方法,我在本地运行HTTP帖子(Go的设置非常简单)

  • 像这样解耦lambda逻辑:
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
}
  • 主要功能然后检查它是否是本地实例,然后运行本地发布端点,否则启动lambda
func main() {
    environment := loadEnv()
    if environment == "develop" {
        router.NewRouter()
        select {}
    } else {
        lambda.Start(lambdahandler.HandleRequest)
    }
}
  • 之间有一个Adapter Pattern,它可以将http请求转换为lambda函数接受的任何内容,例如:
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
}