首页 文章

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

提问于
浏览
3

我正在尝试从Lambda函数(对于Alexa技能)查询DynamoDB表,但是当我发送调用 require('aws-sdk') 的intent时,该技能似乎挂起并超时 . Alexa测试页面只是说"There was a problem with the requested skill's response",我确定's not an uncaught exception. I'也试图在 try/catch 块中包装 require ,但这也不起作用 .

如果收到测试数据库意图请求,则此模块将加载 require

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

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

如果我注释 require('aws-sdk') ,则该功能正常工作,Alexa以"Success"响应 .

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

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

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

2 回答

  • 1

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

  • 0

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

    Event 提供输入参数 .

    另外两个用于从处理程序函数返回控制,具体取决于您使用的NodeJS版本 .

    尝试添加我提到的三个参数,并在导出的处理函数中调用:

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

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

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

    另外要记住的是,对Alexa而言,响应应采用正确的格式 . 这是一个JSON响应,包含所有必要的元素,如Alexa Skills Kit tech docs中所述 .

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

相关问题