【问题标题】:AWS Lambda function times out when I require aws-sdk module当我需要 aws-sdk 模块时,AWS Lambda 函数超时
【发布时间】:2018-09-29 04:12:21
【问题描述】:

我正在尝试从 Lambda 函数(针对 Alexa 技能)查询 DynamoDB 表,但是当我发送调用 require('aws-sdk') 的意图时,技能似乎挂起并超时。 Alexa 测试页面只是说“请求的技能响应有问题”,我在 CloudWatch 日志中看不到任何错误。我具备捕捉任何错误并将它们作为口头响应返回的技能,所以我确信这不是一个未捕获的异常。我也尝试将require 包装在try/catch 块中,但这也不起作用。

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

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

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

如果我注释掉require('aws-sdk'),该功能将正常工作,Alexa 会以“成功”响应。

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

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

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

【问题讨论】:

  • 从那以后您找到解决方案了吗?我遇到了完全相同的问题(即我的 Lambda 函数在尝试要求 aws-sdk 时超时,无论我为它设置了多大的超时时间;它不会总是发生,但经常发生成为一个问题)。
  • @DánielKis-Nagy 我能够修复它,但老实说我不记得我改变了什么。我仍在使用aws-sdk 模块。我确实记得 DynamoDB 引起了问题,因为初始连接有时需要很长时间,函数会超时。

标签: node.js amazon-web-services aws-lambda alexa-skills-kit


【解决方案1】:

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

【讨论】:

  • 谢谢。对于 NodeJS:const DynamoDB = require('aws-sdk/clients/dynamodb')
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    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 会生成这些响应,但我认为我应该将您指向实际文档,以防您尝试手动构建响应以了解其工作原理。

    【讨论】:

    • 我的技能代码设置正确。调用上面的函数并将结果作为callback(null, result) 传递。我刚刚进行了一些设置,以便我可以返回一个意图的字符串,并将其用作语音响应。
    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 2019-06-17
    • 2021-10-17
    • 2020-09-22
    • 2021-09-21
    • 2022-11-24
    • 2020-01-19
    相关资源
    最近更新 更多