如何在本地测试 aws lambda 函数

Posted

技术标签:

【中文标题】如何在本地测试 aws lambda 函数【英文标题】:How to test aws lambda functions locally 【发布时间】:2016-02-26 09:09:05 【问题描述】:

我有一个使用 node.js express 开发的移动应用程序后端。我尝试将其部署为 lambda 服务。为此,我创建了一个无服务器框架项目 (https://github.com/serverless)。以前我通过启动快速后端应用程序在本地测试移动应用程序。现在我找不到在没有本地后端的情况下在本地测试我的移动应用程序的方法。 jaws run 命令仅在我调用它时运行。

是否有任何方法可以将 lambda 函数作为 Web 服务启动?或者有没有 Serverless Framework 的替代方案?

【问题讨论】:

【参考方案1】:

目前看来没有办法做到这一点,但版本 1.4.0 即将发布,除其他外,它应该包括一个新命令“jaws serve”,它应该可以解决您的问题。

这是公关:https://github.com/jaws-framework/JAWS/pull/269

更新:您现在可以为此使用新的 serverless-serve 插件。

更新 2:serverless-serve 有一段时间没有更新了,看起来 serverless-offline 现在是模拟 Lambda 函数的更好选择。

【讨论】:

谢谢,无服务器不仅可以用于离线测试,还可以帮助部署和其他很多东西。【参考方案2】:

由于 1.4 尚未发布...

上周我需要完全相同的东西。因此,我创建了一个可以在本地运行的小型模拟服务器: https://github.com/martinlindenberg/JawsLocalServer

所有标头和参数都被复制到传递给处理程序的事件对象中。 上下文对象是一个将数据转发给响应对象的简单对象

【讨论】:

【参考方案3】:

我不确定这个问题是否仍然相关,但我正在使用 DEEP Framework 在本地测试代码和/或将其部署在 AWS Lambda 上。看看这个:

npm install deepify -g

deepify run-lambda --help

  run-lambda@1.6.8 - Run Lambda function locally 

  Usage example: deepify run-lambda path/to/the/lambda -e='"Name":"John Doe"' 

  Arguments:  
    path: The path to the Lambda (directory of handler itself) 

  Options:  
    --event|-e: JSON string used as the Lambda payload 
    --skip-frontend-build|-f: Skip picking up _build path from the microservices Frontend 
    --db-server|-l: Local DynamoDB server implementation (ex. LocalDynamo, Dynalite) 
    --version|-v: Prints command version 
    --help|-h: Prints command help 

披露:我是这个框架的贡献者之一

【讨论】:

无法让它工作:/在“启动 lambda”之后挂起。【参考方案4】:

截至本文发布之日,您可以通过 sls function run [name-of-function] 在本地运行函数。您函数的 event.json 中使用的任何 json 都将被传递到您的函数中。

为了测试您的端点,您还可以使用Serverless Offline,它是serverless-serve 项目的一个分支。

【讨论】:

【参考方案5】:

Bespoken sevrerless plugin 使您的本地 Lambda 可以从外部访问。它对于使用 Postman 进行本地测试以及基于 Webhook 的服务(如 Alexa、Slack、Twilio 等)都非常有用。

架构如下所示:

要使用它,你只需安装插件,然后运行:

sls proxy

然后您可以开始在本地向您的服务发送请求:

我们认为它是一个非常有用的无服务器测试工具。

【讨论】:

【参考方案6】:

这可能为时已晚.. 但现在你可以试试 Serverless-Offline (https://www.npmjs.com/package/serverless-offline) 就像一个魅力

这也是它的 github 页面 (https://github.com/dherault/serverless-offline)

【讨论】:

这就是我要找的。谢谢!【参考方案7】:

您现在可以使用lambda-local。

这样安装:

sudo -H npm install -g lambda-local

将您的参数作为 JSON 对象添加到文件中,在本例中为 event.json,并像这样调用 index.js 文件:

lambda-local -l index.js -h handler -e event.json

【讨论】:

不支持一切,但至少很轻【参考方案8】:

The serverless framework now provide a way to invoke functions locally

这样,您可以在 json 文件中创建查询,例如


  "body": "\"hello\":\"world\"",
  "pathParameters": 
    "id": "foo"
  ,
  "queryStringParameters": 
    "bar": "42"
  
  "requestContext": 
    "identity": 
      "cognitoIdentityId": "cognito-id"
    
  

如果您的函数在 serverless.yml 文件中描述,则可以在本地调用它

serverless invoke local --function yourFunction --path path/to/your/mock.json

【讨论】:

【参考方案9】:

Python

一个例子lambda_function.py

def lambda_handler(*args, **kwargs):
    return 'hello'

本地 lambda 函数的调用示例:

pip install python-lambda-local
echo '' >> event.json
python-lambda-local -t 15 -f lambda_handler lambda_function.py event.json

【讨论】:

以上是关于如何在本地测试 aws lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的Lambda函数与在本地计算机上运行的服务器通信?

如何使用AWS Lambda函数在本地系统上执行文件

如何在本地计算机上模拟 AWS Parameter Store 以进行 lambda 函数开发?

如何在 CloudFormation 模板中描述 AWS Lambda 函数测试事件?

如何将事件信息从 aws API Gateway get 传递给 Lambda?

如何在 AWS lambda 中部署 selenium 测试套件