当我需要 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)它可能会起作用的原因。
我正在尝试从 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)它可能会起作用的原因。