代码之家  ›  专栏  ›  技术社区  ›  SimpleJ

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

  •  7
  • SimpleJ  · 技术社区  · 6 年前

    我试图从Lambda函数中查询DynamoDB表(对于Alexa技巧),但是当我发送调用 require('aws-sdk') ,技能似乎暂停和超时。Alexa测试页面只是说“请求的技能的响应有问题”,我在CloudWatch日志中没有看到任何错误。我有捕捉任何错误并以口头回应的方式返回的技能,所以我相信这不是一个意外的例外。我也尝试过包装 require 在a中 try/catch 阻止,但这也不起作用。

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

    const AWS = require('aws-sdk');
    
    module.exports = () => {
      return 'Success!';
    };
    

    如果我发表评论 需要('aws-sdk') ,功能正常工作,Alexa以“成功”回应。

    当我所做的只是需要 aws-sdk 单元

    我对AWS非常陌生,这是我第一次尝试在Lambda函数中访问DynamoDB表。

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

    3 回复  |  直到 5 年前
        1
  •  3
  •   Dániel Kis-Nagy    6 年前

    经过几个小时的调试,我发现 import * as AWS from 'aws-sdk'; import {DynamoDB} from 'aws-sdk'; (或 {CloudFront} 或者你实际使用的)使超时问题消失。请注意,实际连接DynamoDB的时间对我来说从来都不是问题,它始终是 import 发生超时的行。

        2
  •  2
  •   joe    5 年前

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

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

        3
  •  1
  •   Mike Dinescu    6 年前

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

    Event 提供输入参数。

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

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

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

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

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

    另一件需要记住的事情是,对于Alexa来说,响应应该采用正确的格式。这是一个JSON响应,包含所有必要的元素,如 Alexa Skills Kit tech docs

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