如何调试在节点js中编写的aws lambda函数

Ste*_*eve 9 debugging amazon-web-services node.js aws-lambda

我们几个月来一直在Node JS中开发AWS Lambda函数.我们可以调试,即在Visual Studio中使用.Net C#代码逐步执行Node JS代码吗?

小智 6

对于许多Lambda函数,默认情况下不提供基于IDE的开发工具.有一些插件,例如AWS在其博客上引入的Visual Studio支持,网址https://aws.amazon.com/blogs/developer/aws-lambda-support-in-visual-studio/,但这些插件会有所不同功能集和支持级别.

为了使用步骤调试来测试Lambda,您需要关注两个域 - 运行它的硬件以及调用Lambda函数的方式.由于AWS保留了运行lambda函数的机器实例的细节,因此硬件难以模拟.因此,当涉及到模拟硬件时,您只需要保持在您的语言和操作系统的合理范围内 - 确保安装正确的运行时间(如同,请不要在安装时使用NodeJS 4.X) "使用版本6运行时",确保不超过存储要求(Lambda的AMI在/ tmp中获得500 MB的临时存储空间),并确保在运行之前不在本地保存任何状态码.

一旦确定了您的机器要求(或者决定传递它们,因为您的代码不执行任何特定于硬件的工作),那么您将需要编写一个测试工具来调用您的AWS Lambda函数.此测试工具充当调试器的入口点,尽管AWS调用Lambda的方式很可能不是100%准确(例如,该context参数包含有关当前Lambda调用的信息,这些调用本质上会因执行而异. ),它使您可以调用所有标准编码支持工具.

注意:为Node.JS编写以下简单测试工具,但您可以将概念调整为Lambda执行的运行时

AWS Lambda的简单测试工具(Node.js)

我们要做的第一件事是创建一个新文件 - debug.js - 并导入处理函数原型.假设您已经在handler.js中定义了处理程序并调用了它handler,那么您可以按如下方式执行:

var handler = require('./handler.js').handler;

接下来,我们需要调用处理函数.如上所述,每个参数都有不同的用途.处理程序的第一个参数event- 具有导致调用的事件的详细信息.注意:这还包括您的函数参数.正如我们所讨论的,第二个参数包含有关运行函数的上下文的信息.还有第三个参数,回调,可用于在Lambda执行完成后调用回调.在此处查看AWS文档:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

因此,对于我们的目的,对于简单的测试工具,我们只需要在参数中发送event参数.我们暂时保留contextcallback参数(稍作修改,下面更多),但如果你想提供额外的数据,你的函数依赖于那就好 - 只要确保它不与任何一个冲突自动数据放在AWS中.所以我们定义参数hash,并使用以下代码调用该函数debug.js:

var parameters = {
    "key1":"val1",
    "object" :{},
    // other keys as necessary
};

handler(parameters, {succeed:function(result){
    console.log("success: ", JSON.stringify(result, null, 2));
    process.exit(0);
}, fail:function(error){
    console.error("error: ", error);
    process.exit(1);
}});
Run Code Online (Sandbox Code Playgroud)

这段代码做了一些有趣的事情:

  • 它使用成功和失败处理程序重载上下文对象.您可以将它们包装在"if"语句中,并使用context.succeed(message)或在您的Lambda代码中调用它们context.fail(error).这些不是Lambda正式支持的,而是在我们的代码中用作变通方法来访问成功/失败行为
    • 处理程序使用适当的错误代码调用process.exit().这允许您将执行链接到CI/CD工具或使用进程退出代码作为控制流的任何其他批处理工具

一旦你编写了这个简单的测试工具,并调整了你的Lambda代码来调用成功/失败处理程序(如果它们已经if(context.success){context.success(args);}足够简单),你现在可以调用lambda函数node debug.js并查看结果.安慰.

我在Lambda函数中进行单元测试也很幸运.由于您现在有一个入口点,以及如何调用Lambda函数的示例,您应该能够编写表达所有功能的合适的单元和函数测试.

关于缺点的快速说明

正如我所提到的,这种方法并不完美.以下是可能出现的测试工具的一些问题:

  • 我们还没有对上下文对象进行任何仿真.您可以在http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html上查看上下文对象中可用的参数- 您需要进行一些试验和错误确切地知道这些参数中的格式是什么
  • 我们还没有进行任何机器仿真,以捕获硬件问题
  • 我们这里只介绍了Node.js函数,其他语言可能无法适应回调方法
  • 我们重载了上下文机制以提供成功 - 失败处理程序.如果AWS将类似命名的成员对象添加到context对象,则此方法可能会遇到问题

但是,尽管如此,您现在应该能够使用本地调试工具来测试和调试Lambda函数.我们在Backand使用类似的框架 - https://www.backand.com - 用于我们的Lambda函数开发工具,它大大提高了我们的Lambda开发速度.


Pra*_*aya 3

您无法像在 VS 中那样调试 lambda 代码,但您可以调用一些测试数据并检查一切是否正常。

  1. 您可以使用lambda-localserverless-offline在计算机中本地运行 lambda
  2. 因此,使用一些测试事件和数据调用您的 lambda,您可以记录并查看不同输入发生的情况