【问题标题】:Task timed out after 3.00 seconds - Lambda application with nodeJS3.00 秒后任务超时 - 带有 nodeJS 的 Lambda 应用程序
【发布时间】:2018-02-26 05:08:16
【问题描述】:

我正在尝试将硬编码的数据项放入 DynamoDB。我正在使用 AWS 开发工具包对象来执行此更新。下面代码中的所有调试“Console.log”都被打印出来,但最终它打印出Task timed out after 3.00 seconds

DynamoDB 没有更新

function updatedb(intent, session, callback) {
    let country;
     const repromptText = null;
     const sessionAttributes = {};
     let shouldEndSession = false;

console.log("In the function");
const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' });

var params = {
    TableName: "Location",
    Item: {
        "LocationID": { "S": "11" },
        "Country": { "S": "10" },
        "Description": { "S": "10" },
        "Name": { "S": "10" }
    }
};
console.log("Param loaded & executing the DocClient Put");

docClient.put(params, function (err, data) {
    if (err) {
        speechOutput = 'Update failed';
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
        callback(sessionAttributes,
            buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
        speechOutput = 'Update successful';
        callback(sessionAttributes,
            buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession));
    }
});
}

以下项目已检查

1) DynamoDB 中有一个名为“Location”的表 2) DynamoDB 和这个 lambda 函数都在 ue-west-1(爱尔兰) 3) 分配给这个 Lambda 函数的角色可以对这个表做所有的操作。请参阅下面的政策详情

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt1510603004000",
        "Effect": "Allow",
        "Action": [
            "dynamodb:*"
        ],
        "Resource": [
            "arn:aws:dynamodb:eu-west-1:752546663632:table/Location"
        ]
    }
]
}

我的 Lambda 函数如何仅使用区域定位表“位置”?- 代码似乎没有端点等? - 只是根据教程开发的。

这是我想念的吗?

你能帮忙吗?

【问题讨论】:

  • 你的 lambda 函数是否设置了超时时间?
  • No Matt - 我认为 3 秒是默认超时
  • 您可以使用 CLI 放置项目吗?你试过吗?
  • 我创建了一个 API 网关,并且成功上传了 Json 并在 DynamoDB 中创建了一个示例记录。我没有尝试使用 CLI,之前从未使用过 CLI,我使用的是 VS 2017。如果您认为这会有所帮助,我可以尝试获取有关 CLI 的信息。

标签: amazon-dynamodb aws-lambda aws-sdk-nodejs


【解决方案1】:

我遇到了类似的问题,请尝试将 require 语句放在函数的开头。

const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' });

【讨论】:

  • 你的意思是之前你的功能?
  • @tgf 是的,我的 node.js 代码以下面的代码开头, var aws = require('aws-sdk'); var ses = new aws.SES({ region: 'us-east-1' });
【解决方案2】:

我相信 AWS 会根据您的身份,结合区域和表名来定位表。

我能够使用此代码成功发布到表格:

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

const dynamoDB = new AWS.DynamoDB({region: 'us-west-2'});

var params = {
  TableName: "my-table",
  Item: {
    "LocationID": { S: "11" },
    "Country": { S: "10" },
    "Description": { S: "10" },
    "Name": { S: "10" }
  }
};

dynamoDB.putItem(params, (err, data) => {
  if (err){
    console.error(err.stack);
  } else {
    console.log(data);
  }
});

如果您实际上可以从 CLI 发布到表格,那么至少还有一个问题:您似乎错误地使用了 DocumentClient 类。您似乎将DynamoDB.putItem 的语法与DynamoDB.DocumentClient.put 的语法混为一谈。

如果您注意到,我的代码直接使用了DynamoDB 类——根据您正在做的事情,我认为您没有理由不能这样做。否则,您应该更改您的 Item 对象:

var params = {
  TableName: "my-table",
  Item: {
    "LocationID": "11",
    "Country": "10",
    "Description": "10",
    "Name": "10"
  }
};

我的猜测是您的代码当前出错,因为您试图在要插入字符串的位置插入地图。如果您配置了 Cloudwatch,则可以检查日志。

最后,我没有看到您在代码中使用callback。如果您的意图是响应调用 lambda 的客户,您应该这样做。根据您的 NodeJS 版本,lambda 可以简单地超时而不返回有用的响应。

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 2020-11-06
    • 2017-12-09
    • 2018-11-22
    • 2019-01-28
    • 2018-05-15
    • 2019-04-15
    • 2021-11-26
    • 2019-10-03
    相关资源
    最近更新 更多