当我需要 aws-sdk 模块时 AWS Lambda 函数超时

AWS Lambda function times out when I require aws-sdk module

我正在尝试从 Lambda 函数(针对 Alexa 技能)查询 DynamoDB table,但是当我发送调用 require('aws-sdk') 的意图时,该技能似乎挂起并超时. Alexa 测试页面只显示 "There was a problem with the requested skill's response",我在 CloudWatch 日志中没有看到任何错误。我设置了捕获任何错误的技能,并将它们作为口头响应 return,所以我确信这不是未捕获的异常。我也试过将 require 包装在 try/catch 块中,但这也没有用。

如果收到测试数据库意图请求,这是加载 require 的模块:

const AWS = require('aws-sdk');

module.exports = () => {
  return 'Success!';
};

如果我注释掉 require('aws-sdk'),该函数将正常工作并且 Alexa 会响应 "Success"。

当我所做的一切都需要 aws-sdk 模块时,为什么我的技能会失效?

我是 AWS 的新手,这是我第一次尝试在 Lambda 函数中访问 DynamoDB table。

Lambda 函数以包含我的源代码 package.json(包括 aws-sdk 作为依赖项)和 node_modules 文件夹的 zip 文件上传。

Lambda 在使用 NodeJS 时使用回调延续模型。您的模块应该导出一个带有三个参数的函数:事件、上下文和回调。

Event提供输入参数。

另外两个用于 return 从您的处理程序函数进行控制,具体取决于您使用的 NodeJS 版本。

尝试添加我提到的三个参数,然后从导出的处理程序函数中调用:

module.export = function(event, context, callback) {
   callback(‘success’);
}

请记住,我是在移动设备上写的,所以您可能需要对代码进行小幅调整,但思路是一样的。不要直接从函数 return ,而是调用回调以提供响应作为延续。请注意,在 NodeJS 的早期版本中,在版本 4 之前,您必须使用上下文来设置成功或失败,而不是调用回调。

有关更多详细信息,请参阅 AWS 上的 Lambda with NodeJS 技术文档。

要记住的另一件事是,特别是对于 Alexa,响应应该采用正确的格式。这是一个 JSON 响应,其中包含 Alexa Skills Kit tech docs 中解释的所有必要元素。

您包含的 Alexa ASK SDK 会生成这些响应,但我想我应该向您指出实际的文档,以防您要尝试手动构建响应以了解其工作原理。

经过几个小时的调试,我发现将 import * as AWS from 'aws-sdk'; 更改为 import {DynamoDB} from 'aws-sdk';(或 {CloudFront} 或您实际使用的任何内容)可以使超时问题消失。请注意,实际连接到 DynamoDB 的时间对我来说从来都不是问题,它总是发生超时的 import 行。

这可以通过增加超时或分配给 lambda 函数的内存来解决。

这可能是因为默认超时值3秒和默认内存值128MB导致SDK太大无法导入。 这就是为什么如果您尝试导入较小的组件(例如仅 DynamoDB)它可能会起作用的原因。