默认情况下,许多 Lambda 函数不提供基于 IDE 的开发工具。有一些插件,例如 AWS 在其博客 https://aws.amazon.com/blogs/developer/aws-lambda-support-in-visual-studio/ 上介绍的 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 - 包含导致调用的事件的详细信息。 注意:这也包括你的函数参数。正如我们所讨论的,第二个参数包含有关您的函数运行的上下文的信息。还有第三个参数 callback,可用于在您的 Lambda 执行完成时调用回调。在此处查看 AWS 文档:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
因此,为了我们的目的,对于一个简单的测试工具,我们只需要通过 event 参数发送参数。我们暂时不考虑 context 和 callback 参数(稍作修改,下面会详细介绍),但是如果您想在此处提供函数所依赖的额外数据,那很好 - 只需确保它没有不会与放置在 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);
}});
这段代码做了一些有趣的事情:
- 它使用成功和失败处理程序重载上下文对象。您可以将它们包装在“if”语句中,并使用
context.succeed(message) 或context.fail(error) 在您的Lambda 代码中调用它们。这些不是 Lambda 官方支持的,而是在我们的代码中用作解决方法来访问成功/失败行为
- 处理程序使用适当的错误代码调用 process.exit()。这允许您将执行链接到 CI/CD 工具或任何其他使用进程退出代码作为控制流的批处理工具中
一旦您编写了这个简单的测试工具,并调整了您的 Lambda 代码以调用成功/失败处理程序(如果存在)(像 if(context.success){context.success(args);} 这样简单的处理程序就足够了),您现在可以使用以下方法调用 lambda 函数node debug.js 并在控制台中查看结果。
我的 Lambda 函数中的单元测试也很幸运。由于您现在有了一个入口点以及如何调用 Lambda 函数的示例,您应该能够编写合适的单元和函数测试来表达您的所有功能。
关于缺点的简要说明
正如我所提到的,这种方法并不完美。以下是测试工具可能出现的一些问题:
但是,尽管如此,您现在应该能够使用本地调试工具来测试和调试您的 Lambda 函数。我们在 Backand 使用了类似的框架 - https://www.backand.com - 作为我们的 Lambda 函数开发工具,它极大地提高了我们的 Lambda 开发速度。