gpt4 book ai didi

node.js - 如何调试用Node JS编写的AWS Lambda函数

转载 作者:搜寻专家 更新时间:2023-10-31 22:22:02 29 4
gpt4 key购买 nike

几个月来,我们一直在Node JS中开发AWS Lambda函数。我们是否可以像在Visual Studio中使用.Net C#代码那样调试,即逐步完成Node JS代码?

最佳答案

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

为了使用逐步调试来测试Lambda,您需要专注于两个领域-运行Lambda的硬件以及调用Lambda函数的方式。由于AWS会将运行lambda函数的机器实例的详细信息保密,因此硬件在仿真方面具有挑战性。因此,在仿真硬件时,您只需要保持适用于您的语言和操作系统的范围即可-确保安装了正确的运行时(例如,在安装时不要安装NodeJS4.X。 (使用版本6运行时),请确保您没有超出存储要求(Lambda的AMI在/tmp中获得500 MB的临时存储空间),并确保在运行之前没有在本地保存任何状态代码。

一旦确定了机器要求(或由于代码未执行任何特定于硬件的工作而决定通过这些要求),则需要编写测试工具来调用您的AWS Lambda函数。该测试工具充当调试器的入口点,尽管就AWS调用Lambda的方式而言,它很有可能不是100%准确(例如,context参数包含有关您当前的Lambda调用的信息,但在不同情况下,该信息会有所不同)。执行),您可以调用所有标准的编码支持工具。

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

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

我们要做的第一件事是创建一个新文件-debug.js-并导入处理程序函数原型(prototype)。假设您已在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中存放的任何自动化数据。因此,我们使用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);
}});

这段代码做了一些有趣的事情:
  • 它使用成功和失败处理程序重载上下文对象。您可以将它们包装在“if”语句中,然后使用context.succeed(message)context.fail(error)在Lambda代码中调用它们。 Lambda并未正式支持这些功能,而是在我们的代码中将其用作解决方法,以获取对成功/失败行为的访问权限
  • 处理程序使用适当的错误代码调用process.exit()。这使您可以将执行链接到CI/CD工具或使用流程退出代码作为控制流
  • 的任何其他批处理工具

    编写了此简单的测试工具,并修改了Lambda代码以调用成功/失败处理程序(如果存在的话)(像 if(context.success){context.success(args);}这样简单的操作就足够了),现在可以使用 node debug.js调用lambda函数并查看结果在控制台中。

    我在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开发速度。

    关于node.js - 如何调试用Node JS编写的AWS Lambda函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403523/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com